static void thread_func2(void *k) {
    int fd;

    fail_unless((fd = pa_autospawn_lock_init()) >= 0);

    pa_log("%i, Trying to acquire lock.", PA_PTR_TO_INT(k));

    for (;;) {
        struct pollfd pollfd;
        int j;

        if ((j = pa_autospawn_lock_acquire(false)) > 0)
            break;

        fail_unless(j == 0);

        memset(&pollfd, 0, sizeof(pollfd));
        pollfd.fd = fd;
        pollfd.events = POLLIN;

        fail_unless(pa_poll(&pollfd, 1, -1) == 1);

        pa_log("%i, woke up", PA_PTR_TO_INT(k));
    }

    pa_log("%i, Got the lock!, Sleeping for 5s", PA_PTR_TO_INT(k));

    pa_msleep(5000);

    pa_log("%i, Releasing", PA_PTR_TO_INT(k));

    pa_autospawn_lock_release();

    pa_autospawn_lock_done(false);
}
static int
sink_process_msg(
    pa_msgobject *o,
    int code,
    void *data,
    int64_t offset,
    pa_memchunk *chunk)
{
    struct userdata *u = PA_SINK(o)->userdata;
    
    switch (code) {
        case PA_SINK_MESSAGE_SET_STATE:
            pa_log("mesg set state");
            if (PA_PTR_TO_INT(data) == PA_SINK_RUNNING)
                u->timestamp = pa_rtclock_now();
        break;
        
        case PA_SINK_MESSAGE_GET_LATENCY:
        {
            pa_usec_t now;
            pa_log("mesg get latency");
            now = pa_rtclock_now();
            *((pa_usec_t*)data) = u->timestamp > now ? u->timestamp - now : 0;
            return 0;            
        }
    }
    pa_log("sink message: %u", code);
    return pa_sink_process_msg(o, code, data, offset, chunk);
}
static void thread_func(void*k) {
    fail_unless(pa_autospawn_lock_init() >= 0);

    pa_log("%i, Trying to acquire lock.", PA_PTR_TO_INT(k));

    fail_unless(pa_autospawn_lock_acquire(true) > 0);

    pa_log("%i, Got the lock!, Sleeping for 5s", PA_PTR_TO_INT(k));

    pa_msleep(5000);

    pa_log("%i, Releasing", PA_PTR_TO_INT(k));

    pa_autospawn_lock_release();

    pa_autospawn_lock_done(false);
}