00001
00002
00003
00004
00005
00006
00007
00008 #include "conv-onesided.h"
00009
00010 #ifdef __ONESIDED_IMPL
00011 #ifdef __ONESIDED_NO_HARDWARE
00012
00013 #ifndef _CONV_ONESIDED_C_
00014 #define _CONV_ONESIDED_C_
00015
00016 struct CmiCb {
00017 CmiRdmaCallbackFn fn;
00018 void *param;
00019 };
00020 typedef struct CmiCb CmiCb;
00021
00022
00023
00024
00025
00026 struct CmiRMA {
00027 int type;
00028 union {
00029 int completed;
00030 CmiCb *cb;
00031 } ready;
00032 };
00033 typedef struct CmiRMA CmiRMA;
00034
00035 struct CmiRMAMsg {
00036 char core[CmiMsgHeaderSizeBytes];
00037 CmiRMA* stat;
00038 };
00039 typedef struct CmiRMAMsg CmiRMAMsg;
00040
00041 struct RMAPutMsg {
00042 char core[CmiMsgHeaderSizeBytes];
00043 void *Saddr;
00044 void *Taddr;
00045 unsigned int size;
00046 unsigned int targetId;
00047 unsigned int sourceId;
00048 CmiRMA *stat;
00049 };
00050 typedef struct RMAPutMsg RMAPutMsg;
00051
00052 int CmiRegisterMemory(void *addr, unsigned int size){
00053
00054 return 1;
00055 }
00056
00057 int CmiUnRegisterMemory(void *addr, unsigned int size){
00058
00059 return 1;
00060 }
00061
00062 void handlePutSrc(void *msg) {
00063 CmiRMA* stat = ((CmiRMAMsg*)msg)->stat;
00064 if(stat->type==1) {
00065 stat->ready.completed = 1;
00066
00067 }
00068 else {
00069 (*(stat->ready.cb->fn))(stat->ready.cb->param);
00070 CmiFree(stat->ready.cb);
00071 CmiFree(stat);
00072 }
00073 CmiFree(msg);
00074 return;
00075 }
00076
00077 void handlePutDest(void *msg) {
00078 RMAPutMsg *context = (RMAPutMsg*)msg;
00079 void* putdata = (void*)(((char*)(msg))+sizeof(RMAPutMsg));
00080 unsigned int sizeRmaStat = sizeof(CmiRMAMsg);
00081 void *msgRmaStat;
00082
00083 memcpy(context->Taddr,putdata,context->size);
00084
00085 msgRmaStat = (void*)CmiAlloc(sizeRmaStat);
00086 ((CmiRMAMsg*)msgRmaStat)->stat = context->stat;
00087 CmiSetHandler(msgRmaStat,putSrcHandler);
00088 CmiSyncSendAndFree(context->sourceId,sizeRmaStat,msgRmaStat);
00089
00090 CmiFree(msg);
00091 return;
00092 }
00093
00094 void *CmiPut(unsigned int sourceId, unsigned int targetId, void *Saddr, void *Taddr, unsigned int size) {
00095 unsigned int sizeRma = sizeof(RMAPutMsg)+size;
00096 void *msgRma = (void*)CmiAlloc(sizeRma);
00097 RMAPutMsg *context = (RMAPutMsg*)msgRma;
00098
00099 context->Saddr = Saddr;
00100 context->Taddr = Taddr;
00101 context->size = size;
00102 context->targetId = targetId;
00103 context->sourceId = sourceId;
00104 context->stat = (CmiRMA*)CmiAlloc(sizeof(CmiRMA));
00105 context->stat->type = 1;
00106 context->stat->ready.completed = 0;
00107 void* putdata = (void*)(((char*)(msgRma))+sizeof(RMAPutMsg));
00108 memcpy(putdata,Saddr,size);
00109 void *stat = context->stat;
00110
00111 CmiSetHandler(msgRma,putDestHandler);
00112 CmiSyncSendAndFree(targetId,sizeRma,msgRma);
00113
00114 return stat;
00115 }
00116
00117 void CmiPutCb(unsigned int sourceId, unsigned int targetId, void *Saddr, void *Taddr, unsigned int size, CmiRdmaCallbackFn fn, void *param) {
00118 unsigned int sizeRma = sizeof(RMAPutMsg)+size;
00119 void *msgRma = (void*)CmiAlloc(sizeRma);
00120 RMAPutMsg *context = (RMAPutMsg*)msgRma;
00121
00122 context->Saddr = Saddr;
00123 context->Taddr = Taddr;
00124 context->size = size;
00125 context->targetId = targetId;
00126 context->sourceId = sourceId;
00127 context->stat = (CmiRMA*)CmiAlloc(sizeof(CmiRMA));
00128 context->stat->type = 0;
00129 context->stat->ready.cb = (CmiCb*)CmiAlloc(sizeof(CmiCb));
00130 context->stat->ready.cb->fn = fn;
00131 context->stat->ready.cb->param = param;
00132 void* putdata = (void*)(((char*)(msgRma))+sizeof(RMAPutMsg));
00133 memcpy(putdata,Saddr,size);
00134
00135 CmiSetHandler(msgRma,putDestHandler);
00136 CmiSyncSendAndFree(targetId,sizeRma,msgRma);
00137 return;
00138 }
00139
00140 void handleGetSrc(void *msg) {
00141 RMAPutMsg *context = (RMAPutMsg*)msg;
00142 void* putdata = (void*)(((char*)(msg))+sizeof(RMAPutMsg));
00143
00144 memcpy(context->Saddr,putdata,context->size);
00145
00146 if(context->stat->type==1) {
00147 context->stat->ready.completed = 1;
00148
00149 }
00150 else {
00151 (*(context->stat->ready.cb->fn))(context->stat->ready.cb->param);
00152 CmiFree(context->stat->ready.cb);
00153 CmiFree(context->stat);
00154 }
00155 CmiFree(msg);
00156 return;
00157 }
00158
00159 void handleGetDest(void *msg) {
00160 RMAPutMsg *context1 = (RMAPutMsg*)msg;
00161 unsigned int sizeRma = sizeof(RMAPutMsg)+context1->size;
00162 void *msgRma = (void*)CmiAlloc(sizeRma);
00163 RMAPutMsg *context = (RMAPutMsg*)msgRma;
00164 memcpy(context,context1,sizeof(RMAPutMsg));
00165 void* putdata = (void*)(((char*)(msgRma))+sizeof(RMAPutMsg));
00166 memcpy(putdata,context->Taddr,context->size);
00167 CmiSetHandler(msgRma,getSrcHandler);
00168 CmiSyncSendAndFree(context->sourceId,sizeRma,msgRma);
00169 CmiFree(msg);
00170 return;
00171 }
00172
00173 void *CmiGet(unsigned int sourceId, unsigned int targetId, void *Saddr, void *Taddr, unsigned int size) {
00174 unsigned int sizeRma;
00175 char *msgRma;
00176 RMAPutMsg *context;
00177 sizeRma = sizeof(RMAPutMsg);
00178 msgRma = (char*)CmiAlloc(sizeRma*sizeof(char));
00179
00180 context = (RMAPutMsg*)msgRma;
00181 context->Saddr = Saddr;
00182 context->Taddr = Taddr;
00183 context->size = size;
00184 context->targetId = targetId;
00185 context->sourceId = sourceId;
00186 context->stat = (CmiRMA*)CmiAlloc(sizeof(CmiRMA));
00187 context->stat->type = 1;
00188 context->stat->ready.completed = 0;
00189 void *stat = context->stat;
00190
00191 CmiSetHandler(msgRma,getDestHandler);
00192 CmiSyncSendAndFree(targetId,sizeRma,msgRma);
00193 return stat;
00194 }
00195
00196 void CmiGetCb(unsigned int sourceId, unsigned int targetId, void *Saddr, void *Taddr, unsigned int size, CmiRdmaCallbackFn fn, void *param) {
00197 unsigned int sizeRma;
00198 char *msgRma;
00199 RMAPutMsg *context;
00200 sizeRma = sizeof(RMAPutMsg);
00201 msgRma = (char*)CmiAlloc(sizeRma*sizeof(char));
00202
00203 context = (RMAPutMsg*)msgRma;
00204 context->Saddr = Saddr;
00205 context->Taddr = Taddr;
00206 context->size = size;
00207 context->targetId = targetId;
00208 context->sourceId = sourceId;
00209 context->stat = (CmiRMA*)CmiAlloc(sizeof(CmiRMA));
00210 context->stat->type = 0;
00211 context->stat->ready.cb = (CmiCb*)CmiAlloc(sizeof(CmiCb));
00212 context->stat->ready.cb->fn = fn;
00213 context->stat->ready.cb->param = param;
00214
00215 CmiSetHandler(msgRma,getDestHandler);
00216 CmiSyncSendAndFree(targetId,sizeRma,msgRma);
00217 return;
00218 }
00219
00220
00221 int CmiWaitTest(void *obj){
00222 CmiRMA *stat = (CmiRMA*)obj;
00223 return stat->ready.completed;
00224 }
00225
00226 #endif
00227 #endif
00228 #endif
00229