예제 #1
0
static gboolean
on_immediate_sleep_manual_remove(HrtTask        *task,
                                 HrtWatcherFlags flags,
                                 void           *data)
{
    void *sleeping;
    TestFixture *fixture = data;

    g_assert(flags == HRT_WATCHER_FLAG_NONE);

    /* Use a flag to verify that multiple immediates don't run at once. */
    sleeping = g_object_get_data(G_OBJECT(task), "sleeping");
    g_assert(sleeping == NULL);
    g_object_set_data(G_OBJECT(task), "sleeping", GINT_TO_POINTER(1));

    g_usleep(G_USEC_PER_SEC / 20);

    sleeping = g_object_get_data(G_OBJECT(task), "sleeping");
    g_assert(sleeping != NULL);
    g_object_set_data(G_OBJECT(task), "sleeping", NULL);

    hrt_watcher_remove(fixture->tasks[0].watcher);
    fixture->tasks[0].watcher = NULL;

    fixture->tasks[0].immediates_run_count += 1;

    return TRUE;
}
예제 #2
0
/* CALLED FROM EITHER OUR TASK THREAD OR WRITE THREAD(S) */
static void
check_write_watcher(HioOutputStream *stream)
{
    gboolean need_write_watcher;

    /* can't look at current_buffer in here since it may not be our
     * task thread
     */

    /* We want to avoid removing/adding write watcher while buffers
     * simultaneously appear/disappear.  So keep both locks at once
     * until we're completely sorted out.
     */
    g_mutex_lock(stream->write_watcher_lock);
    g_mutex_lock(stream->buffers_lock);

    need_write_watcher =
        g_queue_get_length(&stream->buffers) > 0 &&
        g_atomic_int_get(&stream->fd) >= 0 &&
        g_atomic_int_get(&stream->errored) == 0;

    if (stream->write_watcher == NULL && need_write_watcher) {
        stream->write_watcher =
            hrt_task_add_io(stream->task,
                            g_atomic_int_get(&stream->fd),
                            HRT_WATCHER_FLAG_WRITE,
                            on_ready_to_write,
                            g_object_ref(stream),
                            (GDestroyNotify) g_object_unref);
    } else if (stream->write_watcher != NULL && !need_write_watcher) {
        hrt_watcher_remove(stream->write_watcher);
        stream->write_watcher = NULL;
    }

    g_mutex_unlock(stream->write_watcher_lock);
    g_mutex_unlock(stream->buffers_lock);
}