From 938d06268877e85c711ee8adb4c38673d61ee67e Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sun, 8 Nov 2015 20:44:13 -0800 Subject: [PATCH] Use CoreFoundation in Handler to #ifdef __APPLE__. --- Handler.mm => Handler.cpp | 78 ++++++++++++++++++++++++--------------- Makefile.am | 2 +- Makefile.in | 4 +- 3 files changed, 51 insertions(+), 33 deletions(-) rename Handler.mm => Handler.cpp (77%) diff --git a/Handler.mm b/Handler.cpp similarity index 77% rename from Handler.mm rename to Handler.cpp index bbda7df..2ceb1fa 100644 --- a/Handler.mm +++ b/Handler.cpp @@ -19,7 +19,6 @@ **/ /* }}} */ -#include #include #include #include @@ -31,6 +30,10 @@ #include #include +#ifdef __APPLE__ +#include +#endif + #include "cycript.hpp" #include "JavaScript.hpp" @@ -43,26 +46,21 @@ struct CYExecute_ { CYPool &pool_; const char * volatile data_; + pthread_mutex_t mutex_; + pthread_cond_t condition_; }; -// XXX: this is "tre lame" -@interface CYClient_ : NSObject { -} - -- (void) execute:(NSValue *)value; +void CYPerform(void *arg) { + CYExecute_ *execute(reinterpret_cast(arg)); -@end - -@implementation CYClient_ - -- (void) execute:(NSValue *)value { - CYExecute_ *execute(reinterpret_cast([value pointerValue])); const char *data(execute->data_); execute->data_ = NULL; execute->data_ = CYExecute(CYGetJSContext(), execute->pool_, CYUTF8String(data)); -} -@end + pthread_mutex_lock(&execute->mutex_); + pthread_cond_signal(&execute->condition_); + pthread_mutex_unlock(&execute->mutex_); +} struct CYClient : CYData @@ -80,15 +78,14 @@ struct CYClient : } void Handle() { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - CYClient_ *client = [[[CYClient_ alloc] init] autorelease]; - bool dispatch; - if (CFStringRef mode = CFRunLoopCopyCurrentMode(CFRunLoopGetMain())) { +#ifdef __APPLE__ + CFRunLoopRef loop(CFRunLoopGetMain()); + if (CFStringRef mode = CFRunLoopCopyCurrentMode(loop)) { dispatch = true; CFRelease(mode); } else +#endif dispatch = false; for (;;) { @@ -102,29 +99,50 @@ struct CYClient : return; data[size] = '\0'; - NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init]; - std::string code(data, size); CYExecute_ execute = {pool, code.c_str()}; - NSValue *value([NSValue valueWithPointer:&execute]); - if (dispatch) - [client performSelectorOnMainThread:@selector(execute:) withObject:value waitUntilDone:YES]; - else - [client execute:value]; + + pthread_mutex_init(&execute.mutex_, NULL); + pthread_cond_init(&execute.condition_, NULL); + + if (!dispatch) + CYPerform(&execute); +#ifdef __APPLE__ + else { + CFRunLoopSourceContext context; + memset(&context, 0, sizeof(context)); + context.version = 0; + context.info = &execute; + context.perform = &CYPerform; + + CFRunLoopSourceRef source(CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context)); + + pthread_mutex_lock(&execute.mutex_); + + CFRunLoopAddSource(loop, source, kCFRunLoopCommonModes); + CFRunLoopSourceSignal(source); + + CFRunLoopWakeUp(loop); + pthread_cond_wait(&execute.condition_, &execute.mutex_); + pthread_mutex_unlock(&execute.mutex_); + + CFRunLoopRemoveSource(loop, source, kCFRunLoopCommonModes); + CFRelease(source); + } +#endif + + pthread_cond_destroy(&execute.condition_); + pthread_mutex_destroy(&execute.mutex_); const char *json(execute.data_); size = json == NULL ? _not(uint32_t) : strlen(json); - [ar release]; - if (!CYSendAll(socket_, &size, sizeof(size))) return; if (json != NULL) if (!CYSendAll(socket_, json, size)) return; } - - [pool release]; } }; diff --git a/Makefile.am b/Makefile.am index 56a0518..9a4f5d6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -82,7 +82,7 @@ libcycript_la_LIBADD += $(LTOBJECTIVEC) endif if CY_MACH -libcycript_la_SOURCES += Handler.mm +libcycript_la_SOURCES += Handler.cpp if CY_CONSOLE cycript_SOURCES += Mach/Inject.cpp diff --git a/Makefile.in b/Makefile.in index dc06265..3a82c91 100644 --- a/Makefile.in +++ b/Makefile.in @@ -112,7 +112,7 @@ host_triplet = @host@ @CY_OBJECTIVEC_TRUE@am__append_9 = ObjectiveC @CY_OBJECTIVEC_TRUE@am__append_10 = ObjectiveC/Output.cpp ObjectiveC/Replace.cpp ObjectiveC/Library.mm @CY_OBJECTIVEC_TRUE@am__append_11 = $(LTOBJECTIVEC) -@CY_MACH_TRUE@am__append_12 = Handler.mm +@CY_MACH_TRUE@am__append_12 = Handler.cpp @CY_CONSOLE_TRUE@@CY_MACH_TRUE@am__append_13 = Mach/Inject.cpp @CY_CONSOLE_TRUE@@CY_MACH_TRUE@am__append_14 = -DCY_ATTACH subdir = . @@ -176,7 +176,7 @@ am__libcycript_la_SOURCES_DIST = ConvertUTF.c Decode.cpp Driver.cpp \ Replace.cpp Cycript.tab.cc lex.cy.cpp sig/ffi_type.cpp \ sig/parse.cpp sig/copy.cpp Bridge.cpp Execute.cpp \ JavaScriptCore.cpp Java/Execute.cpp ObjectiveC/Output.cpp \ - ObjectiveC/Replace.cpp ObjectiveC/Library.mm Handler.mm + ObjectiveC/Replace.cpp ObjectiveC/Library.mm Handler.cpp am__dirstamp = $(am__leading_dot)dirstamp @CY_EXECUTE_TRUE@am__objects_1 = sig/ffi_type.lo sig/parse.lo \ @CY_EXECUTE_TRUE@ sig/copy.lo Bridge.lo Execute.lo \ -- 2.49.0