提交 2d2d3139 编写于 作者: R Richard Levitte

Update the two threads modules to conform to our recommendations (use

CRYPTO_num_locks() instead of CRYPTO_NUM_LOCKS!), and correct all the
inconsistencies with the rest of OpenSSL.

At least, this compiles nicely on Linux using PTHREADS.  I've done no
other tests so far.
上级 1e7396be
......@@ -74,26 +74,28 @@
#include <ulocks.h>
#include <sys/prctl.h>
#endif
#ifdef PTHREADS
#include <pthread.h>
#endif
#include <openssl/lhash.h>
#include <openssl/crypto.h>
#include <openssl/buffer.h>
#include "../e_os.h"
#include "../../e_os.h"
#include <openssl/x509.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#ifdef NO_FP_API
#define APPS_WIN16
#include "../crypto/buffer/bss_file.c"
#include "../buffer/bss_file.c"
#endif
#define TEST_SERVER_CERT "../apps/server.pem"
#define TEST_CLIENT_CERT "../apps/client.pem"
#define TEST_SERVER_CERT "../../apps/server.pem"
#define TEST_CLIENT_CERT "../../apps/client.pem"
#define MAX_THREAD_NUMBER 100
int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
int error,char *arg);
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *xs);
void thread_setup(void);
void thread_cleanup(void);
void do_threads(SSL_CTX *s_ctx,SSL_CTX *c_ctx);
......@@ -652,18 +654,22 @@ err:
return(0);
}
int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
int error, char *arg)
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
{
char buf[256];
char *s, buf[256];
if (verbose)
{
X509_NAME_oneline(X509_get_subject_name(xs),buf,256);
if (ok)
fprintf(stderr,"depth=%d %s\n",depth,buf);
else
fprintf(stderr,"depth=%d error=%d %s\n",depth,error,buf);
if (s != NULL)
{
s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,256);
if (ok)
fprintf(stderr,"depth=%d %s\n",
ctx->error_depth,buf);
else
fprintf(stderr,"depth=%d error=%d %s\n",
ctx->error_depth,ctx->error,buf);
}
}
return(ok);
}
......@@ -672,13 +678,14 @@ int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
#ifdef WIN32
static HANDLE lock_cs[CRYPTO_NUM_LOCKS];
static HANDLE *lock_cs;
void thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
}
......@@ -692,8 +699,9 @@ void thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
CloseHandle(lock_cs[i]);
Free(lock_cs);
}
void win32_locking_callback(int mode, int type, char *file, int line)
......@@ -763,15 +771,17 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
#ifdef SOLARIS
static mutex_t lock_cs[CRYPTO_NUM_LOCKS];
/*static rwlock_t lock_cs[CRYPTO_NUM_LOCKS]; */
static long lock_count[CRYPTO_NUM_LOCKS];
static mutex_t *lock_cs;
/*static rwlock_t *lock_cs; */
static long *lock_count;
void thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t));
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_count[i]=0;
/* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */
......@@ -787,31 +797,37 @@ void thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
fprintf(stderr,"cleanup\n");
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
fprintf(stderr,"cleanup\n");
for (i=0; i<CRYPTO_num_locks(); i++)
{
/* rwlock_destroy(&(lock_cs[i])); */
mutex_destroy(&(lock_cs[i]));
fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
}
fprintf(stderr,"done cleanup\n");
Free(lock_cs);
Free(lock_count);
fprintf(stderr,"done cleanup\n");
}
void solaris_locking_callback(int mode, int type, char *file, int line)
{
#ifdef undef
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);
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 (CRYPTO_LOCK_SSL_CERT == type)
/*
if (CRYPTO_LOCK_SSL_CERT == type)
fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
CRYPTO_thread_id(),
mode,file,line);
*/
*/
if (mode & CRYPTO_LOCK)
{
/* if (mode & CRYPTO_READ)
......@@ -871,7 +887,7 @@ unsigned long solaris_thread_id(void)
static usptr_t *arena;
static usema_t *lock_cs[CRYPTO_NUM_LOCKS];
static usema_t **lock_cs;
void thread_setup(void)
{
......@@ -888,7 +904,8 @@ void thread_setup(void)
arena=usinit(filename);
unlink(filename);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_cs[i]=usnewsema(arena,1);
}
......@@ -902,7 +919,7 @@ void thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
{
char buf[10];
......@@ -910,6 +927,7 @@ void thread_cleanup(void)
usdumpsema(lock_cs[i],stdout,buf);
usfreesema(lock_cs[i],arena);
}
Free(lock_cs);
}
void irix_locking_callback(int mode, int type, char *file, int line)
......@@ -962,14 +980,16 @@ unsigned long irix_thread_id(void)
#ifdef PTHREADS
static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS];
static long lock_count[CRYPTO_NUM_LOCKS];
static pthread_mutex_t *lock_cs;
static long *lock_count;
void thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_count[i]=0;
pthread_mutex_init(&(lock_cs[i]),NULL);
......@@ -985,12 +1005,15 @@ void thread_cleanup(void)
CRYPTO_set_locking_callback(NULL);
fprintf(stderr,"cleanup\n");
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
{
pthread_mutex_destroy(&(lock_cs[i]));
fprintf(stderr,"%8ld:%s\n",lock_count[i],
CRYPTO_get_lock_name(i));
}
Free(lock_cs);
Free(lock_count);
fprintf(stderr,"done cleanup\n");
}
......@@ -1045,7 +1068,7 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
}
printf("pthreads threads done (%d,%d)\n",
s_ctx->references,c_ctx->references);
s_ctx->references,c_ctx->references);
}
unsigned long pthreads_thread_id(void)
......
......@@ -74,6 +74,9 @@
#include <ulocks.h>
#include <sys/prctl.h>
#endif
#ifdef PTHREADS
#include <pthread.h>
#endif
#include <openssl/lhash.h>
#include <openssl/crypto.h>
#include <openssl/buffer.h>
......@@ -82,7 +85,7 @@
#include <openssl/ssl.h>
#include <openssl/err.h>
int CRYPTO_thread_setup(void);
void CRYPTO_thread_setup(void);
void CRYPTO_thread_cleanup(void);
static void irix_locking_callback(int mode,int type,char *file,int line);
......@@ -104,13 +107,14 @@ static unsigned long pthreads_thread_id(void );
#ifdef WIN32
static HANDLE lock_cs[CRYPTO_NUM_LOCKS];
static HANDLE *lock_cs;
int CRYPTO_thread_setup(void)
void CRYPTO_thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
}
......@@ -125,8 +129,9 @@ static void CRYPTO_thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
CloseHandle(lock_cs[i]);
Free(lock_cs);
}
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)
#define USE_MUTEX
static mutex_t lock_cs[CRYPTO_NUM_LOCKS];
#ifdef USE_MUTEX
static long lock_count[CRYPTO_NUM_LOCKS];
static mutex_t *lock_cs;
#else
static rwlock_t lock_cs[CRYPTO_NUM_LOCKS];
static rwlock_t *lock_cs;
#endif
static long *lock_count;
void CRYPTO_thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
#ifdef USE_MUTEX
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t));
#else
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(rwlock_t));
#endif
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_count[i]=0;
#ifdef USE_MUTEX
......@@ -177,7 +188,7 @@ void CRYPTO_thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
{
#ifdef USE_MUTEX
mutex_destroy(&(lock_cs[i]));
......@@ -185,6 +196,8 @@ void CRYPTO_thread_cleanup(void)
rwlock_destroy(&(lock_cs[i]));
#endif
}
Free(lock_cs);
Free(lock_count);
}
void solaris_locking_callback(int mode, int type, char *file, int line)
......@@ -237,7 +250,7 @@ unsigned long solaris_thread_id(void)
/* I don't think this works..... */
static usptr_t *arena;
static usema_t *lock_cs[CRYPTO_NUM_LOCKS];
static usema_t **lock_cs;
void CRYPTO_thread_setup(void)
{
......@@ -254,7 +267,8 @@ void CRYPTO_thread_setup(void)
arena=usinit(filename);
unlink(filename);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_cs[i]=usnewsema(arena,1);
}
......@@ -268,7 +282,7 @@ void CRYPTO_thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
{
char buf[10];
......@@ -276,6 +290,7 @@ void CRYPTO_thread_cleanup(void)
usdumpsema(lock_cs[i],stdout,buf);
usfreesema(lock_cs[i],arena);
}
Free(lock_cs);
}
void irix_locking_callback(int mode, int type, char *file, int line)
......@@ -302,14 +317,16 @@ unsigned long irix_thread_id(void)
/* Linux and a few others */
#ifdef PTHREADS
static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS];
static long lock_count[CRYPTO_NUM_LOCKS];
static pthread_mutex_t *lock_cs;
static long *lock_count;
void CRYPTO_thread_setup(void)
{
int i;
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_count[i]=0;
pthread_mutex_init(&(lock_cs[i]),NULL);
......@@ -324,10 +341,12 @@ void thread_cleanup(void)
int i;
CRYPTO_set_locking_callback(NULL);
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
for (i=0; i<CRYPTO_num_locks(); i++)
{
pthread_mutex_destroy(&(lock_cs[i]));
}
Free(lock_cs);
Free(lock_count);
}
void pthreads_locking_callback(int mode, int type, char *file,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册