Commit 224905f8 authored by Matt Caswell's avatar Matt Caswell
Browse files

Convert ASYNC code to use new Thread API



The async code uses thread local variables. We should convert to using
the new Thread API for doing this.

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
parent 0c452abc
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -55,18 +55,9 @@

#ifdef ASYNC_NULL

int async_global_init(void)
{
    return 0;
}

void async_local_cleanup(void)
{
}

void async_global_cleanup(void)
{
}

#endif
+0 −4
Original line number Diff line number Diff line
@@ -65,13 +65,9 @@ typedef struct async_fibre_st {
} async_fibre;


# define async_set_ctx(nctx)                    0
# define async_arch_get_ctx()                   ((async_ctx *)NULL)
# define async_fibre_swapcontext(o,n,r)         0
# define async_fibre_makecontext(c)             0
# define async_fibre_free(f)
# define async_fibre_init_dispatcher(f)
# define async_get_pool()                       NULL
# define async_set_pool(p)                      0

#endif
+0 −15
Original line number Diff line number Diff line
@@ -58,27 +58,12 @@
# include <stddef.h>
# include <unistd.h>

pthread_key_t posixctx;
pthread_key_t posixpool;

#define STACKSIZE       32768

int async_global_init(void)
{
    if (pthread_key_create(&posixctx, NULL) != 0
            || pthread_key_create(&posixpool, NULL) != 0)
        return 0;

    return 1;
}

void async_local_cleanup(void)
{
}

void async_global_cleanup(void)
{
}

int async_fibre_makecontext(async_fibre *fibre)
{
+0 −8
Original line number Diff line number Diff line
@@ -68,20 +68,12 @@
#  include <setjmp.h>
#  include "e_os.h"

extern pthread_key_t posixctx;
extern pthread_key_t posixpool;

typedef struct async_fibre_st {
    ucontext_t fibre;
    jmp_buf env;
    int env_init;
} async_fibre;

#  define async_set_ctx(nctx)  (pthread_setspecific(posixctx , (nctx)) == 0)
#  define async_arch_get_ctx() ((async_ctx *)pthread_getspecific(posixctx))
#  define async_set_pool(p)    (pthread_setspecific(posixpool , (p)) == 0)
#  define async_get_pool()     ((async_pool *)pthread_getspecific(posixpool))

static inline int async_fibre_swapcontext(async_fibre *o, async_fibre *n, int r)
{
    o->env_init = 1;
+1 −59
Original line number Diff line number Diff line
@@ -58,38 +58,9 @@
# include <windows.h>
# include "internal/cryptlib.h"

struct winpool {
    STACK_OF(ASYNC_JOB) *pool;
    size_t curr_size;
    size_t max_size;
};

static DWORD asyncwinpool = 0;
static DWORD asyncwinctx = 0;


void async_start_func(void);

int async_global_init(void)
{
    asyncwinpool = TlsAlloc();
    asyncwinctx = TlsAlloc();
    if (asyncwinpool == TLS_OUT_OF_INDEXES
            || asyncwinctx == TLS_OUT_OF_INDEXES) {
        if (asyncwinpool != TLS_OUT_OF_INDEXES) {
            TlsFree(asyncwinpool);
        }
        if (asyncwinctx != TLS_OUT_OF_INDEXES) {
            TlsFree(asyncwinctx);
        }
        return 0;
    }
    return 1;
}

void async_local_cleanup(void)
{
    async_ctx *ctx = async_arch_get_ctx();
    async_ctx *ctx = async_get_ctx();
    if (ctx != NULL) {
        async_fibre *fibre = &ctx->dispatcher;
        if(fibre != NULL && fibre->fibre != NULL && fibre->converted) {
@@ -99,14 +70,6 @@ void async_local_cleanup(void)
    }
}

void async_global_cleanup(void)
{
    TlsFree(asyncwinpool);
    TlsFree(asyncwinctx);
    asyncwinpool = 0;
    asyncwinctx = 0;
}

int async_fibre_init_dispatcher(async_fibre *fibre)
{
    fibre->fibre = ConvertThreadToFiber(NULL);
@@ -127,25 +90,4 @@ VOID CALLBACK async_start_func_win(PVOID unused)
    async_start_func();
}

async_pool *async_get_pool(void)
{
    return (async_pool *)TlsGetValue(asyncwinpool);
}


int async_set_pool(async_pool *pool)
{
    return TlsSetValue(asyncwinpool, (LPVOID)pool) != 0;
}

async_ctx *async_arch_get_ctx(void)
{
    return (async_ctx *)TlsGetValue(asyncwinctx);
}

int async_set_ctx(async_ctx *ctx)
{
    return TlsSetValue(asyncwinctx, (LPVOID)ctx) != 0;
}

#endif
Loading