summaryrefslogtreecommitdiffstats
path: root/core/JMXPin.mm
diff options
context:
space:
mode:
authorxant <[email protected]>2012-03-11 16:39:37 (GMT)
committer xant <[email protected]>2012-03-11 16:39:37 (GMT)
commit46c68f948a617bfbc1e821a7d35646b99ce50fdf (patch)
tree7139b7d7763df5517792d653dec7bae22d07cae0 /core/JMXPin.mm
parented22fd9b31011ece4e85dd6d0c81cc86c301cd58 (diff)
optimized data-reading
Diffstat (limited to 'core/JMXPin.mm')
-rw-r--r--core/JMXPin.mm42
1 files changed, 29 insertions, 13 deletions
diff --git a/core/JMXPin.mm b/core/JMXPin.mm
index 0bdbbfb..b2e6805 100644
--- a/core/JMXPin.mm
+++ b/core/JMXPin.mm
@@ -186,6 +186,19 @@ using namespace v8;
owner = pinOwner;
ownerSignal = [pinSignal copy];
ownerUserData = userData;
+ readMode = kJMXPinReadModeInternal;
+
+ // check if we should use a different read mode (depending on our owner capabilities)
+ if (owner) {
+ SEL signal = NSSelectorFromString(self.label);
+ if ([owner respondsToSelector:signal]) {
+ readMode = kJMXPinReadModeOwnerSelector;
+ readSignal = signal;
+ } else if ([owner conformsToProtocol:@protocol(JMXPinOwner)]) {
+ readMode = kJMXPinReadModeOwnerProtocol;
+ }
+ }
+
sendNotifications = YES;
memset(dataBuffer, 0, sizeof(dataBuffer));
allowedValues = pinValues ? [[NSMutableArray arrayWithArray:pinValues] retain] : nil;
@@ -488,33 +501,36 @@ using namespace v8;
{
// if we have an owner which conforms to the <JMXPinOwner> protocol
// we will send it a message to get the actual value
- id ret = nil;
+ id
+ ret = nil;
- if (owner) {
- SEL signal = NSSelectorFromString(self.label);
- if ([owner respondsToSelector:signal]) {
+ switch (readMode) {
+ case kJMXPinReadModeOwnerSelector:
if (self.type == kJMXBooleanPin) {
BOOL raw;
// edge case for boolean type
NSInvocation *invocation = [NSInvocation
- invocationWithMethodSignature:[owner methodSignatureForSelector:signal]];
+ invocationWithMethodSignature:[owner methodSignatureForSelector:readSignal]];
[invocation setTarget:owner];
- [invocation setSelector:signal];
+ [invocation setSelector:readSignal];
[invocation invokeWithTarget:owner];
[invocation getReturnValue:(void *)&raw];
ret = [NSNumber numberWithBool:raw];
} else {
- ret = [owner performSelector:signal];
+ ret = [owner performSelector:readSignal];
}
- } else if ([owner conformsToProtocol:@protocol(JMXPinOwner)]) {
+ break;
+ case kJMXPinReadModeOwnerProtocol:
ret = [owner provideDataToPin:self];
- }
+ break;
+ default:
+ break;
}
-
+
+ // failback always to kJMXPinReadModeInternal if we got no data in other ways
if (!ret) {
// otherwise we will return the last signaled data
- ret = [dataBuffer[offset&kJMXPinDataBufferMask] retain];
- [ret autorelease];
+ ret = [[dataBuffer[offset&kJMXPinDataBufferMask] retain] autorelease];
}
return ret;
}
@@ -580,7 +596,7 @@ using namespace v8;
OSAtomicIncrement32(&offset);
dataBuffer[currentOffset] = nil;
}
- [currentData release];
+ [currentData autorelease];
if (sender)
currentSender = sender;
else