Blame src/ccapi/test/simple_lock_test.c

Packit fd8b60
/*
Packit fd8b60
    simple_lock_test.c
Packit fd8b60
Packit fd8b60
    Initializes two contexts in two different threads and tries to get read locks on both at the same time.
Packit fd8b60
    Hangs at line 24.
Packit fd8b60
*/
Packit fd8b60
#include <stdio.h>
Packit fd8b60
#include <stdarg.h>
Packit fd8b60
Packit fd8b60
#include "test_ccapi_log.h"
Packit fd8b60
Packit fd8b60
#if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
Packit fd8b60
#include <TargetConditionals.h>
Packit fd8b60
#endif
Packit fd8b60
Packit fd8b60
#ifdef TARGET_OS_MAC
Packit fd8b60
#include <stdlib.h>
Packit fd8b60
#include <pthread.h>
Packit fd8b60
#include <Kerberos/CredentialsCache.h>
Packit fd8b60
#else
Packit fd8b60
#include "CredentialsCache.h"
Packit fd8b60
#endif
Packit fd8b60
Packit fd8b60
Packit fd8b60
void *other_thread (void) {
Packit fd8b60
    cc_int32 err;
Packit fd8b60
    cc_context_t context = NULL;
Packit fd8b60
Packit fd8b60
    err = cc_initialize(&context, ccapi_version_7, NULL, NULL);
Packit fd8b60
Packit fd8b60
    log_error("thread: attempting lock. may hang. err == %d", err);
Packit fd8b60
Packit fd8b60
    if (!err) {
Packit fd8b60
        // hangs with cc_lock_read which should succeed immediately, but does not hang with write, upgrade, and downgrade, which fail immediately
Packit fd8b60
        err = cc_context_lock(context, cc_lock_read, cc_lock_noblock);
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    if (context) {
Packit fd8b60
        cc_context_unlock(context);
Packit fd8b60
        cc_context_release(context);
Packit fd8b60
        context = NULL;
Packit fd8b60
    }
Packit fd8b60
    log_error("thread: return. err == %d", err);
Packit fd8b60
}
Packit fd8b60
Packit fd8b60
Packit fd8b60
int main (int argc, char *argv[]) {
Packit fd8b60
    cc_int32        err;
Packit fd8b60
    int             status;
Packit fd8b60
    cc_context_t    context = NULL;
Packit fd8b60
Packit fd8b60
#ifdef TARGET_OS_MAC
Packit fd8b60
    pthread_t       thread_id;
Packit fd8b60
#endif
Packit fd8b60
Packit fd8b60
    err = cc_initialize(&context, ccapi_version_7, NULL, NULL);
Packit fd8b60
    if (!err) {
Packit fd8b60
        err = cc_context_lock(context, cc_lock_read, cc_lock_noblock);
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    log_error("main: initialized and read locked context. err == %d", err);
Packit fd8b60
Packit fd8b60
#ifdef TARGET_OS_MAC
Packit fd8b60
   status = pthread_create (&thread_id, NULL, (void *) other_thread, NULL);
Packit fd8b60
    if (status != 0) {
Packit fd8b60
        log_error("pthread_create() returned %d", status);
Packit fd8b60
        exit(-1);
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    pthread_join(thread_id, NULL);
Packit fd8b60
#else
Packit fd8b60
Packit fd8b60
#endif
Packit fd8b60
Packit fd8b60
    log_error("main: unlocking and releasing context. err == %d", err);
Packit fd8b60
Packit fd8b60
    if (context) {
Packit fd8b60
        log_error("main: calling cc_context_unlock");
Packit fd8b60
        cc_context_unlock(context);
Packit fd8b60
        log_error("main: calling cc_context_release");
Packit fd8b60
        cc_context_release(context);
Packit fd8b60
        context = NULL;
Packit fd8b60
    }
Packit fd8b60
Packit fd8b60
    log_error("main: return. err == %d", err);
Packit fd8b60
Packit fd8b60
#if defined(_WIN32)
Packit fd8b60
    UNREFERENCED_PARAMETER(status);       // no whining!
Packit fd8b60
#endif
Packit fd8b60
    return 0;
Packit fd8b60
}