static DWORD WINAPI call_startfn(LPVOID vindex) { int index = (int)vindex; CmiState state = Cmi_state_vector + index; if(Cmi_state_key == 0xFFFFFFFF) PerrorExit("TlsAlloc"); if(TlsSetValue(Cmi_state_key, (LPVOID)state) == 0) PerrorExit("TlsSetValue"); ConverseRunPE(0); #if 0 if (index<_Cmi_mynodesize) ConverseRunPE(0); /*Regular worker thread*/ else { /*Communication thread*/ CommunicationServerInit(); if (Cmi_charmrun_fd!=-1) while (1) CommunicationServerThread(5); } #endif return 0; }
static void CmiStartThreads(char **argv) { int i,tocreate; DWORD threadID; HANDLE thr; CmiMemLock_lock=CmiCreateLock(); comm_mutex = CmiCreateLock(); barrier_mutex = CmiCreateLock(); #ifdef CMK_NO_ASM_AVAILABLE cmiMemoryLock = CmiCreateLock(); if (CmiMyNode()==0) printf("Charm++ warning> fences and atomic operations not available in native assembly\n"); #endif Cmi_state_key = TlsAlloc(); if(Cmi_state_key == 0xFFFFFFFF) PerrorExit("TlsAlloc main"); Cmi_state_vector = (CmiState)calloc(_Cmi_mynodesize+1, sizeof(struct CmiStateStruct)); for (i=0; i<_Cmi_mynodesize; i++) CmiStateInit(i+Cmi_nodestart, i, CmiGetStateN(i)); /*Create a fake state structure for the comm. thread*/ /* CmiStateInit(-1,_Cmi_mynodesize,CmiGetStateN(_Cmi_mynodesize)); */ CmiStateInit(_Cmi_mynode+CmiNumPes(),_Cmi_mynodesize,CmiGetStateN(_Cmi_mynodesize)); #if CMK_MULTICORE || CMK_SMP_NO_COMMTHD if (!Cmi_commthread) tocreate = _Cmi_mynodesize-1; else #endif tocreate = _Cmi_mynodesize; for (i=1; i<=tocreate; i++) { if((thr = CreateThread(NULL, 0, call_startfn, (LPVOID)i, 0, &threadID)) == NULL) PerrorExit("CreateThread"); CloseHandle(thr); } if(TlsSetValue(Cmi_state_key, (LPVOID)Cmi_state_vector) == 0) PerrorExit("TlsSetValue"); }
int TermFork (PCONINFO con, PCHILDINFO pChildInfo) { char ls, ln; // 1. Looking for unused PTY/TTY Master/Slave /* Open PTY(master) from [pqrs][5-F], in fact p-z is ok? */ /* MasterPty: pty[p-z][5-f] pty[a-e][5-f] 16*16=256 SlaveTty: tty[p-z][5-f] tty[a-e][5-f] 16*16=256 */ for (ls = 'p'; ls <= 's'; ls ++) { for (ln = 5; ln <= 0xF; ln ++) { sprintf(con->ptyName, "/dev/pty%1c%1x", ls, ln); if ((con->masterPty = open (con->ptyName, O_RDWR)) >= 0) break; } if (con->masterPty >= 0) break; } if (con->masterPty < 0) { myMessage ("can not get master pty!\n"); Perror (con->ptyName); return -1; } con->ptyName[5] = 't'; /* slave tty */ if ((con->childPid = fork()) < 0) { Perror ("fork"); return -1; } else if (con->childPid == 0) { // in child process int errfd, slavePty; FILE *errfp; struct winsize twinsz; errfd = dup (2); errfp = fdopen (errfd, "w"); /* I'm child, make me process leader */ setsid (); // close any no used fd here!! close (con->masterPty); /* Open TTY(slave) */ if ((slavePty = open (con->ptyName, O_RDWR)) < 0) PerrorExit (con->ptyName); /* Set new TTY's termio with parent's termio */ tcsetattr (slavePty, TCSANOW, (struct termios*)GetOriginalTermIO ()); /* Set new terminal window size */ twinsz.ws_row = con->rows; twinsz.ws_col = con->cols; ioctl (slavePty, TIOCSWINSZ, &twinsz); /* Set std??? to pty, dup2 (oldfd, newfd) */ dup2 (slavePty, 0); dup2 (slavePty, 1); dup2 (slavePty, 2); close (slavePty); // execute the shell ChildStart (con, errfp, pChildInfo->startupMessage, pChildInfo->startupStr, pChildInfo->execProg, pChildInfo->execArgs); } return 1; // parent process }
static void CmiStartThreads(char **argv) { pthread_t pid; size_t i; int ok, tocreate; pthread_attr_t attr; int start, end; MACHSTATE(4,"CmiStartThreads") CmiMemLock_lock=CmiCreateLock(); comm_mutex=CmiCreateLock(); _smp_mutex = CmiCreateLock(); #if defined(CMK_NO_ASM_AVAILABLE) && CMK_PCQUEUE_LOCK cmiMemoryLock = CmiCreateLock(); if (CmiMyNode()==0) printf("Charm++ warning> fences and atomic operations not available in native assembly\n"); #endif #if ! (CMK_HAS_TLS_VARIABLES && !CMK_NOT_USE_TLS_THREAD) pthread_key_create(&Cmi_state_key, 0); Cmi_state_vector = (CmiState)calloc(_Cmi_mynodesize+1, sizeof(struct CmiStateStruct)); for (i=0; i<_Cmi_mynodesize; i++) CmiStateInit(i+Cmi_nodestart, i, CmiGetStateN(i)); /*Create a fake state structure for the comm. thread*/ /* CmiStateInit(-1,_Cmi_mynodesize,CmiGetStateN(_Cmi_mynodesize)); */ CmiStateInit(_Cmi_mynode+CmiNumPes(),_Cmi_mynodesize,CmiGetStateN(_Cmi_mynodesize)); #else /* for main thread */ Cmi_state_vector = (CmiState *)calloc(_Cmi_mynodesize+1, sizeof(CmiState)); #if CMK_CONVERSE_MPI /* main thread is communication thread */ if(!CharmLibInterOperate) { CmiStateInit(_Cmi_mynode+CmiNumPes(), _Cmi_mynodesize, &Cmi_mystate); Cmi_state_vector[_Cmi_mynodesize] = &Cmi_mystate; } else #endif { /* main thread is of rank 0 */ CmiStateInit(Cmi_nodestart, 0, &Cmi_mystate); Cmi_state_vector[0] = &Cmi_mystate; } #endif #if CMK_MULTICORE || CMK_SMP_NO_COMMTHD if (!Cmi_commthread) tocreate = _Cmi_mynodesize-1; else #endif tocreate = _Cmi_mynodesize; #if CMK_CONVERSE_MPI if(!CharmLibInterOperate) { start = 0; end = tocreate - 1; /* skip comm thread */ } else #endif { start = 1; end = tocreate; /* skip rank 0 main thread */ } for (i=start; i<=end; i++) { pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); ok = pthread_create(&pid, &attr, call_startfn, (void *)i); if (ok<0) PerrorExit("pthread_create"); pthread_attr_destroy(&attr); } #if ! (CMK_HAS_TLS_VARIABLES && !CMK_NOT_USE_TLS_THREAD) #if CMK_CONVERSE_MPI if(!CharmLibInterOperate) pthread_setspecific(Cmi_state_key, Cmi_state_vector+_Cmi_mynodesize); else #endif pthread_setspecific(Cmi_state_key, Cmi_state_vector); #endif MACHSTATE(4,"CmiStartThreads done") }