Index: openssl/crypto/threads/mttest.c |
=================================================================== |
--- openssl/crypto/threads/mttest.c (revision 105093) |
+++ openssl/crypto/threads/mttest.c (working copy) |
@@ -117,11 +117,13 @@ |
void win32_locking_callback(int mode,int type,char *file,int line); |
void pthreads_locking_callback(int mode,int type,char *file,int line); |
void netware_locking_callback(int mode,int type,char *file,int line); |
+void beos_locking_callback(int mode,int type,const char *file,int line); |
unsigned long irix_thread_id(void ); |
unsigned long solaris_thread_id(void ); |
unsigned long pthreads_thread_id(void ); |
unsigned long netware_thread_id(void ); |
+unsigned long beos_thread_id(void ); |
#if defined(OPENSSL_SYS_NETWARE) |
static MPKMutex *lock_cs; |
@@ -1209,3 +1211,100 @@ |
return(ret); |
} |
#endif /* NETWARE */ |
+ |
+#ifdef BEOS_THREADS |
+ |
+#include <Locker.h> |
+ |
+static BLocker** lock_cs; |
+static long* lock_count; |
+ |
+void thread_setup(void) |
+ { |
+ int i; |
+ |
+ lock_cs=(BLocker**)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(BLocker*)); |
+ lock_count=(long*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); |
+ for (i=0; i<CRYPTO_num_locks(); i++) |
+ { |
+ lock_count[i]=0; |
+ lock_cs[i] = new BLocker(CRYPTO_get_lock_name(i)); |
+ } |
+ |
+ CRYPTO_set_id_callback((unsigned long (*)())beos_thread_id); |
+ CRYPTO_set_locking_callback(beos_locking_callback); |
+ } |
+ |
+void thread_cleanup(void) |
+ { |
+ int i; |
+ |
+ CRYPTO_set_locking_callback(NULL); |
+ fprintf(stderr,"cleanup\n"); |
+ for (i=0; i<CRYPTO_num_locks(); i++) |
+ { |
+ delete lock_cs[i]; |
+ fprintf(stderr,"%8ld:%s\n",lock_count[i], |
+ CRYPTO_get_lock_name(i)); |
+ } |
+ OPENSSL_free(lock_cs); |
+ OPENSSL_free(lock_count); |
+ |
+ fprintf(stderr,"done cleanup\n"); |
+ } |
+ |
+void beos_locking_callback(int mode, int type, const char *file, int line) |
+ { |
+#if 0 |
+ fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n", |
+ CRYPTO_thread_id(), |
+ (mode&CRYPTO_LOCK)?"l":"u", |
+ (type&CRYPTO_READ)?"r":"w",file,line); |
+#endif |
+ if (mode & CRYPTO_LOCK) |
+ { |
+ lock_cs[type]->Lock(); |
+ lock_count[type]++; |
+ } |
+ else |
+ { |
+ lock_cs[type]->Unlock(); |
+ } |
+ } |
+ |
+void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx) |
+ { |
+ SSL_CTX *ssl_ctx[2]; |
+ thread_id thread_ctx[MAX_THREAD_NUMBER]; |
+ int i; |
+ |
+ ssl_ctx[0]=s_ctx; |
+ ssl_ctx[1]=c_ctx; |
+ |
+ for (i=0; i<thread_number; i++) |
+ { |
+ thread_ctx[i] = spawn_thread((thread_func)ndoit, |
+ NULL, B_NORMAL_PRIORITY, (void *)ssl_ctx); |
+ resume_thread(thread_ctx[i]); |
+ } |
+ |
+ printf("waiting...\n"); |
+ for (i=0; i<thread_number; i++) |
+ { |
+ status_t result; |
+ wait_for_thread(thread_ctx[i], &result); |
+ } |
+ |
+ printf("beos threads done (%d,%d)\n", |
+ s_ctx->references,c_ctx->references); |
+ } |
+ |
+unsigned long beos_thread_id(void) |
+ { |
+ unsigned long ret; |
+ |
+ ret=(unsigned long)find_thread(NULL); |
+ return(ret); |
+ } |
+ |
+#endif /* BEOS_THREADS */ |