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