VirtualBox

Ignore:
Timestamp:
May 21, 2009 3:58:48 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
47590
Message:

tstSupSem.cpp: Extended it to cover interruptibility.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/testcase/tstSupSem.cpp

    r19892 r19895  
    3636
    3737#include <VBox/param.h>
     38#include <iprt/err.h>
    3839#include <iprt/initterm.h>
     40#include <iprt/stream.h>
    3941#include <iprt/test.h>
    40 #include <iprt/stream.h>
    41 #include <iprt/string.h>
     42#include <iprt/thread.h>
     43
     44
     45/*******************************************************************************
     46*   Structures and Typedefs                                                    *
     47*******************************************************************************/
     48static PSUPDRVSESSION   g_pSession;
     49static RTTEST           g_hTest;
     50
     51
     52
     53static DECLCALLBACK(int) tstSupSemInterruptibleSRE(RTTHREAD hSelf, void *pvUser)
     54{
     55    SUPSEMEVENT hEvent = (SUPSEMEVENT)pvUser;
     56    RTThreadUserSignal(hSelf);
     57    return SUPSemEventWaitNoResume(g_pSession, hEvent, RT_INDEFINITE_WAIT);
     58}
     59
     60
     61static DECLCALLBACK(int) tstSupSemInterruptibleMRE(RTTHREAD hSelf, void *pvUser)
     62{
     63    SUPSEMEVENTMULTI hEventMulti = (SUPSEMEVENTMULTI)pvUser;
     64    RTThreadUserSignal(hSelf);
     65    return SUPSemEventMultiWaitNoResume(g_pSession, hEventMulti, RT_INDEFINITE_WAIT);
     66}
    4267
    4368
     
    5378        return 1;
    5479    }
     80
    5581    RTTEST hTest;
    5682    rc = RTTestCreate("tstSupSem", &hTest);
     
    6086        return 1;
    6187    }
     88    g_hTest = hTest;
     89
    6290    PSUPDRVSESSION pSession;
    6391    rc = SUPR3Init(&pSession);
     
    6795        return RTTestSummaryAndDestroy(hTest);
    6896    }
     97    g_pSession = pSession;
    6998
    7099    /*
    71100     * Basic API checks.
    72101     */
    73     RTTestSub(hTest, "Single Release Event API");
     102    RTTestSub(hTest, "Single Release Event (SRE) API");
    74103    SUPSEMEVENT hEvent = NIL_SUPSEMEVENT;
    75104    RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent),          VINF_SUCCESS);
     
    89118    RTTESTI_CHECK_RC(SUPSemEventClose(pSession, NIL_SUPSEMEVENT),   VINF_SUCCESS);
    90119
    91     RTTestSub(hTest, "Multiple Release Event API");
     120    RTTestSub(hTest, "Multiple Release Event (MRE) API");
    92121    SUPSEMEVENTMULTI hEventMulti = NIL_SUPSEMEVENT;
    93122    RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEventMulti),            VINF_SUCCESS);
     
    110139    RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, NIL_SUPSEMEVENTMULTI),     VINF_SUCCESS);
    111140
     141#if !defined(RT_OS_OS2) && !defined(RT_OS_WINDOWS)
     142    RTTestSub(hTest, "SRE Interruptibility");
     143    RTTESTI_CHECK_RC(SUPSemEventCreate(pSession, &hEvent), VINF_SUCCESS);
     144    RTTHREAD hThread = NIL_RTTHREAD;
     145    RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleSRE, (void *)hEvent, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntSRE"), VINF_SUCCESS);
     146    RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
     147    RTThreadSleep(120);
     148    RTThreadPoke(hThread);
     149    int rcThread = VINF_SUCCESS;
     150    RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
     151    RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
     152    RTTESTI_CHECK_RC(SUPSemEventClose(pSession, hEvent), VINF_OBJECT_DESTROYED);
     153
     154    RTTestSub(hTest, "MRE Interruptibility");
     155    RTTESTI_CHECK_RC(SUPSemEventMultiCreate(pSession, &hEventMulti), VINF_SUCCESS);
     156    hThread = NIL_RTTHREAD;
     157    RTTESTI_CHECK_RC(RTThreadCreate(&hThread, tstSupSemInterruptibleMRE, (void *)hEventMulti, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "IntMRE"), VINF_SUCCESS);
     158    RTTESTI_CHECK_RC(RTThreadUserWait(hThread, 60*1000), VINF_SUCCESS);
     159    RTThreadSleep(120);
     160    RTThreadPoke(hThread);
     161    rcThread = VINF_SUCCESS;
     162    RTTESTI_CHECK_RC(RTThreadWait(hThread, 60*1000, &rcThread), VINF_SUCCESS);
     163    RTTESTI_CHECK_RC(rcThread, VERR_INTERRUPTED);
     164    RTTESTI_CHECK_RC(SUPSemEventMultiClose(pSession, hEventMulti), VINF_OBJECT_DESTROYED);
     165
     166#endif
     167
    112168    /*
    113169     * Done.
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette