VALUE rb_Node_close(VALUE self){ struct fs_node* node = NULL; Data_Get_Struct(self, struct fs_node, node); if(node) { fs_node_set_script_id(node, Qnil); if(!fs_node_is_closed(node)){ fs_node_shudown(node); } return Qtrue; }else{ rb_raise(rb_eRuntimeError, "NODE is NULL"); } return Qfalse; }
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 fs_node_send_data(struct fs_node* node, BYTE* data, size_t len){ if(fs_node_is_closed(node)){ fprintf(stderr, "Try to an closed node[%d] to send data", node->node_id); return; } pthread_mutex_lock(&node->write_mutex); if(!node->send_buffer){ fprintf(stderr, "Try to an unreachable node[%d] to send data", node->node_id); pthread_mutex_unlock(&node->write_mutex); return; } fs_stream_write_data(node->send_buffer, data, len); pthread_mutex_unlock(&node->write_mutex); if(!event_pending(node->write_ev, EV_WRITE, NULL)){ event_add(node->write_ev, NULL); } }