static gboolean test_force_set(void) { GThread *th; amsemaphore_t *sem = amsemaphore_new_with_value(10); th = g_thread_create(test_force_set_thread, (gpointer)sem, TRUE, NULL); /* sleep to give amsemaphore_decrement() a chance to block (or not). */ g_usleep(G_USEC_PER_SEC / 4); /* set it to 30, so decrement can proceed, but leave the value at 10 */ amsemaphore_force_set(sem, 30); /* sleep to give amsemaphore_wait_empty() a chance to block (or not). */ g_usleep(G_USEC_PER_SEC / 4); /* and empty out the semaphore */ amsemaphore_force_set(sem, 0); g_thread_join(th); amsemaphore_free(sem); /* it we didn't hang yet, it's all good */ return TRUE; }
static gboolean test_decr_wait(void) { GThread *th; struct test_decr_wait_data data = { NULL, FALSE }; int rv; data.sem = amsemaphore_new_with_value(10), th = g_thread_create(test_decr_wait_thread, (gpointer)&data, TRUE, NULL); /* sleep to give amsemaphore_decrement() a chance to block (or not). */ g_usleep(G_USEC_PER_SEC / 4); /* and then increment the semaphore enough that the decrement can succeed */ data.increment_called = TRUE; amsemaphore_increment(data.sem, 10); /* join the thread and see how it fared. */ rv = GPOINTER_TO_INT(g_thread_join(th)); amsemaphore_free(data.sem); return (rv == 1); }
static gboolean test_wait_empty(void) { GThread *th; amsemaphore_t *sem = amsemaphore_new_with_value(10); int rv; th = g_thread_create(test_wait_empty_thread, (gpointer)sem, TRUE, NULL); /* sleep to give amsemaphore_decrement() a chance to block (or not). */ g_usleep(G_USEC_PER_SEC / 4); /* add another 10, so decrement can hit zero next time it's called */ amsemaphore_increment(sem, 10); /* and wait on the semaphore emptying */ amsemaphore_wait_empty(sem); /* join the thread and see how it fared. */ rv = GPOINTER_TO_INT(g_thread_join(th)); amsemaphore_free(sem); return (rv == 1); }
static void finalize_impl( GObject * obj_self) { XferElementGlue *self = XFER_ELEMENT_GLUE(obj_self); /* first make sure the worker thread has finished up */ if (self->thread) g_thread_join(self->thread); /* close our pipes and fd's if they're still open */ if (self->pipe[0] != -1) close(self->pipe[0]); if (self->pipe[1] != -1) close(self->pipe[1]); if (self->input_data_socket != -1) close(self->input_data_socket); if (self->output_data_socket != -1) close(self->output_data_socket); if (self->input_listen_socket != -1) close(self->input_listen_socket); if (self->output_listen_socket != -1) close(self->output_listen_socket); if (self->read_fd != -1) close(self->read_fd); if (self->write_fd != -1) close(self->write_fd); if (self->ring) { /* empty the ring buffer, ignoring syncronization issues */ while (self->ring_used_sem->value) { if (self->ring[self->ring_tail].buf) amfree(self->ring[self->ring_tail].buf); self->ring_tail = (self->ring_tail + 1) % GLUE_RING_BUFFER_SIZE; } amfree(self->ring); amsemaphore_free(self->ring_used_sem); amsemaphore_free(self->ring_free_sem); } /* chain up */ G_OBJECT_CLASS(parent_class)->finalize(obj_self); }