fork.m   [plain text]


// TEST_CONFIG

#include "test.h"

void *flushthread(void *arg __unused)
{
    while (1) {
        _objc_flush_caches(nil);
    }
}

int main()
{
    pthread_t th;
    pthread_create(&th, nil, &flushthread, nil);

    alarm(120);
    
    [NSObject self];
    [NSObject self];

    int max = is_guardmalloc() ? 10: 100;
    
    for (int i = 0; i < max; i++) {
        pid_t child;
        switch ((child = fork())) {
          case -1:
            abort();
          case 0:
            // child
            alarm(10);
            [NSObject self];
            _exit(0);
          default: {
            // parent
            int result = 0;
            while (waitpid(child, &result, 0) < 0) {
                if (errno != EINTR) {
                    fail("waitpid failed (errno %d %s)", 
                         errno, strerror(errno));
                }
            }
            if (!WIFEXITED(result)) {
                fail("child crashed (waitpid result %d)", result);
            }

            [NSObject self];
            break;
          }
        }
    }

    succeed(__FILE__ " parent");
}