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; }
/* 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); }