Sha256: dff722686a8c2199f0074b4a85cf54200704149d2ba5f5d962bfc49f86725006

Contents?: true

Size: 1.73 KB

Versions: 5

Compression:

Stored size: 1.73 KB

Contents

#include <noderb_common.h>
#include <noderb_timers.h>

#include <noderb_tools.h>
#include <noderb.h>

typedef struct {
    long target;
    int repeat;
} nodeRb_timers_handle;

void nodeRb_timers_callback(uv_timer_t* handle, int status){
    // Load data
    nodeRb_timers_handle* data = (nodeRb_timers_handle*) handle->data;
    VALUE handler = nodeRb_get_class_from_id(data->target);
    // Run callback
    rb_funcall(handler, rb_intern("call"), 1, handler);
    if(data->repeat == 0){
        // Let the GC work
        nodeRb_unregister_instance(handler);
        // Free memory
        free(data);
        free(handle);
    }
}

VALUE nodeRb_timers_stop(VALUE self){
    // Load data
    uv_timer_t *handle;
    Data_Get_Struct(rb_iv_get(self, "@_handle"), uv_timer_t, handle);
    // Stop timer
    uv_timer_stop(handle);
    // Let the GC work
    nodeRb_unregister_instance(self);
    // Free memory
    free((nodeRb_timers_handle*) handle->data);
    free(handle);
}

VALUE nodeRb_timers_once(VALUE self, VALUE timeout, VALUE repeat, VALUE handler){
    // Allocate memory
    uv_timer_t* handle = (uv_timer_t*) malloc(sizeof(uv_timer_t));
    nodeRb_timers_handle* data = (nodeRb_timers_handle*) malloc(sizeof(nodeRb_timers_handle));
    // Save from GC
    nodeRb_register_instance(handler);
    // Save data for later use
    if(rb_num2long(timeout) > 0){
        data->repeat = 1;
    }
    data->target = rb_num2long(rb_obj_id(handler));
    // Initialize
    uv_timer_init1(uv_default_loop(), handle);
    handle->data = data;
    // Save handle
    rb_iv_set(handler, "@_handle", Data_Wrap_Struct(nodeRb_get_nodeRb_pointer(), 0, NULL, handle));
    // Schedule
    uv_timer_start(handle, nodeRb_timers_callback, rb_num2long(timeout), rb_num2long(repeat));
}

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
noderb-0.0.10 ext/noderb_extension/noderb_timers.c
noderb-0.0.9 ext/noderb_extension/noderb_timers.c
noderb-0.0.8 ext/noderb_extension/noderb_timers.c
noderb-0.0.7 ext/noderb_extension/noderb_timers.c
noderb-0.0.6 ext/noderb_extension/noderb_timers.c