Beispiel #1
0
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;
}
Beispiel #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);
    }

}
Beispiel #3
0
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);
    }
    
}