void wrap_OStream_free (struct fs_output_stream* ptr) { if(ptr){ fs_stream_free_output(ptr); } }
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); }
size_t fs_ruby_pack_to_data( struct fs_server* server, struct fs_pack* pack, BYTE** out){ BYTE* data = NULL; size_t len = 0; if(pack->data_output_stream_id != Qnil){ struct fs_output_stream* os = NULL; Data_Get_Struct(pack->data_output_stream_id, struct fs_output_stream, os); data = (BYTE*)fs_output_stream_get_dataptr(os); len = fs_output_stream_get_len(os); } if(pack->data_input_stream_id != Qnil){ struct fs_input_stream* is = NULL; Data_Get_Struct(pack->data_input_stream_id, struct fs_input_stream, is); data = (BYTE*)fs_input_stream_get_data_ptr(is); len = fs_input_stream_get_len(is); } if (pack->input_stream != NULL) { data = (BYTE*)fs_input_stream_get_data_ptr(pack->input_stream); len = fs_input_stream_get_len(pack->input_stream); } VALUE c_server = fs_server_get_script_id(server); VALUE byte_order = rb_funcall(c_server, rb_intern("byte_order"), 0); struct fs_output_stream* fos = fs_create_output_stream_ext; fs_stream_write_byte(fos, FIX2INT(byte_order)); fs_stream_write_int32(fos, (int32_t)len + pack_head_len); fs_stream_write_data(fos, data, len); size_t ret_len = fs_output_stream_get_len(fos); *out = fs_malloc(ret_len); memcpy(*out, fs_output_stream_get_dataptr(fos), ret_len); fs_stream_free_output(fos); if(len == 0){ rb_raise(rb_eRuntimeError, "try send data len for 0"); } return ret_len; }
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); } }
void wrap_Pack_free (struct fs_pack* ptr) { if(ptr){ // 这里的DATA是在RUBY堆里生成的. 所以不需要自己free if(ptr->input_stream){ fs_stream_free_input(ptr->input_stream); } if(ptr->output_stream){ fs_stream_free_output(ptr->output_stream); } fs_free(ptr); } }