diff options
Diffstat (limited to 'src/lib/libcrypto/threads')
-rw-r--r-- | src/lib/libcrypto/threads/README | 14 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/mttest.c | 122 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/profile.sh | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/ptest.bat | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/pthread.sh | 9 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/pthread2.sh | 7 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/pthreads-vms.com | 9 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/purify.sh | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/solaris.sh | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/th-lock.c | 55 | ||||
-rw-r--r-- | src/lib/libcrypto/threads/win32.bat | 4 |
11 files changed, 176 insertions, 60 deletions
diff --git a/src/lib/libcrypto/threads/README b/src/lib/libcrypto/threads/README new file mode 100644 index 0000000000..df6b26e146 --- /dev/null +++ b/src/lib/libcrypto/threads/README | |||
@@ -0,0 +1,14 @@ | |||
1 | Mutithreading testing area. | ||
2 | |||
3 | Since this stuff is very very platorm specific, this is not part of the | ||
4 | normal build. Have a read of doc/threads.doc. | ||
5 | |||
6 | mttest will do some testing and will currently build under Windows NT/95, | ||
7 | Solaris and Linux. The IRIX stuff is not finished. | ||
8 | |||
9 | I have tested this program on a 12 CPU ultra sparc box (solaris 2.5.1) | ||
10 | and things seem to work ok. | ||
11 | |||
12 | The Linux pthreads package can be retrieved from | ||
13 | http://www.mit.edu:8001/people/proven/pthreads.html | ||
14 | |||
diff --git a/src/lib/libcrypto/threads/mttest.c b/src/lib/libcrypto/threads/mttest.c index 142623edda..24713a3157 100644 --- a/src/lib/libcrypto/threads/mttest.c +++ b/src/lib/libcrypto/threads/mttest.c | |||
@@ -74,26 +74,29 @@ | |||
74 | #include <ulocks.h> | 74 | #include <ulocks.h> |
75 | #include <sys/prctl.h> | 75 | #include <sys/prctl.h> |
76 | #endif | 76 | #endif |
77 | #ifdef PTHREADS | ||
78 | #include <pthread.h> | ||
79 | #endif | ||
77 | #include <openssl/lhash.h> | 80 | #include <openssl/lhash.h> |
78 | #include <openssl/crypto.h> | 81 | #include <openssl/crypto.h> |
79 | #include <openssl/buffer.h> | 82 | #include <openssl/buffer.h> |
80 | #include "../e_os.h" | 83 | #include "../../e_os.h" |
81 | #include <openssl/x509.h> | 84 | #include <openssl/x509.h> |
82 | #include <openssl/ssl.h> | 85 | #include <openssl/ssl.h> |
83 | #include <openssl/err.h> | 86 | #include <openssl/err.h> |
87 | #include <openssl/rand.h> | ||
84 | 88 | ||
85 | #ifdef NO_FP_API | 89 | #ifdef NO_FP_API |
86 | #define APPS_WIN16 | 90 | #define APPS_WIN16 |
87 | #include "../crypto/buffer/bss_file.c" | 91 | #include "../buffer/bss_file.c" |
88 | #endif | 92 | #endif |
89 | 93 | ||
90 | #define TEST_SERVER_CERT "../apps/server.pem" | 94 | #define TEST_SERVER_CERT "../../apps/server.pem" |
91 | #define TEST_CLIENT_CERT "../apps/client.pem" | 95 | #define TEST_CLIENT_CERT "../../apps/client.pem" |
92 | 96 | ||
93 | #define MAX_THREAD_NUMBER 100 | 97 | #define MAX_THREAD_NUMBER 100 |
94 | 98 | ||
95 | int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth, | 99 | int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *xs); |
96 | int error,char *arg); | ||
97 | void thread_setup(void); | 100 | void thread_setup(void); |
98 | void thread_cleanup(void); | 101 | void thread_cleanup(void); |
99 | void do_threads(SSL_CTX *s_ctx,SSL_CTX *c_ctx); | 102 | void do_threads(SSL_CTX *s_ctx,SSL_CTX *c_ctx); |
@@ -121,6 +124,8 @@ int number_of_loops=10; | |||
121 | int reconnect=0; | 124 | int reconnect=0; |
122 | int cache_stats=0; | 125 | int cache_stats=0; |
123 | 126 | ||
127 | static const char rnd_seed[] = "string to make the random number generator think it has entropy"; | ||
128 | |||
124 | int doit(char *ctx[4]); | 129 | int doit(char *ctx[4]); |
125 | static void print_stats(FILE *fp, SSL_CTX *ctx) | 130 | static void print_stats(FILE *fp, SSL_CTX *ctx) |
126 | { | 131 | { |
@@ -170,6 +175,8 @@ int main(int argc, char *argv[]) | |||
170 | char *ccert=TEST_CLIENT_CERT; | 175 | char *ccert=TEST_CLIENT_CERT; |
171 | SSL_METHOD *ssl_method=SSLv23_method(); | 176 | SSL_METHOD *ssl_method=SSLv23_method(); |
172 | 177 | ||
178 | RAND_seed(rnd_seed, sizeof rnd_seed); | ||
179 | |||
173 | if (bio_err == NULL) | 180 | if (bio_err == NULL) |
174 | bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); | 181 | bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); |
175 | if (bio_stdout == NULL) | 182 | if (bio_stdout == NULL) |
@@ -244,7 +251,7 @@ bad: | |||
244 | if (cipher == NULL) cipher=getenv("SSL_CIPHER"); | 251 | if (cipher == NULL) cipher=getenv("SSL_CIPHER"); |
245 | 252 | ||
246 | SSL_load_error_strings(); | 253 | SSL_load_error_strings(); |
247 | SSLeay_add_ssl_algorithms(); | 254 | OpenSSL_add_ssl_algorithms(); |
248 | 255 | ||
249 | c_ctx=SSL_CTX_new(ssl_method); | 256 | c_ctx=SSL_CTX_new(ssl_method); |
250 | s_ctx=SSL_CTX_new(ssl_method); | 257 | s_ctx=SSL_CTX_new(ssl_method); |
@@ -259,8 +266,15 @@ bad: | |||
259 | SSL_CTX_set_session_cache_mode(c_ctx, | 266 | SSL_CTX_set_session_cache_mode(c_ctx, |
260 | SSL_SESS_CACHE_NO_AUTO_CLEAR|SSL_SESS_CACHE_SERVER); | 267 | SSL_SESS_CACHE_NO_AUTO_CLEAR|SSL_SESS_CACHE_SERVER); |
261 | 268 | ||
262 | SSL_CTX_use_certificate_file(s_ctx,scert,SSL_FILETYPE_PEM); | 269 | if (!SSL_CTX_use_certificate_file(s_ctx,scert,SSL_FILETYPE_PEM)) |
263 | SSL_CTX_use_RSAPrivateKey_file(s_ctx,scert,SSL_FILETYPE_PEM); | 270 | { |
271 | ERR_print_errors(bio_err); | ||
272 | } | ||
273 | else if (!SSL_CTX_use_RSAPrivateKey_file(s_ctx,scert,SSL_FILETYPE_PEM)) | ||
274 | { | ||
275 | ERR_print_errors(bio_err); | ||
276 | goto end; | ||
277 | } | ||
264 | 278 | ||
265 | if (client_auth) | 279 | if (client_auth) |
266 | { | 280 | { |
@@ -489,6 +503,7 @@ int doit(char *ctx[4]) | |||
489 | else | 503 | else |
490 | { | 504 | { |
491 | fprintf(stderr,"ERROR in CLIENT\n"); | 505 | fprintf(stderr,"ERROR in CLIENT\n"); |
506 | ERR_print_errors_fp(stderr); | ||
492 | return(1); | 507 | return(1); |
493 | } | 508 | } |
494 | } | 509 | } |
@@ -520,6 +535,7 @@ int doit(char *ctx[4]) | |||
520 | else | 535 | else |
521 | { | 536 | { |
522 | fprintf(stderr,"ERROR in CLIENT\n"); | 537 | fprintf(stderr,"ERROR in CLIENT\n"); |
538 | ERR_print_errors_fp(stderr); | ||
523 | return(1); | 539 | return(1); |
524 | } | 540 | } |
525 | } | 541 | } |
@@ -652,18 +668,23 @@ err: | |||
652 | return(0); | 668 | return(0); |
653 | } | 669 | } |
654 | 670 | ||
655 | int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth, | 671 | int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx) |
656 | int error, char *arg) | ||
657 | { | 672 | { |
658 | char buf[256]; | 673 | char *s, buf[256]; |
659 | 674 | ||
660 | if (verbose) | 675 | if (verbose) |
661 | { | 676 | { |
662 | X509_NAME_oneline(X509_get_subject_name(xs),buf,256); | 677 | s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert), |
663 | if (ok) | 678 | buf,256); |
664 | fprintf(stderr,"depth=%d %s\n",depth,buf); | 679 | if (s != NULL) |
665 | else | 680 | { |
666 | fprintf(stderr,"depth=%d error=%d %s\n",depth,error,buf); | 681 | if (ok) |
682 | fprintf(stderr,"depth=%d %s\n", | ||
683 | ctx->error_depth,buf); | ||
684 | else | ||
685 | fprintf(stderr,"depth=%d error=%d %s\n", | ||
686 | ctx->error_depth,ctx->error,buf); | ||
687 | } | ||
667 | } | 688 | } |
668 | return(ok); | 689 | return(ok); |
669 | } | 690 | } |
@@ -672,13 +693,14 @@ int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth, | |||
672 | 693 | ||
673 | #ifdef WIN32 | 694 | #ifdef WIN32 |
674 | 695 | ||
675 | static HANDLE lock_cs[CRYPTO_NUM_LOCKS]; | 696 | static HANDLE *lock_cs; |
676 | 697 | ||
677 | void thread_setup(void) | 698 | void thread_setup(void) |
678 | { | 699 | { |
679 | int i; | 700 | int i; |
680 | 701 | ||
681 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 702 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE)); |
703 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
682 | { | 704 | { |
683 | lock_cs[i]=CreateMutex(NULL,FALSE,NULL); | 705 | lock_cs[i]=CreateMutex(NULL,FALSE,NULL); |
684 | } | 706 | } |
@@ -692,8 +714,9 @@ void thread_cleanup(void) | |||
692 | int i; | 714 | int i; |
693 | 715 | ||
694 | CRYPTO_set_locking_callback(NULL); | 716 | CRYPTO_set_locking_callback(NULL); |
695 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 717 | for (i=0; i<CRYPTO_num_locks(); i++) |
696 | CloseHandle(lock_cs[i]); | 718 | CloseHandle(lock_cs[i]); |
719 | Free(lock_cs); | ||
697 | } | 720 | } |
698 | 721 | ||
699 | void win32_locking_callback(int mode, int type, char *file, int line) | 722 | void win32_locking_callback(int mode, int type, char *file, int line) |
@@ -763,15 +786,17 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx) | |||
763 | 786 | ||
764 | #ifdef SOLARIS | 787 | #ifdef SOLARIS |
765 | 788 | ||
766 | static mutex_t lock_cs[CRYPTO_NUM_LOCKS]; | 789 | static mutex_t *lock_cs; |
767 | /*static rwlock_t lock_cs[CRYPTO_NUM_LOCKS]; */ | 790 | /*static rwlock_t *lock_cs; */ |
768 | static long lock_count[CRYPTO_NUM_LOCKS]; | 791 | static long *lock_count; |
769 | 792 | ||
770 | void thread_setup(void) | 793 | void thread_setup(void) |
771 | { | 794 | { |
772 | int i; | 795 | int i; |
773 | 796 | ||
774 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 797 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t)); |
798 | lock_count=Malloc(CRYPTO_num_locks() * sizeof(long)); | ||
799 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
775 | { | 800 | { |
776 | lock_count[i]=0; | 801 | lock_count[i]=0; |
777 | /* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */ | 802 | /* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */ |
@@ -787,31 +812,37 @@ void thread_cleanup(void) | |||
787 | int i; | 812 | int i; |
788 | 813 | ||
789 | CRYPTO_set_locking_callback(NULL); | 814 | CRYPTO_set_locking_callback(NULL); |
790 | fprintf(stderr,"cleanup\n"); | 815 | |
791 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 816 | fprintf(stderr,"cleanup\n"); |
817 | |||
818 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
792 | { | 819 | { |
793 | /* rwlock_destroy(&(lock_cs[i])); */ | 820 | /* rwlock_destroy(&(lock_cs[i])); */ |
794 | mutex_destroy(&(lock_cs[i])); | 821 | mutex_destroy(&(lock_cs[i])); |
795 | fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i)); | 822 | fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i)); |
796 | } | 823 | } |
797 | fprintf(stderr,"done cleanup\n"); | 824 | Free(lock_cs); |
825 | Free(lock_count); | ||
826 | |||
827 | fprintf(stderr,"done cleanup\n"); | ||
828 | |||
798 | } | 829 | } |
799 | 830 | ||
800 | void solaris_locking_callback(int mode, int type, char *file, int line) | 831 | void solaris_locking_callback(int mode, int type, char *file, int line) |
801 | { | 832 | { |
802 | #ifdef undef | 833 | #ifdef undef |
803 | fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n", | 834 | fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n", |
804 | CRYPTO_thread_id(), | 835 | CRYPTO_thread_id(), |
805 | (mode&CRYPTO_LOCK)?"l":"u", | 836 | (mode&CRYPTO_LOCK)?"l":"u", |
806 | (type&CRYPTO_READ)?"r":"w",file,line); | 837 | (type&CRYPTO_READ)?"r":"w",file,line); |
807 | #endif | 838 | #endif |
808 | 839 | ||
809 | /* | 840 | /* |
810 | if (CRYPTO_LOCK_SSL_CERT == type) | 841 | if (CRYPTO_LOCK_SSL_CERT == type) |
811 | fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n", | 842 | fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n", |
812 | CRYPTO_thread_id(), | 843 | CRYPTO_thread_id(), |
813 | mode,file,line); | 844 | mode,file,line); |
814 | */ | 845 | */ |
815 | if (mode & CRYPTO_LOCK) | 846 | if (mode & CRYPTO_LOCK) |
816 | { | 847 | { |
817 | /* if (mode & CRYPTO_READ) | 848 | /* if (mode & CRYPTO_READ) |
@@ -871,7 +902,7 @@ unsigned long solaris_thread_id(void) | |||
871 | 902 | ||
872 | 903 | ||
873 | static usptr_t *arena; | 904 | static usptr_t *arena; |
874 | static usema_t *lock_cs[CRYPTO_NUM_LOCKS]; | 905 | static usema_t **lock_cs; |
875 | 906 | ||
876 | void thread_setup(void) | 907 | void thread_setup(void) |
877 | { | 908 | { |
@@ -888,7 +919,8 @@ void thread_setup(void) | |||
888 | arena=usinit(filename); | 919 | arena=usinit(filename); |
889 | unlink(filename); | 920 | unlink(filename); |
890 | 921 | ||
891 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 922 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *)); |
923 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
892 | { | 924 | { |
893 | lock_cs[i]=usnewsema(arena,1); | 925 | lock_cs[i]=usnewsema(arena,1); |
894 | } | 926 | } |
@@ -902,7 +934,7 @@ void thread_cleanup(void) | |||
902 | int i; | 934 | int i; |
903 | 935 | ||
904 | CRYPTO_set_locking_callback(NULL); | 936 | CRYPTO_set_locking_callback(NULL); |
905 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 937 | for (i=0; i<CRYPTO_num_locks(); i++) |
906 | { | 938 | { |
907 | char buf[10]; | 939 | char buf[10]; |
908 | 940 | ||
@@ -910,6 +942,7 @@ void thread_cleanup(void) | |||
910 | usdumpsema(lock_cs[i],stdout,buf); | 942 | usdumpsema(lock_cs[i],stdout,buf); |
911 | usfreesema(lock_cs[i],arena); | 943 | usfreesema(lock_cs[i],arena); |
912 | } | 944 | } |
945 | Free(lock_cs); | ||
913 | } | 946 | } |
914 | 947 | ||
915 | void irix_locking_callback(int mode, int type, char *file, int line) | 948 | void irix_locking_callback(int mode, int type, char *file, int line) |
@@ -962,14 +995,16 @@ unsigned long irix_thread_id(void) | |||
962 | 995 | ||
963 | #ifdef PTHREADS | 996 | #ifdef PTHREADS |
964 | 997 | ||
965 | static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS]; | 998 | static pthread_mutex_t *lock_cs; |
966 | static long lock_count[CRYPTO_NUM_LOCKS]; | 999 | static long *lock_count; |
967 | 1000 | ||
968 | void thread_setup(void) | 1001 | void thread_setup(void) |
969 | { | 1002 | { |
970 | int i; | 1003 | int i; |
971 | 1004 | ||
972 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 1005 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); |
1006 | lock_count=Malloc(CRYPTO_num_locks() * sizeof(long)); | ||
1007 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
973 | { | 1008 | { |
974 | lock_count[i]=0; | 1009 | lock_count[i]=0; |
975 | pthread_mutex_init(&(lock_cs[i]),NULL); | 1010 | pthread_mutex_init(&(lock_cs[i]),NULL); |
@@ -985,12 +1020,15 @@ void thread_cleanup(void) | |||
985 | 1020 | ||
986 | CRYPTO_set_locking_callback(NULL); | 1021 | CRYPTO_set_locking_callback(NULL); |
987 | fprintf(stderr,"cleanup\n"); | 1022 | fprintf(stderr,"cleanup\n"); |
988 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 1023 | for (i=0; i<CRYPTO_num_locks(); i++) |
989 | { | 1024 | { |
990 | pthread_mutex_destroy(&(lock_cs[i])); | 1025 | pthread_mutex_destroy(&(lock_cs[i])); |
991 | fprintf(stderr,"%8ld:%s\n",lock_count[i], | 1026 | fprintf(stderr,"%8ld:%s\n",lock_count[i], |
992 | CRYPTO_get_lock_name(i)); | 1027 | CRYPTO_get_lock_name(i)); |
993 | } | 1028 | } |
1029 | Free(lock_cs); | ||
1030 | Free(lock_count); | ||
1031 | |||
994 | fprintf(stderr,"done cleanup\n"); | 1032 | fprintf(stderr,"done cleanup\n"); |
995 | } | 1033 | } |
996 | 1034 | ||
@@ -1045,7 +1083,7 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx) | |||
1045 | } | 1083 | } |
1046 | 1084 | ||
1047 | printf("pthreads threads done (%d,%d)\n", | 1085 | printf("pthreads threads done (%d,%d)\n", |
1048 | s_ctx->references,c_ctx->references); | 1086 | s_ctx->references,c_ctx->references); |
1049 | } | 1087 | } |
1050 | 1088 | ||
1051 | unsigned long pthreads_thread_id(void) | 1089 | unsigned long pthreads_thread_id(void) |
diff --git a/src/lib/libcrypto/threads/profile.sh b/src/lib/libcrypto/threads/profile.sh new file mode 100644 index 0000000000..6e3e342fc0 --- /dev/null +++ b/src/lib/libcrypto/threads/profile.sh | |||
@@ -0,0 +1,4 @@ | |||
1 | #!/bin/sh | ||
2 | /bin/rm -f mttest | ||
3 | cc -p -DSOLARIS -I../../include -g mttest.c -o mttest -L/usr/lib/libc -ldl -L../.. -lthread -lssl -lcrypto -lnsl -lsocket | ||
4 | |||
diff --git a/src/lib/libcrypto/threads/ptest.bat b/src/lib/libcrypto/threads/ptest.bat new file mode 100644 index 0000000000..4071b5ffea --- /dev/null +++ b/src/lib/libcrypto/threads/ptest.bat | |||
@@ -0,0 +1,4 @@ | |||
1 | del mttest.exe | ||
2 | |||
3 | purify cl /O2 -DWIN32 /MD -I..\..\out mttest.c /Femttest ..\..\out\ssl32.lib ..\..\out\crypt32.lib | ||
4 | |||
diff --git a/src/lib/libcrypto/threads/pthread.sh b/src/lib/libcrypto/threads/pthread.sh new file mode 100644 index 0000000000..f1c49821d2 --- /dev/null +++ b/src/lib/libcrypto/threads/pthread.sh | |||
@@ -0,0 +1,9 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # build using pthreads | ||
4 | # | ||
5 | # http://www.mit.edu:8001/people/proven/pthreads.html | ||
6 | # | ||
7 | /bin/rm -f mttest | ||
8 | pgcc -DPTHREADS -I../../include -g mttest.c -o mttest -L../.. -lssl -lcrypto | ||
9 | |||
diff --git a/src/lib/libcrypto/threads/pthread2.sh b/src/lib/libcrypto/threads/pthread2.sh new file mode 100644 index 0000000000..41264c6a50 --- /dev/null +++ b/src/lib/libcrypto/threads/pthread2.sh | |||
@@ -0,0 +1,7 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # build using pthreads where it's already built into the system | ||
4 | # | ||
5 | /bin/rm -f mttest | ||
6 | gcc -DPTHREADS -I../../include -g mttest.c -o mttest -L../.. -lssl -lcrypto -lpthread | ||
7 | |||
diff --git a/src/lib/libcrypto/threads/pthreads-vms.com b/src/lib/libcrypto/threads/pthreads-vms.com new file mode 100644 index 0000000000..63f5b8cc2e --- /dev/null +++ b/src/lib/libcrypto/threads/pthreads-vms.com | |||
@@ -0,0 +1,9 @@ | |||
1 | $! To compile mttest on VMS. | ||
2 | $! | ||
3 | $! WARNING: only tested with DEC C so far. | ||
4 | $ | ||
5 | $ arch := vax | ||
6 | $ if f$getsyi("CPU") .ge. 128 then arch := axp | ||
7 | $ define/user openssl [--.include.openssl] | ||
8 | $ cc/def=PTHREADS mttest.c | ||
9 | $ link mttest,[--.'arch'.exe.ssl]libssl/lib,[--.'arch'.exe.crypto]libcrypto/lib | ||
diff --git a/src/lib/libcrypto/threads/purify.sh b/src/lib/libcrypto/threads/purify.sh new file mode 100644 index 0000000000..6d44fe26b7 --- /dev/null +++ b/src/lib/libcrypto/threads/purify.sh | |||
@@ -0,0 +1,4 @@ | |||
1 | #!/bin/sh | ||
2 | /bin/rm -f mttest | ||
3 | purify cc -DSOLARIS -I../../include -g mttest.c -o mttest -L../.. -lthread -lssl -lcrypto -lnsl -lsocket | ||
4 | |||
diff --git a/src/lib/libcrypto/threads/solaris.sh b/src/lib/libcrypto/threads/solaris.sh new file mode 100644 index 0000000000..bc93094a27 --- /dev/null +++ b/src/lib/libcrypto/threads/solaris.sh | |||
@@ -0,0 +1,4 @@ | |||
1 | #!/bin/sh | ||
2 | /bin/rm -f mttest | ||
3 | cc -DSOLARIS -I../../include -g mttest.c -o mttest -L../.. -lthread -lssl -lcrypto -lnsl -lsocket | ||
4 | |||
diff --git a/src/lib/libcrypto/threads/th-lock.c b/src/lib/libcrypto/threads/th-lock.c index afb4f4caf2..3ee978060c 100644 --- a/src/lib/libcrypto/threads/th-lock.c +++ b/src/lib/libcrypto/threads/th-lock.c | |||
@@ -74,6 +74,9 @@ | |||
74 | #include <ulocks.h> | 74 | #include <ulocks.h> |
75 | #include <sys/prctl.h> | 75 | #include <sys/prctl.h> |
76 | #endif | 76 | #endif |
77 | #ifdef PTHREADS | ||
78 | #include <pthread.h> | ||
79 | #endif | ||
77 | #include <openssl/lhash.h> | 80 | #include <openssl/lhash.h> |
78 | #include <openssl/crypto.h> | 81 | #include <openssl/crypto.h> |
79 | #include <openssl/buffer.h> | 82 | #include <openssl/buffer.h> |
@@ -82,7 +85,7 @@ | |||
82 | #include <openssl/ssl.h> | 85 | #include <openssl/ssl.h> |
83 | #include <openssl/err.h> | 86 | #include <openssl/err.h> |
84 | 87 | ||
85 | int CRYPTO_thread_setup(void); | 88 | void CRYPTO_thread_setup(void); |
86 | void CRYPTO_thread_cleanup(void); | 89 | void CRYPTO_thread_cleanup(void); |
87 | 90 | ||
88 | static void irix_locking_callback(int mode,int type,char *file,int line); | 91 | static void irix_locking_callback(int mode,int type,char *file,int line); |
@@ -96,7 +99,7 @@ static unsigned long pthreads_thread_id(void ); | |||
96 | 99 | ||
97 | /* usage: | 100 | /* usage: |
98 | * CRYPTO_thread_setup(); | 101 | * CRYPTO_thread_setup(); |
99 | * applicaion code | 102 | * application code |
100 | * CRYPTO_thread_cleanup(); | 103 | * CRYPTO_thread_cleanup(); |
101 | */ | 104 | */ |
102 | 105 | ||
@@ -104,13 +107,14 @@ static unsigned long pthreads_thread_id(void ); | |||
104 | 107 | ||
105 | #ifdef WIN32 | 108 | #ifdef WIN32 |
106 | 109 | ||
107 | static HANDLE lock_cs[CRYPTO_NUM_LOCKS]; | 110 | static HANDLE *lock_cs; |
108 | 111 | ||
109 | int CRYPTO_thread_setup(void) | 112 | void CRYPTO_thread_setup(void) |
110 | { | 113 | { |
111 | int i; | 114 | int i; |
112 | 115 | ||
113 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 116 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE)); |
117 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
114 | { | 118 | { |
115 | lock_cs[i]=CreateMutex(NULL,FALSE,NULL); | 119 | lock_cs[i]=CreateMutex(NULL,FALSE,NULL); |
116 | } | 120 | } |
@@ -125,8 +129,9 @@ static void CRYPTO_thread_cleanup(void) | |||
125 | int i; | 129 | int i; |
126 | 130 | ||
127 | CRYPTO_set_locking_callback(NULL); | 131 | CRYPTO_set_locking_callback(NULL); |
128 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 132 | for (i=0; i<CRYPTO_num_locks(); i++) |
129 | CloseHandle(lock_cs[i]); | 133 | CloseHandle(lock_cs[i]); |
134 | Free(lock_cs); | ||
130 | } | 135 | } |
131 | 136 | ||
132 | void win32_locking_callback(int mode, int type, char *file, int line) | 137 | void win32_locking_callback(int mode, int type, char *file, int line) |
@@ -147,18 +152,24 @@ void win32_locking_callback(int mode, int type, char *file, int line) | |||
147 | 152 | ||
148 | #define USE_MUTEX | 153 | #define USE_MUTEX |
149 | 154 | ||
150 | static mutex_t lock_cs[CRYPTO_NUM_LOCKS]; | ||
151 | #ifdef USE_MUTEX | 155 | #ifdef USE_MUTEX |
152 | static long lock_count[CRYPTO_NUM_LOCKS]; | 156 | static mutex_t *lock_cs; |
153 | #else | 157 | #else |
154 | static rwlock_t lock_cs[CRYPTO_NUM_LOCKS]; | 158 | static rwlock_t *lock_cs; |
155 | #endif | 159 | #endif |
160 | static long *lock_count; | ||
156 | 161 | ||
157 | void CRYPTO_thread_setup(void) | 162 | void CRYPTO_thread_setup(void) |
158 | { | 163 | { |
159 | int i; | 164 | int i; |
160 | 165 | ||
161 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 166 | #ifdef USE_MUTEX |
167 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t)); | ||
168 | #else | ||
169 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(rwlock_t)); | ||
170 | #endif | ||
171 | lock_count=Malloc(CRYPTO_num_locks() * sizeof(long)); | ||
172 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
162 | { | 173 | { |
163 | lock_count[i]=0; | 174 | lock_count[i]=0; |
164 | #ifdef USE_MUTEX | 175 | #ifdef USE_MUTEX |
@@ -177,7 +188,7 @@ void CRYPTO_thread_cleanup(void) | |||
177 | int i; | 188 | int i; |
178 | 189 | ||
179 | CRYPTO_set_locking_callback(NULL); | 190 | CRYPTO_set_locking_callback(NULL); |
180 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 191 | for (i=0; i<CRYPTO_num_locks(); i++) |
181 | { | 192 | { |
182 | #ifdef USE_MUTEX | 193 | #ifdef USE_MUTEX |
183 | mutex_destroy(&(lock_cs[i])); | 194 | mutex_destroy(&(lock_cs[i])); |
@@ -185,6 +196,8 @@ void CRYPTO_thread_cleanup(void) | |||
185 | rwlock_destroy(&(lock_cs[i])); | 196 | rwlock_destroy(&(lock_cs[i])); |
186 | #endif | 197 | #endif |
187 | } | 198 | } |
199 | Free(lock_cs); | ||
200 | Free(lock_count); | ||
188 | } | 201 | } |
189 | 202 | ||
190 | void solaris_locking_callback(int mode, int type, char *file, int line) | 203 | void solaris_locking_callback(int mode, int type, char *file, int line) |
@@ -237,7 +250,7 @@ unsigned long solaris_thread_id(void) | |||
237 | /* I don't think this works..... */ | 250 | /* I don't think this works..... */ |
238 | 251 | ||
239 | static usptr_t *arena; | 252 | static usptr_t *arena; |
240 | static usema_t *lock_cs[CRYPTO_NUM_LOCKS]; | 253 | static usema_t **lock_cs; |
241 | 254 | ||
242 | void CRYPTO_thread_setup(void) | 255 | void CRYPTO_thread_setup(void) |
243 | { | 256 | { |
@@ -254,7 +267,8 @@ void CRYPTO_thread_setup(void) | |||
254 | arena=usinit(filename); | 267 | arena=usinit(filename); |
255 | unlink(filename); | 268 | unlink(filename); |
256 | 269 | ||
257 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 270 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *)); |
271 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
258 | { | 272 | { |
259 | lock_cs[i]=usnewsema(arena,1); | 273 | lock_cs[i]=usnewsema(arena,1); |
260 | } | 274 | } |
@@ -268,7 +282,7 @@ void CRYPTO_thread_cleanup(void) | |||
268 | int i; | 282 | int i; |
269 | 283 | ||
270 | CRYPTO_set_locking_callback(NULL); | 284 | CRYPTO_set_locking_callback(NULL); |
271 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 285 | for (i=0; i<CRYPTO_num_locks(); i++) |
272 | { | 286 | { |
273 | char buf[10]; | 287 | char buf[10]; |
274 | 288 | ||
@@ -276,6 +290,7 @@ void CRYPTO_thread_cleanup(void) | |||
276 | usdumpsema(lock_cs[i],stdout,buf); | 290 | usdumpsema(lock_cs[i],stdout,buf); |
277 | usfreesema(lock_cs[i],arena); | 291 | usfreesema(lock_cs[i],arena); |
278 | } | 292 | } |
293 | Free(lock_cs); | ||
279 | } | 294 | } |
280 | 295 | ||
281 | void irix_locking_callback(int mode, int type, char *file, int line) | 296 | void irix_locking_callback(int mode, int type, char *file, int line) |
@@ -302,14 +317,16 @@ unsigned long irix_thread_id(void) | |||
302 | /* Linux and a few others */ | 317 | /* Linux and a few others */ |
303 | #ifdef PTHREADS | 318 | #ifdef PTHREADS |
304 | 319 | ||
305 | static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS]; | 320 | static pthread_mutex_t *lock_cs; |
306 | static long lock_count[CRYPTO_NUM_LOCKS]; | 321 | static long *lock_count; |
307 | 322 | ||
308 | void CRYPTO_thread_setup(void) | 323 | void CRYPTO_thread_setup(void) |
309 | { | 324 | { |
310 | int i; | 325 | int i; |
311 | 326 | ||
312 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 327 | lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); |
328 | lock_count=Malloc(CRYPTO_num_locks() * sizeof(long)); | ||
329 | for (i=0; i<CRYPTO_num_locks(); i++) | ||
313 | { | 330 | { |
314 | lock_count[i]=0; | 331 | lock_count[i]=0; |
315 | pthread_mutex_init(&(lock_cs[i]),NULL); | 332 | pthread_mutex_init(&(lock_cs[i]),NULL); |
@@ -324,10 +341,12 @@ void thread_cleanup(void) | |||
324 | int i; | 341 | int i; |
325 | 342 | ||
326 | CRYPTO_set_locking_callback(NULL); | 343 | CRYPTO_set_locking_callback(NULL); |
327 | for (i=0; i<CRYPTO_NUM_LOCKS; i++) | 344 | for (i=0; i<CRYPTO_num_locks(); i++) |
328 | { | 345 | { |
329 | pthread_mutex_destroy(&(lock_cs[i])); | 346 | pthread_mutex_destroy(&(lock_cs[i])); |
330 | } | 347 | } |
348 | Free(lock_cs); | ||
349 | Free(lock_count); | ||
331 | } | 350 | } |
332 | 351 | ||
333 | void pthreads_locking_callback(int mode, int type, char *file, | 352 | void pthreads_locking_callback(int mode, int type, char *file, |
diff --git a/src/lib/libcrypto/threads/win32.bat b/src/lib/libcrypto/threads/win32.bat new file mode 100644 index 0000000000..ee6da80a07 --- /dev/null +++ b/src/lib/libcrypto/threads/win32.bat | |||
@@ -0,0 +1,4 @@ | |||
1 | del mttest.exe | ||
2 | |||
3 | cl /O2 -DWIN32 /MD -I..\..\out mttest.c /Femttest ..\..\out\ssleay32.lib ..\..\out\libeay32.lib | ||
4 | |||