summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/JMXPin.h18
-rw-r--r--core/JMXPin.mm42
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