00001 #include <unistd.h>
00002 #include "middle.h"
00003
00004 #if CMK_BIGSIM_CHARM
00005 #include "bgconverse.h"
00006 #endif
00007 #include "ccs-server.h"
00008 #include "conv-ccs.h"
00009
00010 #if CMK_CCS_AVAILABLE
00011 extern "C" void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData);
00012
00013 extern "C" void req_fw_handler(char *msg)
00014 {
00015 int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
00016 CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
00017 int destPE = (int)ChMessageInt(hdr->pe);
00018 if (CmiMyPe() == 0 && destPE == -1) {
00019
00020 int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
00021 CmiSyncBroadcast(len, msg);
00022 }
00023 else if (destPE < -1) {
00024
00025 int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
00026 int index, child, i;
00027 int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
00028 ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
00029 offset -= destPE * sizeof(ChMessageInt_t);
00030 if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
00031 for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
00032 }
00033 for (index=0; index<-destPE; ++index) {
00034 if (pes[index] == CmiMyPe()) break;
00035 }
00036 child = (index << 2) + 1;
00037 for (i=0; i<4; ++i) {
00038 if (child+i < -destPE) {
00039 CmiSyncSend(pes[child+i], len, msg);
00040 }
00041 }
00042 }
00043 CcsHandleRequest(hdr, msg+offset);
00044 CmiFree(msg);
00045 }
00046
00047 #ifdef _MSC_VER
00048 extern "C" size_t write(int fd, const void *buf, size_t count);
00049 #endif
00050
00051 extern "C" int rep_fw_handler_idx;
00056 extern "C" int CcsReply(CcsImplHeader *rep,int repLen,const void *repData) {
00057 int repPE = (int)ChMessageInt(rep->pe);
00058 if (repPE <= -1) {
00059
00060 CcsHandlerRec *fn;
00061 int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+repLen;
00062 char *msg=(char*)CmiAlloc(len);
00063 char *r=msg+CmiReservedHeaderSize;
00064 char *handlerStr;
00065 rep->len = ChMessageInt_new(repLen);
00066 *(CcsImplHeader *)r=*rep; r+=sizeof(CcsImplHeader);
00067 memcpy(r,repData,repLen);
00068 CmiSetHandler(msg,rep_fw_handler_idx);
00069 handlerStr=rep->handler;
00070 fn=(CcsHandlerRec *)CcsGetHandler(handlerStr);
00071 if (fn->mergeFn == NULL) CmiAbort("Called CCS broadcast with NULL merge function!\n");
00072 if (repPE == -1) {
00073
00074 CkReduce(msg, len, fn->mergeFn);
00075 } else {
00076
00077 CmiListReduce(-repPE, (int*)(rep+1), msg, len, fn->mergeFn, fn->redID);
00078 }
00079 } else {
00080 if (_conditionalDelivery == 0) CcsImpl_reply(rep, repLen, repData);
00081 else {
00082
00083 write(conditionalPipe[1], &repLen, 4);
00084 write(conditionalPipe[1], repData, repLen);
00085 }
00086 }
00087 return 0;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 void ccs_getinfo(char *msg)
00099 {
00100 int nNode=CmiNumNodes();
00101 int len=(1+nNode)*sizeof(ChMessageInt_t);
00102 ChMessageInt_t *table=(ChMessageInt_t *)malloc(len);
00103 int n;
00104 table[0]=ChMessageInt_new(nNode);
00105 for (n=0;n<nNode;n++)
00106 table[1+n]=ChMessageInt_new(CmiNodeSize(n));
00107 CcsSendReply(len,(const char *)table);
00108 free(table);
00109 CmiFree(msg);
00110 }
00111
00113 #endif
00114 #if ! CMK_HAS_GETPID
00115 typedef int pid_t;
00116 #endif
00117
00118 extern "C" {
00119
00120 CpvDeclare(void *, debugQueue);
00121 CpvDeclare(int, freezeModeFlag);
00122
00123
00124
00125
00126
00127 void CpdFreeze(void)
00128 {
00129 pid_t pid = 0;
00130 #if CMK_HAS_GETPID
00131 pid = getpid();
00132 #endif
00133 CpdNotify(CPD_FREEZE,pid);
00134 if (CpvAccess(freezeModeFlag)) return;
00135 CpvAccess(freezeModeFlag) = 1;
00136 #if ! CMK_BIGSIM_CHARM
00137 CpdFreezeModeScheduler();
00138 #endif
00139 }
00140
00141 void CpdUnFreeze(void)
00142 {
00143 CpvAccess(freezeModeFlag) = 0;
00144 }
00145
00146 int CpdIsFrozen(void) {
00147 return CpvAccess(freezeModeFlag);
00148 }
00149
00150 }
00151
00152 #if CMK_BIGSIM_CHARM
00153 #include "blue_impl.h"
00154 void BgProcessMessageFreezeMode(threadInfo *t, char *msg) {
00155
00156 #if CMK_CCS_AVAILABLE
00157 void *debugQ=CpvAccess(debugQueue);
00158 CmiAssert(msg!=NULL);
00159 int processImmediately = CpdIsDebugMessage(msg);
00160 if (processImmediately) BgProcessMessageDefault(t, msg);
00161 while (!CpvAccess(freezeModeFlag) && !CdsFifo_Empty(debugQ)) {
00162 BgProcessMessageDefault(t, (char*)CdsFifo_Dequeue(debugQ));
00163 }
00164 if (!processImmediately) {
00165 if (!CpvAccess(freezeModeFlag)) BgProcessMessageDefault(t, msg);
00166 else CdsFifo_Enqueue(debugQ, msg);
00167 }
00168 #else
00169 BgProcessMessageDefault(t, msg);
00170 #endif
00171 }
00172 #endif
00173
00174 void PrintDebugStackTrace(void *);
00175 extern "C" void * MemoryToSlot(void *ptr);
00176 extern "C" int Slot_StackTrace(void *s, void ***stack);
00177 extern "C" int Slot_ChareOwner(void *s);
00178
00179 #include <stdarg.h>
00180 void CpdNotify(int type, ...) {
00181 void *ptr; int integer, i;
00182 pid_t pid=0;
00183 int levels=64;
00184 void *stackPtrs[64];
00185 void *sl;
00186 va_list list;
00187 va_start(list, type);
00188 switch (type) {
00189 case CPD_ABORT:
00190 CmiPrintf("CPD: %d Abort %s\n",CmiMyPe(), va_arg(list, char*));
00191 break;
00192 case CPD_SIGNAL:
00193 CmiPrintf("CPD: %d Signal %d\n",CmiMyPe(), va_arg(list, int));
00194 break;
00195 case CPD_FREEZE:
00196 #if CMK_HAS_GETPID
00197 pid = getpid();
00198 #endif
00199 CmiPrintf("CPD: %d Freeze %d\n",CmiMyPe(),pid);
00200 break;
00201 case CPD_BREAKPOINT:
00202 CmiPrintf("CPD: %d BP %s\n",CmiMyPe(), va_arg(list, char*));
00203 break;
00204 case CPD_CROSSCORRUPTION:
00205 ptr = va_arg(list, void*);
00206 integer = va_arg(list, int);
00207 CmiPrintf("CPD: %d Cross %p %d ",CmiMyPe(), ptr, integer);
00208 sl = MemoryToSlot(ptr);
00209 if (sl != NULL) {
00210 int stackLen; void **stackTrace;
00211 stackLen = Slot_StackTrace(sl, &stackTrace);
00212 CmiPrintf("%d %d ",Slot_ChareOwner(sl),stackLen);
00213 for (i=0; i<stackLen; ++i) CmiPrintf("%p ",stackTrace[i]);
00214 } else {
00215 CmiPrintf("0 ");
00216 }
00217 CmiBacktraceRecord(stackPtrs,1,&levels);
00218 CmiPrintf("%d ",levels);
00219 for (i=0; i<levels; ++i) CmiPrintf("%p ",stackPtrs[i]);
00220 CmiPrintf("\n");
00221 break;
00222 }
00223 va_end(list);
00224 }