📄 y2ktmo.c
字号:
exit(1); }#endif if (PR_Close(sock) == PR_FAILURE) { fprintf(stderr, "PR_Close failed\n"); exit(1); } if (debug_mode) { fprintf(stderr, "Poll thread (scope %d) done\n", PR_GetThreadScope(PR_GetCurrentThread())); }}static void WaitCondVarThread(void *arg){ PRIntervalTime timeout = (PRIntervalTime) arg; PRIntervalTime elapsed;#if defined(XP_UNIX) || defined(WIN32) PRInt32 timeout_msecs = PR_IntervalToMilliseconds(timeout); PRInt32 elapsed_msecs;#endif#if defined(XP_UNIX) struct timeval end_time_tv;#endif#if defined(WIN32) struct _timeb end_time_tb;#endif PRLock *ml; PRCondVar *cv; ml = PR_NewLock(); if (ml == NULL) { fprintf(stderr, "PR_NewLock failed\n"); exit(1); } cv = PR_NewCondVar(ml); if (cv == NULL) { fprintf(stderr, "PR_NewCondVar failed\n"); exit(1); } PR_Lock(ml); PR_WaitCondVar(cv, timeout); PR_Unlock(ml); elapsed = (PRIntervalTime)(PR_IntervalNow() - start_time); if (elapsed + tolerance < timeout || elapsed > timeout + tolerance) { fprintf(stderr, "timeout wrong\n"); exit(1); }#if defined(XP_UNIX) gettimeofday(&end_time_tv, NULL); elapsed_msecs = 1000*(end_time_tv.tv_sec - start_time_tv.tv_sec) + (end_time_tv.tv_usec - start_time_tv.tv_usec)/1000;#endif#if defined(WIN32) _ftime(&end_time_tb); elapsed_msecs = 1000*(end_time_tb.time - start_time_tb.time) + (end_time_tb.millitm - start_time_tb.millitm);#endif#if defined(XP_UNIX) || defined(WIN32) if (elapsed_msecs + tolerance_msecs < timeout_msecs || elapsed_msecs > timeout_msecs + tolerance_msecs) { fprintf(stderr, "timeout wrong\n"); exit(1); }#endif PR_DestroyCondVar(cv); PR_DestroyLock(ml); if (debug_mode) { fprintf(stderr, "wait cond var thread (scope %d) done\n", PR_GetThreadScope(PR_GetCurrentThread())); }}static void WaitMonitorThread(void *arg){ PRIntervalTime timeout = (PRIntervalTime) arg; PRIntervalTime elapsed;#if defined(XP_UNIX) || defined(WIN32) PRInt32 timeout_msecs = PR_IntervalToMilliseconds(timeout); PRInt32 elapsed_msecs;#endif#if defined(XP_UNIX) struct timeval end_time_tv;#endif#if defined(WIN32) struct _timeb end_time_tb;#endif PRMonitor *mon; mon = PR_NewMonitor(); if (mon == NULL) { fprintf(stderr, "PR_NewMonitor failed\n"); exit(1); } PR_EnterMonitor(mon); PR_Wait(mon, timeout); PR_ExitMonitor(mon); elapsed = (PRIntervalTime)(PR_IntervalNow() - start_time); if (elapsed + tolerance < timeout || elapsed > timeout + tolerance) { fprintf(stderr, "timeout wrong\n"); exit(1); }#if defined(XP_UNIX) gettimeofday(&end_time_tv, NULL); elapsed_msecs = 1000*(end_time_tv.tv_sec - start_time_tv.tv_sec) + (end_time_tv.tv_usec - start_time_tv.tv_usec)/1000;#endif#if defined(WIN32) _ftime(&end_time_tb); elapsed_msecs = 1000*(end_time_tb.time - start_time_tb.time) + (end_time_tb.millitm - start_time_tb.millitm);#endif#if defined(XP_UNIX) || defined(WIN32) if (elapsed_msecs + tolerance_msecs < timeout_msecs || elapsed_msecs > timeout_msecs + tolerance_msecs) { fprintf(stderr, "timeout wrong\n"); exit(1); }#endif PR_DestroyMonitor(mon); if (debug_mode) { fprintf(stderr, "wait monitor thread (scope %d) done\n", PR_GetThreadScope(PR_GetCurrentThread())); }}static void WaitCMonitorThread(void *arg){ PRIntervalTime timeout = (PRIntervalTime) arg; PRIntervalTime elapsed;#if defined(XP_UNIX) || defined(WIN32) PRInt32 timeout_msecs = PR_IntervalToMilliseconds(timeout); PRInt32 elapsed_msecs;#endif#if defined(XP_UNIX) struct timeval end_time_tv;#endif#if defined(WIN32) struct _timeb end_time_tb;#endif int dummy; PR_CEnterMonitor(&dummy); PR_CWait(&dummy, timeout); PR_CExitMonitor(&dummy); elapsed = (PRIntervalTime)(PR_IntervalNow() - start_time); if (elapsed + tolerance < timeout || elapsed > timeout + tolerance) { fprintf(stderr, "timeout wrong\n"); exit(1); }#if defined(XP_UNIX) gettimeofday(&end_time_tv, NULL); elapsed_msecs = 1000*(end_time_tv.tv_sec - start_time_tv.tv_sec) + (end_time_tv.tv_usec - start_time_tv.tv_usec)/1000;#endif#if defined(WIN32) _ftime(&end_time_tb); elapsed_msecs = 1000*(end_time_tb.time - start_time_tb.time) + (end_time_tb.millitm - start_time_tb.millitm);#endif#if defined(XP_UNIX) || defined(WIN32) if (elapsed_msecs + tolerance_msecs < timeout_msecs || elapsed_msecs > timeout_msecs + tolerance_msecs) { fprintf(stderr, "timeout wrong\n"); exit(1); }#endif if (debug_mode) { fprintf(stderr, "wait cached monitor thread (scope %d) done\n", PR_GetThreadScope(PR_GetCurrentThread())); }}typedef void (*NSPRThreadFunc)(void*);static NSPRThreadFunc threadFuncs[] = { SleepThread, AcceptThread, PollThread, WaitCondVarThread, WaitMonitorThread, WaitCMonitorThread};static PRThreadScope threadScopes[] = { PR_LOCAL_THREAD, PR_GLOBAL_THREAD, PR_GLOBAL_BOUND_THREAD};static void Help(void){ fprintf(stderr, "y2ktmo test program usage:\n"); fprintf(stderr, "\t-d debug mode (FALSE)\n"); fprintf(stderr, "\t-l <secs> lead time (%d)\n", DEFAULT_LEAD_TIME_SECS); fprintf(stderr, "\t-t <msecs> tolerance (%d)\n", DEFAULT_TOLERANCE_MSECS); fprintf(stderr, "\t-h this message\n");} /* Help */int main(int argc, char **argv){ PRThread **threads; int num_thread_funcs = sizeof(threadFuncs)/sizeof(NSPRThreadFunc); int num_thread_scopes = sizeof(threadScopes)/sizeof(PRThreadScope); int i, j; int idx; PRInt32 secs; PLOptStatus os; PLOptState *opt = PL_CreateOptState(argc, argv, "dl:t:h"); while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { if (PL_OPT_BAD == os) continue; switch (opt->option) { case 'd': /* debug mode */ debug_mode = PR_TRUE; break; case 'l': /* lead time */ lead_time_secs = atoi(opt->value); break; case 't': /* tolerance */ tolerance_msecs = atoi(opt->value); break; case 'h': default: Help(); return 2; } } PL_DestroyOptState(opt); if (debug_mode) { fprintf(stderr, "lead time: %d secs\n", lead_time_secs); fprintf(stderr, "tolerance: %d msecs\n", tolerance_msecs); } start_time = PR_IntervalNow();#if defined(XP_UNIX) gettimeofday(&start_time_tv, NULL);#endif#if defined(WIN32) _ftime(&start_time_tb);#endif tolerance = PR_MillisecondsToInterval(tolerance_msecs); threads = PR_Malloc( num_thread_scopes * num_thread_funcs * sizeof(PRThread*)); if (threads == NULL) { fprintf(stderr, "PR_Malloc failed\n"); exit(1); } /* start to time out 5 seconds after a rollover date */ secs = lead_time_secs + 5; idx = 0; for (i = 0; i < num_thread_scopes; i++) { for (j = 0; j < num_thread_funcs; j++) { threads[idx] = PR_CreateThread(PR_USER_THREAD, threadFuncs[j], (void*)PR_SecondsToInterval(secs), PR_PRIORITY_NORMAL, threadScopes[i], PR_JOINABLE_THREAD, 0); if (threads[idx] == NULL) { fprintf(stderr, "PR_CreateThread failed\n"); exit(1); } secs++; idx++; } } for (idx = 0; idx < num_thread_scopes*num_thread_funcs; idx++) { if (PR_JoinThread(threads[idx]) == PR_FAILURE) { fprintf(stderr, "PR_JoinThread failed\n"); exit(1); } } PR_Free(threads); printf("PASS\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -