void read_com ( char * com ) { /* LOG */ //log_print ("XBoard>Engine>Line>>" , LOG_COMMAND_FILE); log_print ( com , LOG_COMMAND_FILE ); /* END LOG */ int length = strlen(com) + 1; char *prop = (char *) malloc ( length * sizeof (char) ); memcpy( prop , com , length ); char * poz = prop; char * word; word = parse_com ( &poz ); /* Analyse command */ if ( !strcmp ( word , "quit" ) ) exit(0); if ( !strcmp ( word , "xboard" ) ) write_to_xboard ("\n"); if ( !strcmp ( word , "protover" ) ) { Init ( INIT_POSX) ; write_to_xboard (FEATURES); } if ( !strcmp ( word , "go" ) ) { set_engine_lock (0); // Remove Lock if ( !is_engine_on_move() ) flip_state () ; } if ( !strcmp ( word , "force" ) ) set_engine_lock(1); // Put Lock if ( !strcmp ( word , "new" ) ) { set_engine_lock (1) ; Init ( INIT_NEW ) ; } /* Command is a move */ if ( !strcmp ( word , "usermove" )) { set_engine_lock (0); word = parse_com ( &poz ); // Now : word is command in XBoard format /* LOG */ log_print ("XBoard>Engine>Move" , LOG_COMMAND_FILE ); log_print ( word , LOG_COMMAND_FILE ); log_print ("XBoard>Engine>SAN_to_Move" , LOG_COMMAND_FILE); log_print_move ( SAN_to_Move ( cur_state_get() , word ) , LOG_COMMAND_FILE ); /* END LOG */ /* LOG History */ char color_text [10]; tag_to_text ( not ( get_engine_col () ) , color_text ); log_print ( color_text , LOG_HISTORY_FILE ); log_print (word , LOG_HISTORY_FILE ); /* END LOG History */ update_state ( cur_state_get() , SAN_to_Move ( cur_state_get() , word ) ); } /* Free statement */ free(prop); /* LOG */ log_print("END read_com", LOG_COMMAND_FILE ); /* END LOG */ }
int cli_query_cb(int fd, void *arg) { int done, res = 0; cli_conn_t *cli; buf_t *buf; conn_t *c; my_conn_t *my; cli_com_t com; cli = (cli_conn_t *)arg; c = cli->conn; buf = &(c->buf); my = c->my; if(c->state == STATE_IDLE){ conn_state_set_reading_client(c); gettimeofday(&(c->tv_start), NULL); } else if( (c->state == STATE_PREPARE_MYSQL) || (c->state == STATE_WRITING_MYSQL) ){ log(g_log, "conn:%u client can be read when preparing or writing mysql\n", c->connid); goto end; } else if(c->state == STATE_READ_MYSQL_WRITE_CLIENT) {//从mysql获取了结果,准备发送给client,所以记录sql数据 conn_state_set_reading_client(c); sqldump(c); gettimeofday(&(c->tv_start), NULL); if( (res = del_handler(my->fd)) < 0 ){ log(g_log, "conn:%u del_handler error\n", c->connid); } } else { gettimeofday(&(c->tv_end), NULL); } if( (res = my_real_read(fd, buf, &done)) < 0 ){ log_err(g_log, "conn:%u my_real_read error with client[%s:%d] \n", c->connid, ip_to_string(cli->ip), cli->port); goto end;//客户端数据读取出错,关闭2端的连接? } if(done){//读取了一个完整的包,下面准备处理 if( (res = parse_com(buf, &com)) < 0 ){ log(g_log, "conn:%u parse com error\n", c->connid); goto end; } c->comno = com.comno; strncpy(c->arg, com.arg, sizeof(c->arg) - 1); c->arg[sizeof(c->arg) - 1] = '\0'; switch(c->comno) { // command ignored and quit case COM_QUIT: case COM_SHUTDOWN: debug(g_log, "command quit/shutdown\n"); res = cli_com_ignored(c); goto end;//挂掉这个连接 // command ignored case COM_REFRESH: log(g_log, "refresh\n"); case COM_PROCESS_KILL: log(g_log, "kill\n"); case COM_DEBUG: res = cli_com_ignored(c); break; case COM_INIT_DB: debug(g_log, "init db, ignore frist.\n"); res = cli_com_ignored(c);//先忽略这个数据库初始化请求,待会query的时候再看数据库是否一样。这样能避免重复use db strncpy(c->curdb, c->arg, sizeof(c->curdb) - 1); /* if( (res = cli_com_forward(c)) < 0 ){ log(g_log, "conn:%u cli_com_forward error\n", c->connid); goto end; } else { debug(g_log, "conn:%u cli_com_forward success\n", c->connid); } strncpy(my->ctx.curdb, c->curdb, sizeof(my->ctx.curdb) - 1); my->ctx.curdb[sizeof(my->ctx.curdb) - 1] = '\0'; conn_state_set_writing_mysql(c); */ break; // command unsupported case COM_BINLOG_DUMP: log(g_log, "binlog dump\n"); case COM_TABLE_DUMP: log(g_log, "table dump\n"); case COM_REGISTER_SLAVE: log(g_log, "register slave\n"); case COM_CHANGE_USER: log(g_log, "change user\n"); res = cli_com_unsupported(c); log(g_log, "conn:%u client command unsupported\n", c->connid); goto end; case COM_CREATE_DB: log(g_log, "create db\n"); case COM_DROP_DB: log(g_log, "drop db\n"); case COM_QUERY: //下面为了选一个合适的连接,虽然当前分配了,但可能需要切换主从 /*if( (res = conn_alloc_my_conn(c)) < 0 ){ log(g_log, "conn:%u alloc mysql conn error\n", c->connid); goto end; }*/ my = c->my; //判断数据库是否相等 if(c->curdb != NULL && strcmp(my->ctx.curdb, c->curdb)){//还需要给服务器发送切换数据库的命令 if( (res = my_use_db_prepare(c)) < 0 ){ log(g_log, "conn:%u my_use_db_prepare error\n", c->connid); goto end; } conn_state_set_prepare_mysql(c);//标记为这个在等待切换数据库,完成后才能做后面的事情, //就是真正处理命令转发my_use_db_prepare里面会放回调的 break; } //如果这条指令是"SET NAMES utf8",判断当前连接使用的字符集是否相同,不相同就需要转发这条指令,否则ignore就行了 if( strncmp( c->arg, "SET NAMES ", 10) == 0 ){ if( strncmp( c->arg, my->setnamesql, 64 ) == 0 ){ res = cli_com_ignored(c); break ;//属于SETNAMES } strncpy( my->setnamesql, c->arg, 64) ; } default: if( (res = cli_com_forward(c)) < 0 ){ log(g_log, "conn:%u cli_com_forward error\n", c->connid); goto end; } conn_state_set_writing_mysql(c); } } return res; end: //conn_close_with_my(c); conn_close(c) ; return res; }
int main (int argc, char **argv) { int qflag = 0; unsigned long int m_size = UINT_MAX; int object_size; int n_procs = 1; unsigned long int i = 0; unsigned long int j = 0; int n = 0; pid_t pids[n_procs]; pid_t pid; int status; parse_com(argc, argv, &qflag, &m_size, &n_procs); unsigned int *bitmap; object_size = UINT_MAX/8 + 4; //create shared memory void *addr = create_mem("/hazlettb_prime", object_size); bitmap = (unsigned int*)addr; //set up bitmap for sieve for (i=3;i<m_size;i+=2) setBit(bitmap,i); //fork the children for (i = 0; i < n_procs; ++i) { if ((pids[i] = fork()) < 0) { perror("fork"); abort(); } else if (pids[i] == 0) { //each child calculates and stores some of the primes n = 3 + 2*i; for (i = n; i < m_size; i+=(2*n_procs)){ if (testBit(bitmap, i)) for (j=i;i*j<m_size;j++) clearBit(bitmap,(i*j)); } exit(0); } } //wait for children to exit while (n_procs > 0) { pid = wait(&status); --n_procs; } //step through array, check for twins and print if no q for (i = 0; i < (m_size - 2); i++) { if (testBit(bitmap, i) && testBit(bitmap,(i+2))) { if (qflag == 0) printf("%lu %lu\n", i, i + 2); } } //unlink memory object if (shm_unlink("/hazlettb_prime") == -1) printf("unlink failed"); return 0; }