39 #include "runtime-hclib.h"
41 #include "runtime-support.h"
43 #define EMPTY_DATUM_ERROR_MSG "can not put sentinel value for \"uninitialized\" as a value into DDF"
46 #define DDF_SATISFIED NULL
49 #define UNINITIALIZED_DDF_DATA_PTR NULL
52 #define UNINITIALIZED_DDF_WAITLIST_PTR ((struct ddt_st *) -1)
56 typedef struct ddf_st {
58 struct ddt_st * headDDTWaitList;
65 void ddt_init(
ddt_t * ddt,
ddf_t ** ddf_list) {
66 ddt->waitingFrontier = ddf_list;
67 ddt->nextDDTWaitingOnSameDDF = NULL;
76 ddf->headDDTWaitList = UNINITIALIZED_DDF_WAITLIST_PTR;
86 int lg = (null_terminated) ? nb_ddfs-1 : nb_ddfs;
91 if (null_terminated) {
104 static int register_if_ddf_not_ready(
ddt_t * ddt,
ddf_t * ddf) {
106 ddt_t * headDDTWaitList = (
ddt_t *) ddf->headDDTWaitList;
107 while (headDDTWaitList != DDF_SATISFIED && !registered) {
109 ddt->nextDDTWaitingOnSameDDF = headDDTWaitList;
112 registered = __sync_bool_compare_and_swap(&(ddf->headDDTWaitList),
113 headDDTWaitList, ddt);
117 headDDTWaitList = (
ddt_t *) ddf->headDDTWaitList;
123 if (DEBUG_DDF && registered) {
124 printf(
"ddf: %p registered %p as headDDT of ddf %p\n", ddt, ddf->headDDTWaitList, ddf);
133 int iterate_ddt_frontier(
ddt_t * ddt) {
134 ddf_t ** currentDDF = ddt->waitingFrontier;
137 printf(
"ddf: Trying to iterate ddt %p, frontier ddf is %p \n", ddt, currentDDF);
140 while ((*currentDDF) && !register_if_ddf_not_ready(ddt, *currentDDF)) {
146 if (DEBUG_DDF) { printf(
"ddf: iterate result %d\n", (*currentDDF == NULL)); }
147 ddt->waitingFrontier = currentDDF;
148 return (*currentDDF == NULL);
156 if (ddf->datum == UNINITIALIZED_DDF_DATA_PTR) {
159 return (
void *) ddf->datum;
168 assert(datum != UNINITIALIZED_DDF_DATA_PTR && EMPTY_DATUM_ERROR_MSG);
169 assert(ddf != NULL &&
"error: can't DDF is a pointer to NULL");
171 if (DEBUG_DDF) { printf(
"ddf: put datum %p\n", ddf->datum); }
172 assert(ddf->datum == NULL &&
"error: violated single assignment property for DDFs");
174 volatile ddt_t * headDDTWaitList = NULL;
176 headDDTWaitList = ddf->headDDTWaitList;
177 if (DEBUG_DDF) { printf(
"ddf: Retrieve ddf %p head's ddt %p\n", ddf, headDDTWaitList); }
180 while (!__sync_bool_compare_and_swap(&(ddf->headDDTWaitList),
181 (
struct ddt_st *) headDDTWaitList, DDF_SATISFIED )) {
182 headDDTWaitList = ddf->headDDTWaitList;
185 printf(
"ddf: Put successful on ddf %p set head's ddf to %p\n", ddf, ddf->headDDTWaitList);
189 while (currDDT != UNINITIALIZED_DDF_WAITLIST_PTR) {
190 if (DEBUG_DDF) { printf(
"ddf: Trying to iterate frontier of ddt %p\n", currDDT); }
191 if (iterate_ddt_frontier(currDDT)) {
193 async_task_t * async_task = rt_ddt_to_async_task(currDDT);
194 if (DEBUG_DDF) { printf(
"ddf: async_task %p\n", async_task); }
195 try_schedule_async(async_task);
197 currDDT = currDDT->nextDDTWaitingOnSameDDF;