diff options
| author | xant <[email protected]> | 2012-03-11 16:39:37 (GMT) |
|---|---|---|
| committer | xant <[email protected]> | 2012-03-11 16:39:37 (GMT) |
| commit | 46c68f948a617bfbc1e821a7d35646b99ce50fdf (patch) | |
| tree | 7139b7d7763df5517792d653dec7bae22d07cae0 /core/JMXPin.mm | |
| parent | ed22fd9b31011ece4e85dd6d0c81cc86c301cd58 (diff) | |
optimized data-reading
Diffstat (limited to 'core/JMXPin.mm')
| -rw-r--r-- | core/JMXPin.mm | 42 |
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 |

