X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fasync%2Farch%2Fasync_posix.c;h=78bf61c44ef25adb8f14e707d00b6c56c9af427e;hp=281f25fdaf42d2929a1b1bff08c08626a593fdcd;hb=e38565f536b7674ef507564b5c646712b1d7eed4;hpb=501083049590455b1862edd7573fd51bb37bb037 diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c index 281f25fdaf..78bf61c44e 100644 --- a/crypto/async/arch/async_posix.c +++ b/crypto/async/arch/async_posix.c @@ -54,32 +54,110 @@ #include "../async_locl.h" #include -#ifdef ASYNC_SYSV +#ifdef ASYNC_POSIX # include # include +# include # include # include -__thread ASYNC_CTX *sysvctx; +__thread async_ctx *sysvctx; -int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre) +#define STACKSIZE 32768 + +extern __thread size_t posixpool_max_size; +extern __thread size_t posixpool_curr_size; +extern __thread STACK_OF(ASYNC_JOB) *posixpool; +__thread size_t posixpool_max_size = 0; +__thread size_t posixpool_curr_size = 0; +__thread STACK_OF(ASYNC_JOB) *posixpool = NULL; + +int async_fibre_init(async_fibre *fibre) { void *stack = NULL; - if (!(stack = OPENSSL_malloc(SIGSTKSZ))) { + stack = OPENSSL_malloc(STACKSIZE); + if (stack == NULL) { return 0; } fibre->fibre.uc_stack.ss_sp = stack; - fibre->fibre.uc_stack.ss_size = SIGSTKSZ; + fibre->fibre.uc_stack.ss_size = STACKSIZE; fibre->fibre.uc_link = NULL; + fibre->env_init = 0; return 1; } -void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre) +void async_fibre_free(async_fibre *fibre) { if (fibre->fibre.uc_stack.ss_sp) OPENSSL_free(fibre->fibre.uc_stack.ss_sp); } + +int async_pipe(int *pipefds) +{ + if (pipe(pipefds) == 0) + return 1; + + return 0; +} + +int async_write1(int fd, const void *buf) +{ + if (write(fd, buf, 1) > 0) + return 1; + + return 0; +} + +int async_read1(int fd, void *buf) +{ + if (read(fd, buf, 1) > 0) + return 1; + + return 0; +} + +STACK_OF(ASYNC_JOB) *async_get_pool(void) +{ + return posixpool; +} + +int async_set_pool(STACK_OF(ASYNC_JOB) *poolin, size_t curr_size, + size_t max_size) +{ + posixpool = poolin; + posixpool_curr_size = curr_size; + posixpool_max_size = max_size; + return 1; +} + +void async_increment_pool_size(void) +{ + posixpool_curr_size++; +} + +void async_release_job_to_pool(ASYNC_JOB *job) +{ + sk_ASYNC_JOB_push(posixpool, job); +} + +size_t async_pool_max_size(void) +{ + return posixpool_max_size; +} + +void async_release_pool(void) +{ + sk_ASYNC_JOB_free(posixpool); + posixpool = NULL; +} + +int async_pool_can_grow(void) +{ + return (posixpool_max_size == 0) + || (posixpool_curr_size < posixpool_max_size); +} + #endif