gboolean ufo_task_process (UfoTask *task, UfoBuffer **inputs, UfoBuffer *output, UfoRequisition *requisition) { gboolean result; result = UFO_TASK_GET_IFACE (task)->process (task, inputs, output, requisition); ufo_signal_emit (task, signals[PROCESSED], 0); ufo_task_node_increase_processed (UFO_TASK_NODE (task)); return result; }
static gpointer run_task (TaskLocalData *tld) { UfoBuffer *inputs[tld->n_inputs]; UfoBuffer *output; UfoTaskNode *node; UfoTaskMode mode; UfoProfiler *profiler; UfoRequisition requisition; gboolean active; node = UFO_TASK_NODE (tld->task); active = TRUE; output = NULL; profiler = g_object_ref (ufo_task_node_get_profiler (node)); if (UFO_IS_REMOTE_TASK (tld->task)) { run_remote_task (tld); return NULL; } /* mode without CPU/GPU flag */ mode = tld->mode & UFO_TASK_MODE_TYPE_MASK; while (active) { UfoGroup *group; gboolean produces; group = ufo_task_node_get_out_group (node); /* Get input buffers */ active = get_inputs (tld, inputs); if (!active) { ufo_group_finish (group); break; } /* Get output buffers */ ufo_task_get_requisition (tld->task, inputs, &requisition); produces = requisition.n_dims > 0; if (produces) { output = ufo_group_pop_output_buffer (group, &requisition); g_assert (output != NULL); } if (output != NULL) ufo_buffer_discard_location (output); switch (mode) { case UFO_TASK_MODE_PROCESSOR: ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_PROCESS | UFO_TRACE_EVENT_BEGIN); active = ufo_task_process (tld->task, inputs, output, &requisition); ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_PROCESS | UFO_TRACE_EVENT_END); ufo_task_node_increase_processed (UFO_TASK_NODE (tld->task)); break; case UFO_TASK_MODE_REDUCTOR: do { ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_PROCESS | UFO_TRACE_EVENT_BEGIN); ufo_task_process (tld->task, inputs, output, &requisition); ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_PROCESS | UFO_TRACE_EVENT_END); ufo_task_node_increase_processed (UFO_TASK_NODE (tld->task)); release_inputs (tld, inputs); active = get_inputs (tld, inputs); } while (active); break; case UFO_TASK_MODE_GENERATOR: ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_GENERATE | UFO_TRACE_EVENT_BEGIN); active = ufo_task_generate (tld->task, output, &requisition); ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_GENERATE | UFO_TRACE_EVENT_END); break; default: g_warning ("Invalid task mode: %i\n", mode); } if (active && produces && (mode != UFO_TASK_MODE_REDUCTOR)) ufo_group_push_output_buffer (group, output); /* Release buffers for further consumption */ if (active) release_inputs (tld, inputs); if (mode == UFO_TASK_MODE_REDUCTOR) { do { ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_GENERATE | UFO_TRACE_EVENT_BEGIN); active = ufo_task_generate (tld->task, output, &requisition); ufo_profiler_trace_event (profiler, UFO_TRACE_EVENT_GENERATE | UFO_TRACE_EVENT_END); if (active) { ufo_group_push_output_buffer (group, output); output = ufo_group_pop_output_buffer (group, &requisition); } } while (active); } if (!active) ufo_group_finish (group); } g_object_unref (profiler); return NULL; }