Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
    }
}
Ejemplo n.º 3
0
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;
}