![]() |
Helixis 1.0
Task Programming API
|
Go to the source code of this file.
Functions | |
void | hlx_scheduler_construct (void) |
void | hlx_scheduler_destruct (void) |
hlx_group_id | hlx_core_create_group (void) |
hlx_group * | hlx_sheduler_find_lighter_group (void) |
void | hlx_core_add_task_in_group (hlx_task_func task_func, void *data, hlx_group_id group_id) |
void | hlx_core_add_task (hlx_task_func task_func, void *data) |
hlx_task * | hlx_scheduler_init_task (hlx_task_func task_func, void *data, hlx_group *group, hlx_task_callback callback) |
int | hlx_scheduler_schedule_group (hlx_group *group) |
Variables | |
hlx_api | gl_api |
hlx_scheduler | gl_scheduler |
void hlx_core_add_task | ( | hlx_task_func | task, |
void * | data | ||
) |
Add a task in the lighter group
task | The task to push. |
data | User argument (optionnal). |
Definition at line 134 of file sched.c.
References hlx_core_add_task_in_group_callback(), and hlx_sheduler_find_lighter_group().
{ hlx_core_add_task_in_group_callback(task_func, data, hlx_sheduler_find_lighter_group()->id, 0, 0); }
void hlx_core_add_task_in_group | ( | hlx_task_func | task, |
void * | data, | ||
hlx_group_id | group_id | ||
) |
Add a task in a group
task | The task to push. |
data | User argument (optionnal). |
group_id | Group id where the task will be pushed. |
Definition at line 129 of file sched.c.
References hlx_core_add_task_in_group_callback().
{ hlx_core_add_task_in_group_callback(task_func, data, group_id, 0, 0); }
hlx_group_id hlx_core_create_group | ( | void | ) |
Create a new group of tasks in the scheduler
Definition at line 93 of file sched.c.
References hlx_scheduler::groups, hlx_group_construct(), hlx_list_push_back(), hlx_group::id, and hlx_api::malloc_entry.
{ hlx_group* g; if ((g = gl_api.malloc_entry(sizeof(*g))) == 0) return ((hlx_group_id)-1); hlx_group_construct(g); hlx_list_push_back(&gl_scheduler.groups, g); return (g->id); }
void hlx_scheduler_construct | ( | void | ) |
Definition at line 49 of file sched.c.
References hlx_scheduler::cpu_count, hlx_scheduler::default_groups_id, hlx_api::get_cpu_count_entry, hlx_scheduler::groups, hlx_group_construct(), hlx_list_construct(), hlx_list_push_back(), hlx_scheduler::loop, and hlx_api::malloc_entry.
Referenced by hlx_core_init().
{ unsigned int i; hlx_group* group; gl_scheduler.loop = 0; #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) gl_scheduler.launched = 0; #endif if (gl_api.get_cpu_count_entry != 0) { gl_scheduler.cpu_count = gl_api.get_cpu_count_entry(); if (gl_scheduler.cpu_count < 1) gl_scheduler.cpu_count = 1; } else gl_scheduler.cpu_count = 1; hlx_list_construct(&gl_scheduler.groups); gl_scheduler.default_groups_id = gl_api.malloc_entry(gl_scheduler.cpu_count * sizeof(*(gl_scheduler.default_groups_id))); if (!gl_scheduler.default_groups_id) return; for (i = 0; i < gl_scheduler.cpu_count; ++i) { group = gl_api.malloc_entry(sizeof(*group)); hlx_group_construct(group); hlx_list_push_back(&gl_scheduler.groups, group); gl_scheduler.default_groups_id[i] = (hlx_group_id)group; } }
void hlx_scheduler_destruct | ( | void | ) |
Definition at line 79 of file sched.c.
References _hlx_list_node::data, hlx_scheduler::default_groups_id, hlx_list::first, hlx_api::free_entry, hlx_scheduler::groups, hlx_event_get_default_manager(), hlx_event_manager_destroy(), hlx_group_destruct(), hlx_list_clear(), and _hlx_list_node::next.
Referenced by hlx_core_destroy().
{ hlx_list_node* it; for (it = gl_scheduler.groups.first; it != 0; it = it->next) { hlx_group_destruct(it->data); gl_api.free_entry(it->data); } hlx_list_clear(&gl_scheduler.groups); gl_api.free_entry(gl_scheduler.default_groups_id); hlx_event_manager_destroy(hlx_event_get_default_manager()); }
hlx_task* hlx_scheduler_init_task | ( | hlx_task_func | task_func, |
void * | data, | ||
hlx_group * | group, | ||
hlx_task_callback | callback | ||
) |
Definition at line 139 of file sched.c.
References hlx_task::callback, hlx_task::ctx, hlx_task::data, hlx_task::group_id, HLX_TASK_STATUS_RUN, hlx_group::id, hlx_api::malloc_entry, hlx_task::stack, hlx_task::status, and hlx_task::task_func.
Referenced by hlx_core_add_task_in_group_callback(), and hlx_core_add_task_in_group_callback2().
int hlx_scheduler_schedule_group | ( | hlx_group * | group | ) |
Definition at line 156 of file sched.c.
References hlx_task::callback, hlx_task::ctx, hlx_task::data, _hlx_list_node::data, hlx_list::first, hlx_api::free_entry, hlx_task::group_id, HLX_ENDED, HLX_EXITED, hlx_list_erase(), HLX_MEMORY_EXHAUSTED, HLX_TASK_STATUS_RUN, _hlx_list_node::next, hlx_task::stack, hlx_task::status, hlx_task::task_func, and hlx_group::tasks.
{ hlx_list_node* it; hlx_list_node* tmp; hlx_task* task; int loop; int ret; loop = 0; it = group->tasks.first; while (it) { task = it->data; if (task->status != HLX_TASK_STATUS_RUN) { it = it->next; continue; } if (!task->task_func) ret = HLX_EXITED; else ret = task->task_func(&(task->ctx), task->group_id, &(task->stack), task->data); if (ret == HLX_ENDED || ret == HLX_EXITED || ret == HLX_MEMORY_EXHAUSTED) { if (task->callback != 0) task->callback(task->data, task->group_id, ret); if (task->stack != 0) gl_api.free_entry(task->stack); gl_api.free_entry(task); tmp = it->next; hlx_list_erase(&group->tasks, it); it = tmp; } else { loop = 1; it = it->next; } } return (loop); }
hlx_group* hlx_sheduler_find_lighter_group | ( | void | ) |
Definition at line 104 of file sched.c.
References hlx_scheduler::cpu_count, hlx_scheduler::default_groups_id, and hlx_group_get_size().
Referenced by hlx_core_add_task(), and hlx_core_add_task_callback().
{ unsigned int i; unsigned int best_size; unsigned int group_size; hlx_group* best; hlx_group* group; best_size = 0; group_size = 0; best = 0; group = 0; for (i = 0; i < gl_scheduler.cpu_count; ++i) { group = (hlx_group*)(gl_scheduler.default_groups_id[i]); group_size = hlx_group_get_size(group); if (best == 0 || best_size > group_size) { best = group; best_size = group_size; } } return (group); }
Definition at line 50 of file parallel_sched.c.