|
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 |
}
|