Ejemplo n.º 1
0
Archivo: core.c Proyecto: catoc/Comojs
        /* If the performance interval is zero, there's no support. */
        if (hrtime_interval_ == 0) {
            return 0;
        }

        if (!QueryPerformanceCounter(&counter)) {
            return 0;
        }

        return (uint64_t) ((double) counter.QuadPart * hrtime_interval_ * scale);
    #else
        struct timeval tv;
        gettimeofday(&tv, NULL);
        return (uint64_t) tv.tv_sec * scale + tv.tv_usec/scale;
    #endif
}

void loop_update_time (evLoop *loop){
    loop->time = loop_hrtime(1000);
}

evLoop *gLoop; /* global loop instance */
evLoop *loop_init (){
    evLoop *loop = malloc(sizeof(*loop));
    memset(loop, 0, sizeof(*loop));
    
    loop->active_handles = 0;
    loop->stop = 0;
    loop->time = 0;
    loop->timer_counter = 0;
    
    /* timer update */
    loop_update_time(loop);
    
    /* defined in select.c or any other io poll backend */
    loop_poll_create(loop);

    heap_init((struct heap*) &loop->timer_heap);
    
    QUEUE_INIT(&loop->handle_queue);
    QUEUE_INIT(&loop->closing_queue);
    QUEUE_INIT(&loop->io_queue);
    
    if (gLoop == NULL) gLoop = loop;
    
    return loop;
}
Ejemplo n.º 2
0
/* Return 0 if not found, 1 if found and removed */
int remove_loop(char *cmd_name)
{
    Loop *p;
    int val;

    if (*cmd_name == '#') {
        val = atoi(cmd_name + 1);
        p = loop_info.head;

        while (p && (p->indx != val)) {
            p = p->next;
        }
    } else {
        p = find_loop(cmd_name);
    }

    if (!p) {
        return false;
    }

    /* Head of list? */
    if (!p->prev) {
        /* Not sole node */
        if (p->next) {
            loop_info.head = p->next;
            loop_info.head->prev = (Loop *)NULL;
        } else {
            /* Sole node */
            loop_info.head = (Loop *)NULL;
            loop_info.tail = (Loop *)NULL;
        }
    } else if (!p->next) {
        /* End of list */
        loop_info.tail = p->prev;
        p->prev->next = (Loop *)NULL;
    } else {
        /* Middle of list */
        p->prev->next = p->next;
        p->next->prev = p->prev;
    }

    if (p->time == loop_info.low_time) {
        loop_update_time();
    }

    strfree(p->cmd);
    free(p);
    loop_update_index();

    return true;
}
Ejemplo n.º 3
0
Archivo: core.c Proyecto: Comojs/comojs
int loop_start (evLoop *loop, int type){
	while (loop->active_handles){
		/* closing handles */
		loop_run_closing_handles(loop);
		loop_update_time(loop);

		int timeout;

		timeout = next_timeout(loop);
		if (type == 1 && timeout > 1){
			timeout = 1;
		}

		loop_run_timers(loop);
		loop_run_immediate(loop);

		if (QUEUE_EMPTY(&loop->io_queue)) {
			#ifdef _WIN32
				Sleep(timeout);
			#else
				usleep(1000 * timeout);
			#endif
		} else {
			io_poll(loop, timeout);
		}

		/* run once */
		if (type == 1){
			loop_update_time(loop);
			loop_run_timers(loop);
			break;
		}
	}

	/* check closing handles one last time*/
	loop_run_closing_handles(loop);
	return loop->active_handles > 0;
}
Ejemplo n.º 4
0
Archivo: core.c Proyecto: catoc/Comojs
int loop_start (evLoop *loop, int type){
    while (loop->active_handles){
        /* closing handles */
        QUEUE *q;
        evHandle *handle;
        while ( !QUEUE_EMPTY(&loop->closing_queue) ){
            q = QUEUE_HEAD(&(loop)->closing_queue);
            QUEUE_REMOVE(q);
            handle = QUEUE_DATA(q, evHandle, queue);
            assert(handle);
            if (handle->close != NULL){
                handle->close(handle);
            } 
            _free_handle(handle);
        }

        loop_update_time(loop);
        
        int timeout;
        if (type == 1){
            timeout = 0;
        } else {
            timeout = next_timeout(loop);
        }

        loop_run_timers(loop);
        loop_run_immediate(loop);

        if (QUEUE_EMPTY(&loop->io_queue)) {
            #ifdef _WIN32
                Sleep(timeout);
            #else
                usleep(1000 * timeout);
            #endif
        } else {
            io_poll(loop, timeout);
        }

        /* run once */
        if (type == 1){ break; }
    }

    return loop->active_handles > 0;
}
Ejemplo n.º 5
0
int add_loop(char *cmd, long int timel, int user_defn)
{
    Loop *p;

    p = find_loop(cmd);

    if (p) {
        strfree(p->cmd);
        loop_update_time();
    } else {
        p = (Loop *)malloc(sizeof(Loop));

        if (!p) {
            return ERROR;
        }

        /* Empty list */
        if (loop_info.head == (Loop *)NULL) {
            loop_info.head = p;
            loop_info.tail = p;
            p->next = (Loop *)NULL;
            p->prev = (Loop *)NULL;
        } else {
            p->prev = loop_info.tail;
            loop_info.tail->next = p;
            p->next = NULL;
            loop_info.tail = p;
        }
    }

    p->time = timel;

    if (timel < loop_info.low_time) {
        loop_info.low_time = timel;
    }

    p->last_time = time(0);
    p->user_defn = user_defn;
    p->cmd = string(cmd);
    loop_update_index();

    return p->indx;
}