38 #include "ocr-runtime-itf.h"
40 #include "runtime-callback.h"
44 #include "phaser-api.h"
48 #define ELS_OFFSET_ASYNC 0
58 static ocrGuid_t asyncTemplateGuid;
60 typedef struct ocr_finish_t_ {
62 volatile ocrGuid_t done_event;
66 ocrGuid_t asyncEdt(u32 paramc, u64* paramv, u32 depc, ocrEdtDep_t depv[]);
69 phaser_context_t * get_phaser_context_from_els();
72 void runtime_init(
int * argc,
char ** argv) {
73 ocrConfig_t ocrConfig;
74 ocrParseArgs(*argc, (
const char**) argv, &ocrConfig);
76 ocrEdtTemplateCreate(&asyncTemplateGuid, asyncEdt, 1, 0);
79 phaser_lib_setup(get_phaser_context_from_els);
83 void runtime_finalize() {
95 static ocrGuid_t guidify_async(
async_task_t * async_task) {
98 return (ocrGuid_t) async_task;
111 ocrGuid_t edtGuid = currentEdtUserGet();
113 if (edtGuid == NULL_GUID) {
115 return root_async_task;
117 ocrGuid_t guid = ocrElsUserGet(ELS_OFFSET_ASYNC);
118 return deguidify_async(guid);
122 ocrGuid_t edtGuid = currentEdtUserGet ();
123 if (edtGuid == NULL_GUID) {
124 root_async_task = async_task;
126 ocrGuid_t guid = guidify_async(async_task);
127 ocrElsUserSet(ELS_OFFSET_ASYNC, guid);
134 phaser_context_t * get_phaser_context_from_els() {
137 if (current_async->phaser_context == NULL) {
138 current_async->phaser_context = phaser_context_construct();
140 return current_async->phaser_context;
147 ocrGuid_t asyncEdt(u32 paramc, u64* paramv, u32 depc, ocrEdtDep_t depv[]) {
152 ocrGuid_t guid = guidify_async(async_task);
153 ocrElsUserSet(ELS_OFFSET_ASYNC, guid);
156 rtcb_async_run(async_task);
169 return &(((
ocr_ddt_t*) async_task)->ddt);
172 async_task_t * rt_allocate_ddt(
struct ddf_st ** ddf_list) {
174 ddt_init((
ddt_t *)&(dd_task->ddt), ddf_list);
175 assert(dd_task &&
"calloc failed");
181 assert(async_task &&
"calloc failed");
185 void rt_deallocate_async_task(
async_task_t * async_task) {
192 assert(forasync_task &&
"calloc failed");
193 return forasync_task;
199 assert(forasync_task &&
"calloc failed");
200 return forasync_task;
206 assert(forasync_task &&
"calloc failed");
207 return forasync_task;
213 paramv[0] = (u64) async_task;
214 u8 retCode = ocrEdtCreate(&edtGuid, asyncTemplateGuid,
215 EDT_PARAM_DEF, paramv, EDT_PARAM_DEF, NULL, 0, NULL_GUID, NULL);
222 assert(ocr_finish &&
"malloc failed");
223 ocr_finish->done_event = NULL_GUID;
227 void rt_deallocate_finish(
finish_t * finish) {
229 if (ocr_finish->done_event != NULL_GUID) {
236 void rt_finish_reached_zero(
finish_t * finish) {
238 if (ocr_finish->done_event != NULL_GUID) {
239 ocrEventSatisfy(ocr_finish->done_event, NULL_GUID);
243 void rt_help_finish(
finish_t * finish) {
247 u8 retCode = ocrEventCreate((ocrGuid_t *) &(ocr_finish->done_event), OCR_EVENT_STICKY_T,
false);
251 rtcb_check_out_finish(finish);
255 ocrWait(ocr_finish->done_event);
256 assert(finish->counter == 0);
259 int rt_get_nb_workers() {
263 int rt_get_worker_id() {
264 int wid = currentWorkerId();