/// If we're waiting for any pages, suspend our thread. void MSA_Thread_Listener::suspend(void) { bool verbose=false; if (count>0) { thread=CthSelf(); if (verbose) CkPrintf("Thread %p suspending for %d signals\n", CthSelf(),count); CthSuspend(); if (verbose) CkPrintf("Thread %p resumed\n",CthSelf()); } }
void waitqd_QDChare::waitQD(void) { if (waitStarted == 1) { CdsFifo_Enqueue((CdsFifo)threadList, (void *)CthSelf()); } else { waitStarted = 1; threadList = (void*) CdsFifo_Create(); CdsFifo_Enqueue((CdsFifo) threadList, (void *)CthSelf()); CkStartQD(CkIndex_waitqd_QDChare::onQD((CkQdMsg*)0), &thishandle); } CthSuspend(); }
void vars_check_ctv_privacy(vars_chare c) { int me = (size_t)CthSelf(); CtvAccess(ctv1) = me; vars_ack(c); CthSuspend(); if (CtvAccess(ctv1) != me) { CmiPrintf("ctv privacy test failed.\n"); exit(1); } vars_ack(c); CthFree(CthSelf()); CthSuspend(); }
CpmInvokable vars_control() { struct vars_chare c; CthThread t1,t2; t1 = CthCreate(vars_check_ctv_privacy, (void *)&c, 0); t2 = CthCreate(vars_check_ctv_privacy, (void *)&c, 0); CthSetStrategyDefault(t1); CthSetStrategyDefault(t2); CthAwaken(t1); CthAwaken(t2); c.countdown = 2; c.pending = CthSelf(); CthSuspend(); CthAwaken(t1); CthAwaken(t2); c.countdown = 2; c.pending = CthSelf(); CthSuspend(); Cpm_vars_set_cpv_and_csv(CpmSend(CpmALL), &c); c.countdown = CmiNumPes(); c.pending = CthSelf(); CthSuspend(); Cpm_vars_check_cpv_and_csv(CpmSend(CpmALL), &c); c.countdown = CmiNumPes(); c.pending = CthSelf(); CthSuspend(); Cpm_megacon_ack(CpmSend(0)); }
// require the data from a thread void ReductionMgr::require(RequireReduction* handle) { int setID = handle->reductionSetID; ReductionSet *set = reductionSets[setID]; int seqNum = handle->sequenceNumber; ReductionSetData *data = set->getData(seqNum); if ( data->submitsRecorded < set->submitsRegistered ) { set->threadIsWaiting = 1; set->waitingForSequenceNumber = seqNum; set->waitingThread = CthSelf(); //iout << "seq " << seqNum << " waiting\n" << endi; CthSuspend(); } set->threadIsWaiting = 0; //iout << "seq " << seqNum << " consumed\n" << endi; delete handle->currentData; handle->currentData = set->removeData(seqNum); handle->data = handle->currentData->data; handle->sequenceNumber = ++seqNum; }
/** threadInfo methods */ void commThreadInfo::run() { CpvAccess(CthResumeBigSimThreadIdx) = BgRegisterHandler((BgHandler)CthResumeNormalThread); tSTARTTIME = CmiWallTimer(); if (!tSTARTED) { tSTARTED = 1; // InitHandlerTable(); BgNodeStart(BgGetArgc(), BgGetArgv()); /* bnv should be initialized */ } threadQueue *commQ = myNode->commThQ; //int recvd=0; //for debugging only for (;;) { char *msg = getFullBuffer(); if (!msg) { // tCURRTIME += (CmiWallTimer()-tSTARTTIME); commQ->enq(CthSelf()); DEBUGF(("[%d] comm thread suspend.\n", BgMyNode())); CthSuspend(); DEBUGF(("[%d] comm thread assume.\n", BgMyNode())); // tSTARTTIME = CmiWallTimer(); continue; } DEBUGF(("[%d] comm thread has a msg.\n", BgMyNode())); //printf("on node %d, comm thread process a msg %p with type %d\n", BgMyNode(), msg, CmiBgMsgType(msg)); /* schedule a worker thread, if small work do it itself */ if (CmiBgMsgType(msg) == SMALL_WORK) { if (CmiBgMsgRecvTime(msg) > tCURRTIME) tCURRTIME = CmiBgMsgRecvTime(msg); // tSTARTTIME = CmiWallTimer(); /* call user registered handler function */ BgProcessMessage(this, msg); } else { #if BIGSIM_TIMING correctMsgTime(msg); #endif //recvd++; //DEBUGM(4, ("[N%d] C[%d] will add a msg (handler=%d | cnt=%d", BgMyNode(), id, CmiBgMsgHandle(msg), recvd)); int msgLen = CmiBgMsgLength(msg); DEBUGM(4, (" | len: %d | type: %d | node id: %d | src pe: %d\n" , msgLen, CmiBgMsgType(msg), CmiBgMsgNodeID(msg), CmiBgMsgSrcPe(msg))); if (CmiBgMsgThreadID(msg) == ANYTHREAD) { DEBUGF(("anythread, call addBgNodeMessage\n")); addBgNodeMessage(msg); /* non-affinity message */ DEBUGM(4, ("The message is added to node\n\n")); } else { DEBUGF(("[N%d] affinity msg, call addBgThreadMessage to tID:%d\n", BgMyNode(), CmiBgMsgThreadID(msg))); addBgThreadMessage(msg, CmiBgMsgThreadID(msg)); DEBUGM(4, ("The message is added to thread(%d)\n\n", CmiBgMsgThreadID(msg))); } } /* let other communication thread do their jobs */ // tCURRTIME += (CmiWallTimer()-tSTARTTIME); if (!schedule_flag) CthYield(); tSTARTTIME = CmiWallTimer(); } }
void barrier() { contribute (CkCallback(CkReductionTarget(Worker, barrierH), workerarray)); t = CthSelf(); CthSuspend(); }