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); }
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); } }
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; }