target.c   [plain text]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <signal.h>
#include <unistd.h>
#include <mach/mach.h>
#include <dispatch/dispatch.h>

void performDylibOperations(void) {
    for (int i=0; i < 3; ++i) {
        void* h = dlopen(RUN_DIR "/libfoo.dylib", 0);
        dlclose(h);
    }
    fprintf(stderr, "Done (pid: %d)\n", getpid());
    exit(0);
}

int main(int argc, const char* argv[], const char* envp[], const char* apple[]) {
    signal(SIGUSR1, SIG_IGN);
    dispatch_source_t signalSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, getppid(),
                                                            DISPATCH_PROC_EXIT, dispatch_get_main_queue());
    dispatch_source_set_event_handler(signalSource, ^{
        exit(0);
    });
    dispatch_resume(signalSource);

    if ( (argc > 1) && (strcmp(argv[1], "suspend-in-main") == 0) ) {
        dispatch_source_t signalSourceSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL,
                                                                      SIGUSR1, 0, dispatch_get_main_queue());
        dispatch_source_set_event_handler(signalSourceSource, ^{
            performDylibOperations();
        });
        dispatch_resume(signalSourceSource);
        dispatch_async(dispatch_get_main_queue(), ^{
            fprintf(stderr, "Ready (pid: %d)\n", getpid());
        });
    } else {
        performDylibOperations();
    }

    dispatch_main();
}