Пример #1
0
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 */
		
}
Пример #2
0
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;
}
Пример #3
0
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;

}