coroutine_t co_create(void (*func)(void *), void *data, void *stack, int size) { int alloc = 0, r = CO_STK_COROSIZE; coroutine *co; if ((size &= ~(sizeof(long) - 1)) < CO_MIN_SIZE) return NULL; if (stack == NULL) { size = (size + sizeof(coroutine) + CO_STK_ALIGN - 1) & ~(CO_STK_ALIGN - 1); stack = malloc(size); if (stack == NULL) return NULL; alloc = size; } co = stack; stack = (char *) stack + CO_STK_COROSIZE; co->alloc = alloc; co->func = func; co->data = data; if (co_set_context(&co->ctx, co_runner, stack, size - CO_STK_COROSIZE) < 0) { if (alloc) free(co); return NULL; } return (coroutine_t) co; }
coroutine_t co_create(void (*func)(void *), void *data, void *stack, int size) { int alloc = 0; coroutine *co; if ((size &= ~(sizeof(int) - 1)) < CO_MIN_SIZE) return NULL; if (!stack) { size = (size + CO_STK_ALIGN - 1) & ~(CO_STK_ALIGN - 1); stack = malloc(size); if (!stack) return NULL; alloc = size; } co = stack; co->alloc = alloc; co->func = func; co->data = data; if (co_set_context(&co->ctx, co_runner, stack, size) < 0) { if (alloc) free(co); return NULL; } return (coroutine_t) co; }
coroutine_t co_create(void (*func)(void *), void *data, void *stack, int size) { int alloc = 0; coroutine *co; if ( stack != NULL ) { if ( (size &= ~(sizeof(long) - 1)) < CO_MIN_SIZE + CO_STK_COROSIZE ) { errno = EINVAL; return NULL; } } else if ( (size &= ~(sizeof(long) - 1)) < CO_MIN_SIZE ) { errno = EINVAL; return NULL; } else if ( !(stack = pcl_alloc(size = size + CO_STK_COROSIZE)) ) { return NULL; } else { alloc = size; } co = stack; stack = (char *) stack + CO_STK_COROSIZE; co->alloc = alloc; co->func = func; co->data = data; co->sheduler_data = NULL; if ( co_set_context(&co->ctx, co_runner, stack, size - CO_STK_COROSIZE) < 0 ) { if ( alloc ) { pcl_free(co, alloc); } return NULL; } return (coroutine_t) co; }