static gpointer gegl_tile_backend_swap_writer_thread (gpointer ignored) { while (TRUE) { ThreadParams *params; g_mutex_lock (&mutex); while (g_queue_is_empty (queue) && !exit_thread) g_cond_wait (&queue_cond, &mutex); if (exit_thread) { g_mutex_unlock (&mutex); GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "exiting writer thread"); return NULL; } params = (ThreadParams *)g_queue_pop_head (queue); if (params->operation == OP_WRITE) { in_progress = params; params->entry->link = NULL; } g_mutex_unlock (&mutex); switch (params->operation) { case OP_WRITE: gegl_tile_backend_swap_write (params); break; case OP_TRUNCATE: if (ftruncate (out_fd, total) != 0) g_warning ("failed to resize swap file: %s", g_strerror (errno)); break; } g_mutex_lock (&mutex); in_progress = NULL; if (params->operation == OP_WRITE) gegl_tile_unref (params->tile); g_slice_free (ThreadParams, params); g_mutex_unlock (&mutex); } return NULL; }
static gpointer gegl_tile_backend_swap_writer_thread (gpointer ignored) { while (TRUE) { ThreadParams *params; g_mutex_lock (&mutex); while (g_queue_is_empty (queue) && !exit_thread) g_cond_wait (&queue_cond, &mutex); if (exit_thread) { g_mutex_unlock (&mutex); GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "exiting writer thread"); return NULL; } params = (ThreadParams *)g_queue_pop_head (queue); if (params->operation == OP_WRITE) { in_progress = params; params->entry->link = NULL; } g_mutex_unlock (&mutex); switch (params->operation) { case OP_WRITE: gegl_tile_backend_swap_write (params); break; case OP_TRUNCATE: if (ftruncate (out_fd, total) != 0) g_warning ("failed to resize swap file: %s", g_strerror (errno)); break; } g_mutex_lock (&mutex); in_progress = NULL; if (params->operation == OP_WRITE) { queue_size -= params->length + sizeof (GList) + sizeof (ThreadParams); g_free (params->source); /* unblock the main thread if the queue had gotten too big */ if (queue_size < gegl_config ()->queue_size) g_cond_signal (&max_cond); } g_slice_free (ThreadParams, params); g_mutex_unlock (&mutex); } return NULL; }