Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}