int cpServer_create() { if (CPGC.reactor_num < 1 || CPGC.max_read_len >= CP_MAX_READ_LEN) { php_printf("reactor_num < 1 or max_read_len >%d\n", CP_MAX_READ_LEN); return FAILURE; } if (CPGC.ser_fail_hits < 1 || CPGC.max_fail_num < 1) { php_printf("ping server conf error\n"); return FAILURE; } cpLog_init(CPGC.log_file); CPGS->reactor_threads = (cpThread*) cp_mmap_calloc(CPGC.reactor_num * sizeof (cpThread)); if (CPGS->reactor_threads == NULL) { cpLog("calloc[1] fail"); return FAILURE; } CPGS->ping_workers = (cpWorker*) cp_mmap_calloc(sizeof (cpWorker)); if (CPGS->ping_workers == NULL) { cpLog("[Main] calloc[ping_workers] fail"); return FAILURE; } CPGS->running = 1; return SUCCESS; }
void cpServer_init(zval *conf, char *title, char *ini_file, int group_id) { CPGS = (cpServerGS*) cp_mmap_calloc(sizeof (cpServerGS)); if (CPGS == NULL) { php_printf("calloc[1] fail\n"); return; } bzero(&CPGL, sizeof (cpServerG)); CPGC.backlog = CP_BACKLOG; CPGC.reactor_num = CP_CPU_NUM; CPGC.timeout_sec = CP_REACTOR_TIMEO_SEC; CPGC.timeout_usec = CP_REACTOR_TIMEO_USEC; CPGC.max_conn = CP_MAX_FDS; CPGC.max_request = CP_MAX_REQUEST; CPGC.idel_time = CP_IDEL_TIME; CPGC.recycle_num = CP_RECYCLE_NUM; CPGC.max_read_len = CP_DEF_MAX_READ_LEN; CPGC.group_id = group_id; CPGS->worker_max = CP_MAX_WORKER; CPGC.worker_min = CP_MIN_WORKER; CPGC.ser_fail_hits = 1; CPGC.max_fail_num = 2; strcpy(CPGC.title, title); strcpy(CPGC.ini_file, ini_file); cpSettitle(title); zval **v; //daemonize,守护进程化 if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("daemonize"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.daemonize = (int) Z_LVAL_PP(v); } //pool_max if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("pool_max"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGS->worker_max = (int) Z_LVAL_PP(v); } //pool_min if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("pool_min"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.worker_min = (int) Z_LVAL_PP(v); } //pool_min if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("recycle_num"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.recycle_num = (int) Z_LVAL_PP(v); } //error_file if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("log_file"), (void **) &v) == SUCCESS) { memcpy(CPGC.log_file, Z_STRVAL_PP(v), Z_STRLEN_PP(v)); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("max_read_len"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.max_read_len = (int) Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("port"), (void **) &v) == SUCCESS) {//todo check null convert_to_long(*v); CPGC.port = (int) Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("idel_time"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.idel_time = (int) Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("use_wait_queue"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.use_wait_queue = (int) Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("ser_fail_hits"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.ser_fail_hits = (int) Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_P(conf), ZEND_STRS("max_fail_num"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGC.max_fail_num = (int) Z_LVAL_PP(v); } }
int cpServer_create() { if (CPGC.worker_min < 1 || CPGC.reactor_num < 1 || CPGC.max_read_len >= CP_MAX_READ_LEN) { php_printf("Fatal Error: worker_min < 1 or reactor_num < 1 or max_read_len >%d\n", CP_MAX_READ_LEN); return FAILURE; } if (CPGC.ser_fail_hits < 1 || CPGC.max_fail_num < 1) { php_printf("ping server conf error\n"); return FAILURE; } cpLog_init(CPGC.log_file); CPGS->reactor_threads = (cpThread*) cp_mmap_calloc(CPGC.reactor_num * sizeof (cpThread)); if (CPGS->reactor_threads == NULL) { cpLog("calloc[1] fail"); return FAILURE; } CPGS->conlist = (cpConnection*) cp_mmap_calloc(CPGC.max_conn * sizeof (cpConnection)); if (CPGS->conlist == NULL) { cpLog("calloc[1] fail"); return FAILURE; } CPGS->workerfd2clientfd_list = (uint32_t*) cp_mmap_calloc(CPGC.max_conn * sizeof (uint32_t)); if (CPGS->workerfd2clientfd_list == NULL) { cpLog("calloc[1] fail"); return FAILURE; } CPGS->workers_status = (volatile_int8*) cp_mmap_calloc(sizeof (volatile_int8) * CP_GROUP_LEN); if (CPGS->workers_status == NULL) { cpLog("alloc for worker_status fail"); return FAILURE; } CPGS->workers = (cpWorker*) cp_mmap_calloc(CP_GROUP_LEN * sizeof (cpWorker)); if (CPGS->workers == NULL) { cpLog("[Main] calloc[workers] fail"); return FAILURE; } CPGS->ping_workers = (cpWorker*) cp_mmap_calloc(sizeof (cpWorker)); if (CPGS->ping_workers == NULL) { cpLog("[Main] calloc[ping_workers] fail"); return FAILURE; } // CPGS->spin_lock = (pthread_spinlock_t*) cp_mmap_calloc(sizeof (pthread_spinlock_t)); // //worker闲忙的锁,未做兼容,只在linux用 // if (pthread_spin_init(CPGS->spin_lock, 1) < 0) { // cpLog("pthread_spin_init error!. Error: %s [%d]", strerror(errno), errno); // return FAILURE; // } pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); CPGS->mutex_lock = (pthread_mutex_t*) cp_mmap_calloc(sizeof (pthread_mutex_t)); if (pthread_mutex_init(CPGS->mutex_lock, &attr) < 0) { cpLog("pthread_mutex_init error!. Error: %s [%d]", strerror(errno), errno); return FAILURE; } CPGS->running = 1; return SUCCESS; }