Example #1
0
void
fs_node_close(struct fs_node* node){
    
    
    pthread_mutex_lock(&node->close_mutex);
    
    if(node->closed) {
        pthread_mutex_unlock(&node->close_mutex);
        return;
    }
    node->closed = fs_true;
    
    if(node->recv_buffer){
        fs_stream_free_output(node->recv_buffer);
        node->recv_buffer = NULL;
    }
    
    if(node->send_buffer){
        pthread_mutex_lock(&node->write_mutex);
        fs_stream_free_output(node->send_buffer);
        node->send_buffer = NULL;
        pthread_mutex_unlock(&node->write_mutex);
    }
    pthread_mutex_destroy(&node->write_mutex);
    
    fs_node_close_socket(node);
    
    if(node->read_ev != NULL){
        event_free(node->read_ev);
        node->read_ev = NULL;
    }
    if(node->write_ev != NULL){
        event_free(node->write_ev);
        node->write_ev = NULL;
    }
    if (fs_node_is_from_listener(node)){
        fs_server_on_node_disconnect(node->server, node->node_id);
    }else{
        fs_server_on_server_disconnect(node->server, node->node_id, node->script_id);
    }
    
    pthread_mutex_unlock(&node->close_mutex);
    pthread_mutex_destroy(&node->close_mutex);
    

}
Example #2
0
void
fs_node_close(struct fs_node* node){
    
    if(fs_node_is_closed(node))
        return;
    
    fs_node_set_closed(node);
    
    if(node->recv_buffer){
        fs_stream_free_output(node->recv_buffer);
        node->recv_buffer = NULL;
    }
    
    if(node->send_buffer){
        pthread_mutex_lock(&node->write_mutex);
        fs_stream_free_output(node->send_buffer);
        node->send_buffer = NULL;
        pthread_mutex_unlock(&node->write_mutex);
    }
    pthread_mutex_destroy(&node->write_mutex);
    pthread_mutex_destroy(&node->close_mutex);
    
    fs_node_close_socket(node);
    
    if(node->read_ev != NULL){
        event_free(node->read_ev);
        node->read_ev = NULL;
    }
    if(node->write_ev != NULL){
        event_free(node->write_ev);
        node->write_ev = NULL;
    }
    if(fs_node_is_from_listener(node)){
        fs_server_on_node_shudown(node->server, node->node_id);
    }

}
Example #3
0
VALUE
protect_fs_ruby_handle_pack(VALUE argv){
    
    VALUE* argvs = (VALUE*)argv;
    
    struct fs_server* server = (struct fs_server*)argvs[0];
    struct fs_pack* pack = (struct fs_pack*)argvs[1];
    
    VALUE server_instance = (VALUE)fs_server_get_script_id(server);
    
    int ret = 0;
    
    switch (pack->pack_type) {
        case fs_sys_pack_type_tick:
        {
            
            VALUE proc = (VALUE)argvs[2];
            VALUE proc_argv = (VALUE)argvs[3];
            
            VALUE argvs[3];
            argvs[0] = INT2FIX(-1);
            argvs[1] = proc;
            argvs[2] = proc_argv;
            
            rb_protect(protect_fs_ruby_call_func, (VALUE)argvs, &ret);
            
        }
            break;
        case fs_sys_pack_type_start:
        {
            VALUE argvs[3];
            argvs[0] = INT2FIX(0);
            argvs[1] = server_instance;
            argvs[2] = rb_intern("on_start");
            rb_protect(protect_fs_ruby_call_func, (VALUE)argvs, &ret);
        }
            break;
        case fs_sys_pack_type_connect:
        {
            
            VALUE argvs[4];
            argvs[0] = INT2FIX(1);
            argvs[1] = server_instance;
            argvs[2] = rb_intern("on_connect_node");
            argvs[3] = INT2FIX(pack->node_id);
            rb_protect(protect_fs_ruby_call_func, (VALUE)argvs, &ret);
        }
            break;
        case fs_sys_pack_type_diconnect:
        {
            VALUE argvs[4];
            argvs[0] = INT2FIX(1);
            argvs[1] = server_instance;
            argvs[2] = rb_intern("on_shudown_node");
            argvs[3] = INT2FIX(pack->node_id);
            rb_protect(protect_fs_ruby_call_func, (VALUE)argvs, &ret);
        }
            break;
        default:
        {
            
            struct fs_node* node = fs_server_find_node_by_id(server, pack->node_id);
            
            fs_bool is_http = fs_server_get_type(server) == t_fs_server_http;
            if( (is_http) || (node && fs_node_is_active(node))){
            
                
                VALUE argv[4];
                argv[0] = INT2FIX(pack->node_id);
                argv[1] = (VALUE)pack->data;
                argv[2] = INT2FIX(pack->len);
                argv[3] = INT2FIX(pack->pack_type);
                VALUE rb_pack = rb_class_new_instance(4, argv, rb_cPack);

                
                VALUE fun_argvs[5];
                fun_argvs[0] = INT2FIX(2);
            
                if(!is_http){
                    // 如果是通过监听进来的,直接去server
                    if(fs_node_is_from_listener(node)) {
                        fun_argvs[1] = server_instance;
                    }
                    // 如果是通过主动连接的, 去指定地方调用
                    if(fs_node_is_from_connect(node)){
                        fun_argvs[1] = fs_node_get_script_id(node);
                    }
                    fun_argvs[2] = rb_intern("on_handle_pack");
                }else{
                    fun_argvs[1] = server_instance;
                    fun_argvs[2] = rb_intern("on_request");
                }
                
                fun_argvs[3] = INT2FIX(pack->node_id);
                fun_argvs[4] = rb_pack;
                
                rb_protect(protect_fs_ruby_call_func, (VALUE)fun_argvs, &ret);
                
                
            }
            
            
            
        }
            break;
    }
    
    
    if(ret != 0){
        rb_p(rb_errinfo());
        rb_eval_string(
                       "for msg in $@; "
                       " printf msg + '\n'; "
                       "end;");
    }

    
    fs_pack_free(pack);
    
    return ret == 0 ? Qtrue : Qfalse;

    
}