void CDataManager::LevelShutdownPostEntity() { if (!gpGlobals->maxClients) return; // If the thread is executing, then wait for it to finish if ( m_pSendData ) m_pSendData->WaitForFinishAndRelease(); m_pSendData = ThreadExecute( &SendData, (CFunctor**)NULL, 0 ); }
int main(int argc, char** argv) { FILE* f; int i, j; size_t size; int seedNumber; int REPORT = 0; int bytesToAllocateForArgsText = 0; puts("\r\n"); puts(argv[0]); puts("\r\n"); if(argc == 1) { PrintUsage(0); } // gather N, T, W, maxFullsteps, winPercent, seedNumber, INTERACTIVE from commandline args; N = T = W = winPercent = INTERACTIVE = 0; maxFullsteps = -1; seedNumber = time(NULL); for(i = 1; i < argc; i++) { bytesToAllocateForArgsText += strlen(argv[i]) + 1; switch(argv[i][0]) { case 'p': if(strlen(argv[i]) >= 2) { W = atoi(&(argv[i][1])); } else { printf("Invalid process count.\r\n"); PrintUsage(1); } break; case 'b': if(strlen(argv[i]) >= 2) { N = atoi(&(argv[i][1])); } else { printf("Invalid size parameter for board.\r\n"); PrintUsage(1); } break; case 't': if(strlen(argv[i]) >= 2) { T = atoi(&(argv[i][1])); } else { printf("Invalid size parameter for overlay.\r\n"); PrintUsage(1); } break; case 'c': if(strlen(argv[i]) >= 2) { winPercent = atoi(&(argv[i][1])); } else { printf("Invalid win percentage.\r\n"); PrintUsage(1); } break; case 'm': if(strlen(argv[i]) >= 2) { j = sscanf(&(argv[i][1]), "%d", &maxFullsteps); if(!j) { printf("Invalid max steps.\r\n"); PrintUsage(1); } } else { printf("Invalid max steps.\r\n"); PrintUsage(1); } break; case 's': if(strlen(argv[i]) >= 2) { j = sscanf(&(argv[i][1]), "%d", &seedNumber); if(!j) { printf("Invalid seed.\r\n"); PrintUsage(1); } } else { PrintUsage(1); } break; #ifndef DISABLE_INTERACTIVE case 'i': if(strlen(argv[i]) != 1) { printf("Invalid parameter %s.\r\n", argv[i]); PrintUsage(1); } INTERACTIVE = 1; break; #endif case 'R': REPORT = 1; break; default: printf("Invalid parameter %s.\r\n", argv[i]); PrintUsage(1); break; } } argsText = malloc(bytesToAllocateForArgsText + 1); argsText[0] = 0; for(i = 1; i < argc; i++) { strcat(argsText, argv[i]); strcat(argsText, " "); } printf("Argument text: '%s' \r\n", argsText); srand(seedNumber); if(W <= 0) { printf("Invalid or nonexistant process count, must be greater than zero.\r\n"); PrintUsage(1); } if(N < 2) { printf("Invalid or nonexistant size parameter for board, must be greater than or equal or 2.\r\n"); PrintUsage(1); } if(T <= 0 || N % T != 0) { printf("Invalid or nonexistant size parameter for overlay.\r\n"); PrintUsage(1); } if(winPercent <= 0) { printf("Invalid or nonexistant termination condition percent, must be (1-100).\r\n"); PrintUsage(1); } if(maxFullsteps < 0) { printf("Invalid or nonexistant number of max full steps, must be greater than or equal to zero.\r\n"); PrintUsage(1); } board = malloc(N * N); if(!board) { perror("Not enough memory.\r\n"); SHUTDOWN(-1); } for(i = 0; i < N * N; i++) { board[i] = rand() % 3; } // Set up the miscellaneous. maxHalfsteps = maxFullsteps * 2; percentHalfsteps = -1; maxBluePercent = maxRedPercent = 0; omp_set_num_threads(W); StartTime(); #pragma omp parallel { if(omp_get_thread_num() == 0) { W = omp_get_num_threads(); printf("W = %d\r\n", W); // If N is greater than or equal to the number of workers, there is work for every thread. if(N >= W) { // If workers divide N, then every worker does the same amount of work. if(N % W == 0) { rcLeftOver = rcSplit = N / W; } // If workers do not divide N, // Then the truncation of N / W is handed to W - 1 of W workers, // And the final worker will take all the remaining work. else { rcSplit = N / W; rcLeftOver = N - (rcSplit * (W - 1)); } } else { // Each worker up to N takes 1 row. // Leftover is set here, but won't actually used. rcSplit = 1; rcLeftOver = 1; // Set the number of workers equal to the size of the board, // so that we don't spawn threads that will always be doing nothing. W = N; } // Calculate how many times T divides N in advance. // This will be used a lot in the board evaluation phase. subregionCount = N / T; // Size of each subregion in cells. subregionCells = T * T; } #pragma omp barrier printf("%d got here\r\n", omp_get_thread_num()); ThreadExecute(omp_get_thread_num()); } if(INTERACTIVE) { if(!interactiveExit) { PrintBoard(percentHalfsteps); } } else { f = fopen("redblue.txt", "w"); PrintBoardToFile(percentHalfsteps, f); fclose(f); } free(argsText); free(board); SHUTDOWN(0); return 0; }