openssl 线程安全 Windows
2016-03-20 15:58
218 查看
openssl 线程安全
在初始化的时候 调用 thread_setup,在结束的时候调用thread_cleanup。代码摘自crypto/threads/mttest.c
static unsigned long _stdcall thread_id(void)
{
unsigned long ret;
ret=(unsigned long)GetCurrentThreadId();
return ret;
}
void thread_setup(void)
{
int i;
m_hLock_csArray = (HANDLE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i = 0; i < CRYPTO_num_locks(); i++) {
m_hLock_csArray[i] = CreateMutex(NULL, FALSE, NULL);
}
CRYPTO_set_locking_callback((void (*)(int, int, const char *, int))win32_locking_callback);
CRYPTO_set_id_callback((unsigned long (*)())thread_id);
}
void thread_cleanup(void)
{
int i;
CRYPTO_set_locking_callback(NULL);
for (i = 0; i < CRYPTO_num_locks(); i++)
CloseHandle(m_hLock_csArray[i]);
OPENSSL_free(m_hLock_csArray);
}
static void _stdcall win32_locking_callback(int mode, int type, const char *file, int line)
{
if (mode & CRYPTO_LOCK) {
WaitForSingleObject(m_hLock_csArray[type], INFINITE);
} else {
ReleaseMutex(m_hLock_csArray[type]);
}
}
在初始化的时候 调用 thread_setup,在结束的时候调用thread_cleanup。代码摘自crypto/threads/mttest.c
static unsigned long _stdcall thread_id(void)
{
unsigned long ret;
ret=(unsigned long)GetCurrentThreadId();
return ret;
}
void thread_setup(void)
{
int i;
m_hLock_csArray = (HANDLE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i = 0; i < CRYPTO_num_locks(); i++) {
m_hLock_csArray[i] = CreateMutex(NULL, FALSE, NULL);
}
CRYPTO_set_locking_callback((void (*)(int, int, const char *, int))win32_locking_callback);
CRYPTO_set_id_callback((unsigned long (*)())thread_id);
}
void thread_cleanup(void)
{
int i;
CRYPTO_set_locking_callback(NULL);
for (i = 0; i < CRYPTO_num_locks(); i++)
CloseHandle(m_hLock_csArray[i]);
OPENSSL_free(m_hLock_csArray);
}
static void _stdcall win32_locking_callback(int mode, int type, const char *file, int line)
{
if (mode & CRYPTO_LOCK) {
WaitForSingleObject(m_hLock_csArray[type], INFINITE);
} else {
ReleaseMutex(m_hLock_csArray[type]);
}
}
相关文章推荐
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- Linux文件删除原理
- linux中静态库和动态库的区别
- Linux下文件的读写操作( open read write)
- Tomcat 7 FindClass org/apache/catalina/startup/Bootstrap failed
- 《Linux内核设计与实现》读书笔记 第五章 系统调用
- Hadoop1.2.1+Zookeeper3.4.5+HBase0.94.18完全分布式集群配置过程中遇到的问题
- CentOS 7 安装VirtualBox
- linux中如何快速在某目录下打开终端 及vim多文件调试
- Linux环境下FTP服务器的部署
- VM虚拟机上linux连网问题
- 利用 Aliyun OSS Nginx proxy module 实现OSS 图片处理回写功能
- pssh自动化运维工具
- linux 系统操作
- 阿里云Linux系统安装配置Tomcat方法
- tengine(nginx)安装,lua模块安装
- codeforces-Goodbye2015- New Year and Ancient Prophecy
- 设置自己的linux开机画面,及每个用户登录时显示通知
- linux系统·用户管理
- Linux下程序包管理rpm、yum及编译安装详解