diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/JMXPin.h | 18 | ||||
| -rw-r--r-- | core/JMXPin.mm | 42 |
2 files changed, 43 insertions, 17 deletions
diff --git a/core/JMXPin.h b/core/JMXPin.h index 0f959ef..4ccf115 100644 --- a/core/JMXPin.h +++ b/core/JMXPin.h @@ -105,6 +105,12 @@ typedef enum { // so for instance 00000111 is a good mask // while 00010111 is a wrong mask +typedef enum { + kJMXPinReadModeInternal, + kJMXPinReadModeOwnerProtocol, + kJMXPinReadModeOwnerSelector +} JMXPinReadMode; + /*! @class JMXPin @abstract abstract class for any pin type @@ -117,16 +123,13 @@ typedef enum { @protected JMXPinType type; NSString *label; + JMXPinDirection direction; NSMutableDictionary *properties; BOOL multiple; // default NO BOOL continuous; // default YES BOOL sendNotifications; // default YES id currentSender; BOOL connected; - id dataBuffer[kJMXPinDataBufferMask+1]; // double buffer synchronized for writers - // but lockless for readers - volatile int32_t offset; - JMXPinDirection direction; id minValue; id maxValue; id owner; @@ -135,6 +138,13 @@ typedef enum { NSMutableArray *allowedValues; NSXMLElement *connections; JMXPinMode mode; +@private + JMXPinReadMode readMode; + SEL readSignal; + id dataBuffer[kJMXPinDataBufferMask+1]; // double buffer synchronized for writers + // but lockless for readers + volatile int32_t offset; + } /*! 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 |

