I have attached a very simple ev_async example where I start one event
loop, and another loop in a thread. Both loops contain an async watcher.
When this watcher receives an event, a timer is kicked off. When the timer
fires, an async event is sent the other way. Hence I would expect these two
to bounce off each other indefinitely.

However when I run the program the slave thread's call to ev_async_send
doesn't seem to register. The callback to master_cb_async is never invoked.

$ bin/async
main - starting loop
    slave_loop - starting loop2
master_cb_timeout - sending async_send to loop2
    slave_cb_async - received async_send starting timer for loop2
    slave_cb_timeout - sending async_send to loop

Why doesn't this ev_async_send register? What am I doing wrong? If If this
is a clear case of RTFM just point me in the right direction. If not, I'd
appreciate some help.
#include <ev.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

#define FUNC __FUNCTION__

double timeout = 2.0;

ev_timer timeout_master, timeout_slave;
ev_async async_to_slave, async_to_master;

struct ev_loop *loop;
struct ev_loop *loop2;

// gcc -Wall threads_async.c -o bin/threads_async -lev -lpthread

static void slave_cb_timeout(EV_P_ ev_timer *w, int revents) {
        if (ev_async_pending(&async_to_master) == 0) {
                printf("    %s - sending async_send to loop\n", FUNC);
                ev_async_send(loop, &async_to_master);
        } else {
                printf("    %s - master ev_async is pending\n", FUNC);
        }
}

static void slave_cb_async(EV_P_ ev_async *w, int revents) {
        printf("    %s - received async_send starting timer for loop2\n", FUNC);
        ev_timer_init(&timeout_slave, slave_cb_timeout, timeout, 0.);
        ev_timer_start(loop2, &timeout_slave);
}

static void master_cb_timeout(EV_P_ ev_timer *w, int revents) {
        if (ev_async_pending(&async_to_slave)==0) {
                printf("%s - sending async_send to loop2\n", FUNC);
                ev_async_send(loop2, &async_to_slave);
        } else {
                printf("%s - slave ev_async is pending\n", FUNC);
        }
}

static void master_cb_async(EV_P_ ev_async *w, int revents) {
        printf("%s - received async_send starting timer for loop\n", FUNC);
        ev_timer_init(&timeout_master, master_cb_timeout, timeout, 0.);
        ev_timer_start(loop, &timeout_master);
}

void *slave_loop(void *args) {
        printf("    %s - starting loop2\n", FUNC);
        ev_async_init(&async_to_slave, slave_cb_async);
        ev_async_start(loop2, &async_to_slave);
        ev_loop(loop2, 0);
        return NULL;
}

int main(int argc, char** argv) {

        pthread_t thread;

        loop = ev_loop_new(0);
        loop2 = ev_loop_new(0);

        pthread_create(&thread, NULL, slave_loop, NULL);

        printf("%s - starting loop\n", FUNC);

        ev_timer_init(&timeout_master, master_cb_timeout, 0.5, 0.);
        ev_timer_start(loop, &timeout_master);
        ev_async_init(&async_to_master, master_cb_async);
        ev_async_start(loop, &async_to_master);
        ev_loop(loop, 0);

        pthread_join(thread, NULL);

        return 0;
}

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to