%PDF- %PDF-
| Direktori : /data/old/usr/lib/golang/src/crypto/internal/boring/ |
| Current File : //data/old/usr/lib/golang/src/crypto/internal/boring/openssl_lock_setup.c |
// +build linux
// +build !android
// +build !no_openssl
// +build !cmd_go_bootstrap
// +build !msan
// +build !static
#include "goboringcrypto.h"
#include <stdio.h>
#include <pthread.h>
#include <openssl/err.h>
#include <sys/types.h>
#include <sys/syscall.h>
#define _GNU_SOURCE
#include <unistd.h>
#define MUTEX_TYPE pthread_mutex_t
#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
#define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
#define THREAD_ID pthread_self()
/* This array will store all of the mutexes available to OpenSSL. */
static MUTEX_TYPE *mutex_buf = NULL;
static void locking_function(int mode, int n, const char *file, int line)
{
if(mode & CRYPTO_LOCK)
MUTEX_LOCK(mutex_buf[n]);
else
MUTEX_UNLOCK(mutex_buf[n]);
}
static unsigned long id_function(void)
{
return ((unsigned long)syscall(__NR_gettid));
}
int _goboringcrypto_OPENSSL_thread_setup(void)
{
int i;
mutex_buf = malloc(_goboringcrypto_CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
if(!mutex_buf)
return 0;
for(i = 0; i < _goboringcrypto_CRYPTO_num_locks(); i++)
MUTEX_SETUP(mutex_buf[i]);
_goboringcrypto_CRYPTO_set_id_callback(id_function);
_goboringcrypto_CRYPTO_set_locking_callback(locking_function);
return 1;
}