int swThreadPool_create(swThreadPool *pool, int thread_num) { bzero(pool, sizeof(swThreadPool)); pool->threads = (swThread *) sw_calloc(thread_num, sizeof(swThread)); pool->params = (swThreadParam *) sw_calloc(thread_num, sizeof(swThreadParam)); if (pool->threads == NULL || pool->params == NULL) { swWarn("swThreadPool_create malloc fail"); return SW_ERR; } swTrace("threads=%p|params=%p", pool->threads, pool->params); #ifdef SW_THREADPOOL_USE_CHANNEL pool->chan = swChannel_create(1024 * 256, 512, 0); if (pool->chan == NULL) { swWarn("swThreadPool_create create channel failed"); return SW_ERR; } #else if (swRingQueue_init(&pool->queue, SW_THREADPOOL_QUEUE_LEN) < 0) { return SW_ERR; } #endif if (swCond_create(&pool->cond) < 0) { return SW_ERR; } pool->thread_num = thread_num; return SW_OK; }
static PHP_METHOD(swoole_ringqueue, __construct) { long len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &len) == FAILURE) { RETURN_FALSE; } if (len < 0) { len = SW_RINGQUEUE_LEN; } swRingQueue *queue = emalloc(sizeof(swRingQueue)); if (queue == NULL) { zend_throw_exception(swoole_exception_class_entry_ptr, "failed to create ringqueue.", SW_ERROR_MALLOC_FAIL TSRMLS_CC); RETURN_FALSE; } if (swRingQueue_init(queue, len)) { zend_throw_exception(swoole_exception_class_entry_ptr, "failed to init ringqueue.", SW_ERROR_MALLOC_FAIL TSRMLS_CC); RETURN_FALSE; } swoole_set_object(getThis(), queue); }
int swFactoryThread_start(swFactory *factory) { swFactoryThread *this = factory->object; swThreadParam *param; int i; int ret; pthread_t pidt; ret = swFactory_check_callback(factory); if (ret < 0) { return SW_ERR; } for (i = 0; i < this->writer_num; i++) { #ifdef HAVE_EVENTFD ret = swPipeEventfd_create(&this->writers[i].evfd, 1, 1); #else ret = swPipeBase_create(&this->writers[i].evfd, 1); #endif if (ret < 0) { swTrace("create eventfd fail\n"); return SW_ERR; } param = sw_malloc(sizeof(swThreadParam)); if (param == NULL) { return SW_ERR; } param->object = factory; param->pti = i; if (pthread_create(&pidt, NULL, (void * (*)(void *)) swFactoryThread_writer_loop, (void *) param) < 0) { swTrace("pthread_create fail\n"); return SW_ERR; } if (swRingQueue_init(&this->queues[i], SW_RINGQUEUE_LEN) < 0) { swTrace("create ring queue fail\n"); return SW_ERR; } this->writers[i].ptid = pidt; //SW_START_SLEEP; } return SW_OK; }