machinarium: move tls init out from tls io

This commit is contained in:
Dmitry Simonenko 2017-07-10 16:35:40 +03:00
parent 9dcdda4753
commit f36d2231c8
8 changed files with 84 additions and 61 deletions

View File

@ -21,8 +21,9 @@ set(machine_src thread.c
channel.c
queue.c
task_mgr.c
tls_api.c
tls.c
tls_io.c
tls_api.c
io.c
close.c
connect.c

View File

@ -74,8 +74,10 @@
#include "machine_mgr.h"
#include "mm.h"
#include "tls.h"
#include "tls_api.h"
#include "tls_io.h"
#include "io.h"
#include "read.h"
#include "write.h"

View File

@ -183,7 +183,7 @@ MACHINE_API int
machine_read(machine_io_t *obj, char *buf, int size, uint32_t time_ms)
{
mm_io_t *io = mm_cast(mm_io_t*, obj);
if (mm_tls_is_active(&io->tls))
if (mm_tlsio_is_active(&io->tls))
return mm_tlsio_read(&io->tls, buf, size, time_ms);
return mm_read(io, buf, size, time_ms);
}

64
sources/tls.c Normal file
View File

@ -0,0 +1,64 @@
/*
* machinarium.
*
* cooperative multitasking engine.
*/
#include <machinarium.h>
#include <machinarium_private.h>
static pthread_mutex_t *mm_tls_locks;
static void
mm_tls_thread_id(CRYPTO_THREADID *tid)
{
CRYPTO_THREADID_set_numeric(tid, (unsigned long)pthread_self());
}
static void
mm_tls_locking_callback(int mode, int type, const char *file, int line)
{
(void)file;
(void)line;
if (mode & CRYPTO_LOCK)
pthread_mutex_lock(&mm_tls_locks[type]);
else
pthread_mutex_unlock(&mm_tls_locks[type]);
}
void mm_tls_init(void)
{
SSL_library_init();
SSL_load_error_strings();
int size = CRYPTO_num_locks() * sizeof(pthread_mutex_t);
mm_tls_locks = OPENSSL_malloc(size);
if (mm_tls_locks == NULL) {
abort();
return;
}
int i = 0;
for (; i < CRYPTO_num_locks(); i++)
pthread_mutex_init(&mm_tls_locks[i], NULL);
CRYPTO_THREADID_set_callback(mm_tls_thread_id);
CRYPTO_set_locking_callback(mm_tls_locking_callback);
}
void mm_tls_free(void)
{
CRYPTO_set_locking_callback(NULL);
int i = 0;
for (; i < CRYPTO_num_locks(); i++)
pthread_mutex_destroy(&mm_tls_locks[i]);
OPENSSL_free(mm_tls_locks);
#if 0
SSL_COMP_free_compression_methods();
#endif
FIPS_mode_set(0);
ENGINE_cleanup();
CONF_modules_unload(1);
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_remove_state(getpid());
ERR_free_strings();
}

13
sources/tls.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef MM_TLS_H
#define MM_TLS_H
/*
* machinarium.
*
* cooperative multitasking engine.
*/
void mm_tls_init(void);
void mm_tls_free(void);
#endif /* MM_TLS_H */

View File

@ -8,61 +8,6 @@
#include <machinarium.h>
#include <machinarium_private.h>
static pthread_mutex_t *mm_tls_locks;
static void
mm_tls_thread_id(CRYPTO_THREADID *tid)
{
CRYPTO_THREADID_set_numeric(tid, (unsigned long)pthread_self());
}
static void
mm_tls_locking_callback(int mode, int type, const char *file, int line)
{
(void)file;
(void)line;
if (mode & CRYPTO_LOCK)
pthread_mutex_lock(&mm_tls_locks[type]);
else
pthread_mutex_unlock(&mm_tls_locks[type]);
}
void mm_tls_init(void)
{
SSL_library_init();
SSL_load_error_strings();
int size = CRYPTO_num_locks() * sizeof(pthread_mutex_t);
mm_tls_locks = OPENSSL_malloc(size);
if (mm_tls_locks == NULL) {
abort();
return;
}
int i = 0;
for (; i < CRYPTO_num_locks(); i++)
pthread_mutex_init(&mm_tls_locks[i], NULL);
CRYPTO_THREADID_set_callback(mm_tls_thread_id);
CRYPTO_set_locking_callback(mm_tls_locking_callback);
}
void mm_tls_free(void)
{
CRYPTO_set_locking_callback(NULL);
int i = 0;
for (; i < CRYPTO_num_locks(); i++)
pthread_mutex_destroy(&mm_tls_locks[i]);
OPENSSL_free(mm_tls_locks);
#if 0
SSL_COMP_free_compression_methods();
#endif
FIPS_mode_set(0);
ENGINE_cleanup();
CONF_modules_unload(1);
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_remove_state(getpid());
ERR_free_strings();
}
void mm_tlsio_init(mm_tlsio_t *io, void *io_arg)
{
memset(io, 0, sizeof(*io));

View File

@ -21,12 +21,10 @@ struct mm_tlsio
};
static inline int
mm_tls_is_active(mm_tlsio_t *io) {
mm_tlsio_is_active(mm_tlsio_t *io) {
return io->ssl != NULL;
}
void mm_tls_init(void);
void mm_tls_free(void);
void mm_tlsio_init(mm_tlsio_t*, void*);
void mm_tlsio_free(mm_tlsio_t*);
void mm_tlsio_error_reset(mm_tlsio_t*);

View File

@ -110,7 +110,7 @@ MACHINE_API int
machine_write(machine_io_t *obj, char *buf, int size, uint32_t time_ms)
{
mm_io_t *io = mm_cast(mm_io_t*, obj);
if (mm_tls_is_active(&io->tls))
if (mm_tlsio_is_active(&io->tls))
return mm_tlsio_write(&io->tls, buf, size, time_ms);
return mm_write(io, buf, size, time_ms);
}