Beispiel #1
0
void
wrap_OStream_free (struct fs_output_stream* ptr)
{
    if(ptr){
        fs_stream_free_output(ptr);
    }
}
Beispiel #2
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);
    

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