CPINLINE int cpWorker_attach_mem(int worker_id, int group_id) { cpShareMemory *sm_obj = &(CPGS->G[group_id].workers[worker_id].sm_obj); if (!cp_mmap_calloc_with_file(sm_obj)) { return FAILURE; } return SUCCESS; }
void cpServer_init(zval *conf, char *ini_file) { size_t group_num = 0; cpShareMemory shm = {0}; shm.size = sizeof (cpServerGS); strncpy(shm.mmap_name, CP_SERVER_MMAP_FILE, strlen(CP_SERVER_MMAP_FILE)); if (cp_create_mmap_file(&shm) == 0) { CPGS = (cpServerGS*) cp_mmap_calloc_with_file(&shm); cpKillClient(); bzero(CPGS, shm.size); if (CPGS == NULL) { php_printf("calloc[1] fail\n"); return; } } else { php_printf("calloc[1] fail\n"); return; } bzero(&CPGL, sizeof (cpServerG)); CPGC.backlog = CP_BACKLOG; // CPGC.reactor_num = CP_CPU_NUM; CPGC.reactor_num = 1; 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.ser_fail_hits = 1; CPGC.max_fail_num = 2; strcpy(CPGC.ini_file, ini_file); // MAKE_STD_ZVAL(CPGS->group); // array_init(CPGS->group); for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(conf)); zend_hash_has_more_elements(Z_ARRVAL_P(conf)) == SUCCESS; zend_hash_move_forward(Z_ARRVAL_P(conf))) { zval **config; zend_hash_get_current_data(Z_ARRVAL_P(conf), (void**) &config); char *name; uint keylen; zend_hash_get_current_key_ex(Z_ARRVAL_P(conf), &name, &keylen, NULL, 0, NULL); if (strcmp(name, "common") == 0) {//common config cpServer_init_common(*config); } else { zval **v; strcpy(CPGS->G[group_num].name, name); if (zend_hash_find(Z_ARRVAL_PP(config), ZEND_STRS("pool_min"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGS->G[group_num].worker_num = CPGS->G[group_num].worker_min = Z_LVAL_PP(v); } if (zend_hash_find(Z_ARRVAL_PP(config), ZEND_STRS("pool_max"), (void **) &v) == SUCCESS) { convert_to_long(*v); CPGS->G[group_num].worker_max = Z_LVAL_PP(v); } CPGS->max_buffer_len = CPGC.max_read_len; pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (pthread_mutex_init(&CPGS->G[group_num].mutex_lock, &attr) < 0) { cpLog("pthread_mutex_init error!. Error: %s [%d]", strerror(errno), errno); return; } CPGS->G[group_num].lock = cpMutexLock; CPGS->G[group_num].unLock = cpMutexUnLock; CPGS->G[group_num].tryLock = cpMutexTryLock; // CPGS->G[group_num].WaitList = CPGS->G[group_num].WaitTail = NULL; CPGS->group_num++; group_num++; } } }
void cpServer_init(zval *conf, char *ini_file) { size_t group_num = 0; cpShareMemory shm = {0}; shm.size = sizeof (cpServerGS); strncpy(shm.mmap_name, CP_SERVER_MMAP_FILE, strlen(CP_SERVER_MMAP_FILE)); if (cp_create_mmap_file(&shm) == 0) { CPGS = (cpServerGS*) cp_mmap_calloc_with_file(&shm); cpKillClient(); bzero(CPGS, shm.size); if (CPGS == NULL) { php_printf("calloc[1] fail\n"); return; } } else { php_printf("calloc[1] fail\n"); return; } bzero(&CPGL, sizeof (cpServerG)); CPGC.backlog = CP_BACKLOG; // CPGC.reactor_num = CP_CPU_NUM; CPGC.reactor_num = 1; 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.ser_fail_hits = 1; CPGC.max_fail_num = 2; CPGC.port = CP_PORT_PDO; CPGC.max_data_size_to_log = 0; CPGC.max_hold_time_to_log = 0; strcpy(CPGC.ini_file, ini_file); // MAKE_STD_ZVAL(CPGS->group); // array_init(CPGS->group); zval *config; char *name; uint32_t klen; int ktype; HashTable *_ht = Z_ARRVAL_P(conf); CP_HASHTABLE_FOREACH_START2(_ht, name, klen, ktype, config) { if (strcmp(name, "common") == 0) {//common config cpServer_init_common(config); } else { zval *v; strcpy(CPGS->G[group_num].name, name); if (cp_zend_hash_find(Z_ARRVAL_P(config), ZEND_STRS("pool_min"), (void **) &v) == SUCCESS) { convert_to_long(v); CPGS->G[group_num].worker_num = CPGS->G[group_num].worker_min = Z_LVAL_P(v); } if (cp_zend_hash_find(Z_ARRVAL_P(config), ZEND_STRS("pool_max"), (void **) &v) == SUCCESS) { convert_to_long(v); CPGS->G[group_num].worker_max = Z_LVAL_P(v); } CPGS->group_num++; group_num++; } } CP_HASHTABLE_FOREACH_END(); pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (pthread_mutex_init(&CPGS->mutex_lock, &attr) < 0) { cpLog("pthread_mutex_init error!. Error: %s [%d]", strerror(errno), errno); return; } CPGS->default_min = CP_DEF_MIN_NUM; CPGS->default_max = CP_DEF_MAX_NUM; CPGS->max_buffer_len = CPGC.max_read_len; CPGS->max_data_size_to_log = CPGC.max_data_size_to_log; CPGS->max_hold_time_to_log = CPGC.max_hold_time_to_log; strcpy(CPGS->log_file, CPGC.log_file); cpServer_init_lock(); }