⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 y2ktmo.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -