#include "../async_locl.h"
#include <openssl/async.h>
-#ifdef ASYNC_SYSV
+#ifdef ASYNC_POSIX
# include <stddef.h>
# include <ucontext.h>
+# include <unistd.h>
# include <openssl/crypto.h>
# include <openssl/async.h>
-__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