5 typedef struct Cfuture_data_s
13 typedef struct CfutureValue_s
15 char core[CmiMsgHeaderSizeBytes];
16 struct Cfuture_data_s *data;
22 #define field_offset(t, f) ((size_t)(((t)0)->f))
23 #define void_to_value(v) ((CfutureValue)(((char*)v)-field_offset(CfutureValue,rest)))
25 CpvDeclare(int, CfutureStoreIndex);
27 Cfuture CfutureCreate(void)
29 futdata data = (futdata)malloc(sizeof(struct Cfuture_data_s));
35 result.pe = CmiMyPe();
40 static void CfutureAwaken(futdata data, CfutureValue val)
45 for (t=data->waiters; t; t=CthGetNext(t))
50 static void CfutureStore(CfutureValue m)
52 CfutureAwaken(m->data, m);
55 void *CfutureCreateBuffer(int bytes)
57 int valsize = sizeof(struct CfutureValue_s) + bytes;
58 CfutureValue m = (CfutureValue)CmiAlloc(valsize);
59 CmiSetHandler(m, CpvAccess(CfutureStoreIndex));
61 return (void*)(m->rest);
64 void CfutureDestroyBuffer(void *v)
69 void CfutureStoreBuffer(Cfuture f, void *value)
71 CfutureValue m = void_to_value(value);
72 if (f.pe == CmiMyPe()) {
73 CfutureAwaken(f.data, m);
76 CmiSyncSendAndFree(f.pe, m->valsize, m);
80 void CfutureSet(Cfuture f, void *value, int len)
82 void *copy = CfutureCreateBuffer(len);
83 memcpy(copy, value, len);
84 CfutureStoreBuffer(f, copy);
87 void *CfutureWait(Cfuture f)
89 CthThread self; CfutureValue value; futdata data;
90 if (f.pe != CmiMyPe()) {
91 CmiPrintf("error: CfutureWait: future not local.\n");
95 if (data->ready == 0) {
97 CthSetNext(self, data->waiters);
101 value = (CfutureValue)data->value;
102 return (void*)(value->rest);
105 void CfutureDestroy(Cfuture f)
107 if (f.pe != CmiMyPe()) {
108 CmiPrintf("error: CfutureDestroy: future not local.\n");
111 if (f.data->waiters) {
112 CmiPrintf("error: CfutureDestroy: destroying an active future.\n");
115 if (f.data->value) CmiFree(f.data->value);
119 extern "C" void CfutureModuleInit(void)
121 CpvInitialize(int, CfutureStoreIndex);
122 CpvAccess(CfutureStoreIndex) = CmiRegisterHandler((CmiHandler)CfutureStore);