tests/immsv/common/immtest.c                               |   27 ++
 tests/immsv/common/immtest.h                               |    4 +
 tests/immsv/implementer/test_SaImmOiCcb.c                  |   61 ++++-
 tests/immsv/implementer/test_saImmOiAugmentCcbInitialize.c |   47 +++-
 tests/immsv/implementer/test_saImmOiImplementerSet.c       |   58 ++--
 tests/immsv/implementer/test_saImmOiLongDn.c               |  133 ++++--------
 tests/immsv/implementer/test_saImmOiSaStringT.c            |  101 +++++----
 tests/immsv/management/test_saImmOmSaStringT.c             |   40 ++-
 8 files changed, 268 insertions(+), 203 deletions(-)


Many IMM test-cases rely on poll timeout to end the while loop.
That will slow the test because it has to wait for the timeout.
Also the test-cases will fail if a callback doesn't come before the timeout 
occurs.
This patch removes those timeout and uses a pair of piped file-descriptors to 
stop the thread.

diff --git a/tests/immsv/common/immtest.c b/tests/immsv/common/immtest.c
--- a/tests/immsv/common/immtest.c
+++ b/tests/immsv/common/immtest.c
@@ -46,6 +46,8 @@ const SaConstStringT rootObjS = "Obj1,rd
 void (*test_setup)(void) = NULL;
 void (*test_cleanup)(void) = NULL;
 
+int stopFd[2] = { -1, -1};
+
 void usage(const char *progname) {
        printf("Usage: %s [-h] [--help] [--longDn] [suite [testcase]]\n\n", 
progname);
        printf("OPTIONS:\n");
@@ -122,6 +124,31 @@ int main(int argc, char **argv)
     return rc;
 }  
 
+void pipe_stop_fd() {
+    if (pipe(stopFd) != 0) {
+        fprintf(stderr, "Failed to pipe fd\n");
+        exit(1);
+    }
+}
+
+void indicate_stop_fd() {
+    uint64_t num = rand(); /* Just a random number */
+    ssize_t bytes = write(stopFd[1], &num, sizeof(uint64_t));
+    if (bytes != sizeof(uint64_t)) {
+        fprintf(stderr, "Failed to write to fd\n");
+        exit(1);
+    }
+}
+
+void close_stop_fd() {
+    if (close(stopFd[0]) != 0 || close(stopFd[1]) != 0) {
+        fprintf(stderr, "Failed to close fd\n");
+        exit(1);
+    }
+    stopFd[0] = -1;
+    stopFd[1] = -1;
+}
+
 SaAisErrorT config_class_create(SaImmHandleT immHandle)
 {
     SaAisErrorT err=SA_AIS_OK;
diff --git a/tests/immsv/common/immtest.h b/tests/immsv/common/immtest.h
--- a/tests/immsv/common/immtest.h
+++ b/tests/immsv/common/immtest.h
@@ -34,6 +34,7 @@ extern const SaVersionT constImmVersion;
 extern SaVersionT immVersion;
 extern SaAisErrorT rc;
 extern SaSelectionObjectT selectionObject;
+extern int stopFd[];
 
 /* Management globals */
 extern SaImmHandleT immOmHandle;
@@ -50,6 +51,9 @@ extern SaImmHandleT immOiHandle;
 extern SaImmOiCallbacksT_2 immOiCallbacks;
 
 /* Common functions */
+void pipe_stop_fd();
+void indicate_stop_fd();
+void close_stop_fd();
 SaAisErrorT config_class_create(SaImmHandleT immHandle);
 SaAisErrorT config_class_delete(SaImmHandleT immHandle);
 SaAisErrorT runtime_class_create(SaImmHandleT immHandle);
diff --git a/tests/immsv/implementer/test_SaImmOiCcb.c 
b/tests/immsv/implementer/test_SaImmOiCcb.c
--- a/tests/immsv/implementer/test_SaImmOiCcb.c
+++ b/tests/immsv/implementer/test_SaImmOiCcb.c
@@ -171,7 +171,7 @@ done:
  */
 static void *objectImplementerThreadMain(void *arg)
 {
-    struct pollfd fds[1];
+    struct pollfd fds[2];
     int ret;
     char buf[256];
     const SaImmOiImplementerNameT implementerName = buf;
@@ -189,20 +189,21 @@ static void *objectImplementerThreadMain
 
     fds[0].fd = (int) selObj;
     fds[0].events = POLLIN;
+    fds[1].fd = stopFd[0];
+    fds[1].events = POLLIN;
 
     /* We can receive five callbacks: create, delete, modify, completed & 
apply */
     while(1)
     {
-        ret = poll(fds, 1, 2000);
-        if (ret == 0)
-        {
-            TRACE("poll timeout\n");
-            break;
-        }
+        ret = poll(fds, 2, -1);
         if (ret == -1)
             fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-        safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+        if (fds[0].revents & POLLIN)
+            safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+
+        if (fds[1].revents & POLLIN)
+            break;
     }
 
     if (saImmOiObjectImplementerRelease(handle, objectName, SA_IMM_ONE) == 
SA_AIS_ERR_NOT_EXIST)
@@ -223,7 +224,7 @@ static void *objectImplementerThreadMain
  */
 static void *classImplementerThreadMain(void *arg)
 {
-    struct pollfd fds[1];
+    struct pollfd fds[2];
     int ret;
     const SaImmOiImplementerNameT implementerName = (SaImmOiImplementerNameT) 
__FUNCTION__;
     SaSelectionObjectT selObj;
@@ -239,19 +240,20 @@ static void *classImplementerThreadMain(
 
     fds[0].fd = (int) selObj;
     fds[0].events = POLLIN;
+    fds[1].fd = stopFd[0];
+    fds[1].events = POLLIN;
 
     while(1)
     {
-        ret = poll(fds, 1, 2000);
-        if (ret == 0)
-        {
-            TRACE("poll timeout\n");
-            break;
-        }
+        ret = poll(fds, 2, -1);
         if (ret == -1)
             fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-        safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+        if (fds[0].revents & POLLIN)
+            safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+
+        if (fds[1].revents & POLLIN)
+            break;
     }
 
     safassert(saImmOiClassImplementerRelease(handle, className), SA_AIS_OK);
@@ -409,6 +411,7 @@ static void saImmOiCcb_01(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, objectImplementerThreadMain, 
&dnObj1);
     assert(res == 0);
@@ -418,8 +421,10 @@ static void saImmOiCcb_01(void)
     sleep(1); /* Race condition, allow implementer threads to set up !*/
     rc = om_ccb_exec(0);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
     pthread_join(thread[1], NULL);
+    close_stop_fd();
 
     test_validate(rc, SA_AIS_OK);
 
@@ -435,6 +440,7 @@ static void saImmOiCcb_02(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, objectImplementerThreadMain, 
&dnObj1);
     assert(res == 0);
@@ -445,8 +451,10 @@ static void saImmOiCcb_02(void)
     sleep(1); /* Race condition, allow implementer threads to set up!*/
     rc = om_ccb_exec(0);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
     pthread_join(thread[1], NULL);
+    close_stop_fd();
 
     if(rc != SA_AIS_ERR_BAD_OPERATION) {
         /* Note  that the error code returned by implementer need not
@@ -472,6 +480,7 @@ static void saImmOiCcb_03(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, classImplementerThreadMain, 
configClassName);
     assert(res == 0);
@@ -479,7 +488,9 @@ static void saImmOiCcb_03(void)
     sleep(1); /* Race condition, allow implementer threads to set up!*/
     rc = om_ccb_exec(0);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
+    close_stop_fd();
  
     test_validate(rc, SA_AIS_OK);
 
@@ -495,6 +506,7 @@ static void saImmOiCcb_04(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&threadid, NULL, classImplementerThreadMain, 
configClassName);
     assert(res == 0);
@@ -503,7 +515,9 @@ static void saImmOiCcb_04(void)
     sleep(1); /* Race condition, allow implementer threads to set up!*/
     rc = om_ccb_exec(0);
 
+    indicate_stop_fd();
     pthread_join(threadid, NULL);
+    close_stop_fd();
  
     if(rc != SA_AIS_ERR_BAD_OPERATION) {
         /* Note  that the error code returned by implementer need not
@@ -530,6 +544,7 @@ static void saImmOiCcb_05(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&threadid, NULL, classImplementerThreadMain, 
configClassName);
     assert(res == 0);
@@ -555,7 +570,9 @@ static void saImmOiCcb_05(void)
     }
     free(returnErrorStrings);
 
+    indicate_stop_fd();
     pthread_join(threadid, NULL);
+    close_stop_fd();
 
     if(rc != SA_AIS_ERR_BAD_OPERATION) {
         /* Note  that the error code returned by implementer need not
@@ -581,6 +598,7 @@ static void saImmOiCcb_06(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, objectImplementerThreadMain, 
&dnObj1);
     assert(res == 0);
@@ -590,8 +608,10 @@ static void saImmOiCcb_06(void)
     sleep(1); /* Race condition, allow implementer threads to set up !*/
     rc = om_ccb_exec(1);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
     pthread_join(thread[1], NULL);
+    close_stop_fd();
 
     test_validate(rc, SA_AIS_OK);
 
@@ -607,6 +627,7 @@ static void saImmOiCcb_07(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, objectImplementerThreadMain, 
&dnObj1);
     assert(res == 0);
@@ -616,8 +637,10 @@ static void saImmOiCcb_07(void)
     sleep(1); /* Race condition, allow implementer threads to set up !*/
     rc = om_ccb_exec(2);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
     pthread_join(thread[1], NULL);
+    close_stop_fd();
 
     test_validate(rc, SA_AIS_OK);
 
@@ -633,6 +656,7 @@ static void saImmOiCcb_08(void)
     TRACE_ENTER();
     om_setup();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&thread[0], NULL, objectImplementerThreadMain, 
&dnObj1);
     assert(res == 0);
@@ -643,8 +667,10 @@ static void saImmOiCcb_08(void)
     sleep(1); /* Race condition, allow implementer threads to set up!*/
     rc = om_ccb_exec(3);
 
+    indicate_stop_fd();
     pthread_join(thread[0], NULL);
     pthread_join(thread[1], NULL);
+    close_stop_fd();
 
     test_validate(rc, SA_AIS_ERR_FAILED_OPERATION);
 
@@ -668,6 +694,7 @@ static void saImmOiCcb_09(void)
 
     TRACE_ENTER();
 
+    pipe_stop_fd();
     /* Create implementer threads */
     res = pthread_create(&threadid, NULL, classImplementerThreadMain, 
configClassName);
     assert(res == 0);
@@ -706,7 +733,9 @@ static void saImmOiCcb_09(void)
     safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
     safassert(saImmOmFinalize(omHandle), SA_AIS_OK);
 
+    indicate_stop_fd();
     pthread_join(threadid, NULL);
+    close_stop_fd();
 
     saImmOiCcbCompletedCallback_response = SA_AIS_OK;
     TRACE_LEAVE();
diff --git a/tests/immsv/implementer/test_saImmOiAugmentCcbInitialize.c 
b/tests/immsv/implementer/test_saImmOiAugmentCcbInitialize.c
--- a/tests/immsv/implementer/test_saImmOiAugmentCcbInitialize.c
+++ b/tests/immsv/implementer/test_saImmOiAugmentCcbInitialize.c
@@ -364,7 +364,7 @@ static void *immOiObjectDispatchThread(v
     SaImmOiImplementerNameT implementerName = immArg->implementerName;
     SaImmOiHandleT handle;
     SaSelectionObjectT selObj;
-    struct pollfd fds[1];
+    struct pollfd fds[2];
     int ret;
 
     TRACE_ENTER();
@@ -380,21 +380,22 @@ static void *immOiObjectDispatchThread(v
 
     fds[0].fd = (int) selObj;
     fds[0].events = POLLIN;
+    fds[1].fd = stopFd[0];
+    fds[1].events = POLLIN;
 
     objectDispatchThreadIsSet = 1;
 
     while(1)
     {
-        ret = poll(fds, 1, 2000);
-        if (ret == 0)
-        {
-            TRACE("poll timeout\n");
-            break;
-        }
+        ret = poll(fds, 2, -1);
         if (ret == -1)
             fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-        safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+        if (fds[0].revents & POLLIN)
+            safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+
+        if (fds[1].revents & POLLIN)
+            break;
     }
 
     /* Objects might be deleted, so in saImmOiObjectImplementerRelease
@@ -419,7 +420,7 @@ static void *immOiClassDispatchThread(vo
     SaImmOiImplementerNameT implementerName = immArg->implementerName;
     SaImmOiHandleT handle;
     SaSelectionObjectT selObj;
-    struct pollfd fds[1];
+    struct pollfd fds[2];
     int ret;
 
     TRACE_ENTER();
@@ -433,21 +434,23 @@ static void *immOiClassDispatchThread(vo
 
     fds[0].fd = (int) selObj;
     fds[0].events = POLLIN;
+    fds[1].fd = stopFd[0];
+    fds[1].events = POLLIN;
+
 
     classDispatchThreadIsSet = 1;
 
     while(1)
     {
-        ret = poll(fds, 1, 2000);
-        if (ret == 0)
-        {
-            TRACE("poll timeout\n");
-            break;
-        }
+        ret = poll(fds, 2, -1);
         if (ret == -1)
             fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-        safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+        if (fds[0].revents & POLLIN)
+            safassert(saImmOiDispatch(handle, SA_DISPATCH_ONE), SA_AIS_OK);
+
+        if (fds[1].revents & POLLIN)
+            break;
     }
 
     safassert(saImmOiClassImplementerRelease(handle, className), SA_AIS_OK);
@@ -482,6 +485,7 @@ static void saImmOiCcbAugmentInitialize_
     arg.implementerName = (SaImmOiImplementerNameT)__FUNCTION__;
     classDispatchThreadIsSet = 0;
     resetThreadCounter();
+    pipe_stop_fd();
     assert(pthread_create(&threadid, NULL, immOiClassDispatchThread, (void 
*)&arg) == 0);
     while(!classDispatchThreadIsSet)
        usleep(500);
@@ -518,7 +522,9 @@ static void saImmOiCcbAugmentInitialize_
     safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
 
 done:
+    indicate_stop_fd();
     pthread_join(threadid, NULL);
+    close_stop_fd();
 
     test_validate(rc, SA_AIS_OK);
 
@@ -562,6 +568,7 @@ static void saImmOiCcbAugmentInitialize_
     arg.implementerName = (SaImmOiImplementerNameT)__FUNCTION__;
     objectDispatchThreadIsSet = 0;
     resetThreadCounter();
+    pipe_stop_fd();
     assert(pthread_create(&threadid, NULL, immOiObjectDispatchThread, (void 
*)&arg) == 0);
     while(!objectDispatchThreadIsSet)
        usleep(500);
@@ -595,7 +602,9 @@ static void saImmOiCcbAugmentInitialize_
     safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
 
 done:
+    indicate_stop_fd();
        pthread_join(threadid, NULL);
+    close_stop_fd();
 
        if(!testCcbValidate && !testAugmentSafeReadInCompleted && 
!testModificationInCompleted) {
                test_validate(rc, SA_AIS_OK);
@@ -643,6 +652,7 @@ static void saImmOiCcbAugmentInitialize_
     arg[1].callbacks = (SaImmOiCallbacksT_2 *)&callbacks;
     arg[1].implementerName = (SaImmOiImplementerNameT)"TestImplementer2";
 
+    pipe_stop_fd();
     resetThreadCounter();
     objectDispatchThreadIsSet = 0;
     assert(pthread_create(&threadid1, NULL, immOiObjectDispatchThread, (void 
*)&(arg[0])) == 0);
@@ -684,8 +694,10 @@ static void saImmOiCcbAugmentInitialize_
     safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
 
 done:
+    indicate_stop_fd();
        pthread_join(threadid1, NULL);
        pthread_join(threadid2, NULL);
+    close_stop_fd();
 
        test_validate(rc, SA_AIS_OK);
 
@@ -730,6 +742,7 @@ static void saImmOiCcbAugmentInitialize_
     arg[1].callbacks = (SaImmOiCallbacksT_2 *)&callbacks;
     arg[1].implementerName = (SaImmOiImplementerNameT)"TestImplementer2";
 
+    pipe_stop_fd();
     resetThreadCounter();
     objectDispatchThreadIsSet = 0;
     assert(pthread_create(&threadid1, NULL, immOiObjectDispatchThread, (void 
*)&(arg[0])) == 0);
@@ -775,8 +788,10 @@ static void saImmOiCcbAugmentInitialize_
 done:
        useAdminOwner = 0;
 
+    indicate_stop_fd();
        pthread_join(threadid1, NULL);
        pthread_join(threadid2, NULL);
+    close_stop_fd();
 
        test_validate(rc, SA_AIS_OK);
 
diff --git a/tests/immsv/implementer/test_saImmOiImplementerSet.c 
b/tests/immsv/implementer/test_saImmOiImplementerSet.c
--- a/tests/immsv/implementer/test_saImmOiImplementerSet.c
+++ b/tests/immsv/implementer/test_saImmOiImplementerSet.c
@@ -104,7 +104,7 @@ void *saImmOiImplementerSet_modify_threa
        SaImmOiCallbacksT_2 configImmOiCallbacks = { NULL , NULL , NULL , NULL 
, NULL , NULL , saImmOiImplementerSet_ModifyCallback , NULL };
        SaImmOiCallbacksT_2 rtImmOiCallbacks = { NULL , NULL , NULL , NULL , 
NULL , NULL , NULL , saImmOiImplementerSet_RtAttrUpdateCallbackT };
        SaNameT rdn = { 5, "obj=1" };
-       struct pollfd pfd;
+       struct pollfd fds[2];
        int rc = 1;
        int config = 1;
 
@@ -127,14 +127,22 @@ void *saImmOiImplementerSet_modify_threa
                safassert(saImmOiClassImplementerSet(immOiHandle, 
saImmOiImplementerSet_className), SA_AIS_OK);
        }
 
+       fds[0].fd = (int) selObj;
+       fds[0].events = POLLIN;
+       fds[1].fd = stopFd[0];
+       fds[1].events = POLLIN;
        *ready = 1;
 
-       while((!rc || rc == 1) && *ready) {
-               pfd.fd = selObj;
-               pfd.events = POLLIN;
-               rc = poll(&pfd, 1, 100);
+       while (1) {
+               rc = poll(fds, 2, -1);
+               if (rc == -1)
+                       fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-               safassert(saImmOiDispatch(immOiHandle, SA_DISPATCH_ONE), 
SA_AIS_OK);
+               if (fds[0].revents & POLLIN)
+                       safassert(saImmOiDispatch(immOiHandle, 
SA_DISPATCH_ONE), SA_AIS_OK);
+
+               if (fds[1].revents & POLLIN)
+                       break;
        }
 
        if(!config) {
@@ -146,8 +154,6 @@ void *saImmOiImplementerSet_modify_threa
        safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
-       *ready = 1;
-
        return NULL;
 }
 
@@ -175,6 +181,7 @@ void saImmOiImplementerSet_06(void)
        config_class_create(immHandle);
        safassert(object_create(immHandle, ownerHandle, configClassName, &obj1, 
NULL, NULL), SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, 
saImmOiImplementerSet_modify_thread, &ready));
 
        while(!ready) {
@@ -188,11 +195,9 @@ void saImmOiImplementerSet_06(void)
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
 
-       ready = 0;
-
-       while(!ready) {
-               usleep(100000);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(object_delete(ownerHandle, &obj1, 0), SA_AIS_OK);
        config_class_delete(immHandle);
@@ -228,6 +233,7 @@ void saImmOiImplementerSet_07(void)
        config_class_create(immHandle);
        safassert(object_create(immHandle, ownerHandle, configClassName, &obj1, 
NULL, NULL), SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, 
saImmOiImplementerSet_modify_thread, &ready));
 
        while(!ready) {
@@ -243,11 +249,9 @@ void saImmOiImplementerSet_07(void)
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
        safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
 
-       ready = 0;
-
-       while(!ready) {
-               usleep(100000);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        const SaNameT *objectNames[2] = { &obj1, NULL };
        safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
@@ -280,6 +284,7 @@ void saImmOiImplementerSet_08(void)
 
        safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, 
saImmOiImplementerSet_modify_thread, &ready));
 
        while(!ready) {
@@ -292,11 +297,9 @@ void saImmOiImplementerSet_08(void)
 
        safassert(saImmOmAccessorFinalize(accessorHandle), SA_AIS_OK);
 
-       ready = 0;
-
-       while(!ready) {
-               usleep(100000);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
 
@@ -321,6 +324,7 @@ void saImmOiImplementerSet_09(void)
 
        safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, 
saImmOiImplementerSet_modify_thread, &ready));
 
        while(!ready) {
@@ -333,11 +337,9 @@ void saImmOiImplementerSet_09(void)
 
        safassert(saImmOmAccessorFinalize(accessorHandle), SA_AIS_OK);
 
-       ready = 0;
-
-       while(!ready) {
-               usleep(100000);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
 
diff --git a/tests/immsv/implementer/test_saImmOiLongDn.c 
b/tests/immsv/implementer/test_saImmOiLongDn.c
--- a/tests/immsv/implementer/test_saImmOiLongDn.c
+++ b/tests/immsv/implementer/test_saImmOiLongDn.c
@@ -159,47 +159,34 @@ enum {
        S_DISP_FINISH
 };
 
-// -1 for infinite loop, exit with setting s_dispatch_exit = 0
-static int s_dispatch_repeat = 0;
-static int s_dispatch_exit = 0;
 static int s_dispatch_status = 0;
-static SaImmOiHandleT s_dispatch_oi_handle = 0;
 
 static void *dispatchThread(void *param) {
-       SaImmOiHandleT oiHandle = s_dispatch_oi_handle;
+       SaImmOiHandleT oiHandle = *((SaImmOiHandleT*) param);
        SaSelectionObjectT selObj;
-       int repeat = s_dispatch_repeat ? s_dispatch_repeat : -1;
-       int waittime = (repeat == -1) ? 10 : -1;
        int rc;
-       struct pollfd fd;
+       struct pollfd fds[2];
 
        safassert(saImmOiSelectionObjectGet(oiHandle, &selObj), SA_AIS_OK);
-
        s_dispatch_status = S_DISP_READY;
 
-       while(repeat) {
-               fd.fd = selObj;
-               fd.events = POLLIN;
-               rc = poll(&fd, 1, waittime);
-               if(!rc) {
-                       if(s_dispatch_exit)
-                               repeat = 0;
-                       continue;
-               }
-               assert(rc != -1);
+       fds[0].fd = (int) selObj;
+       fds[0].events = POLLIN;
+       fds[1].fd = stopFd[0];
+       fds[1].events = POLLIN;
 
-               saImmOiDispatch(oiHandle, SA_DISPATCH_ONE);
+       while(1) {
+               rc = poll(fds, 2, -1);
+               if (rc == -1)
+                       fprintf(stderr, "poll error: %s\n", strerror(errno));
 
-               if(repeat > 0) {
-                       repeat--;
-               } else if(s_dispatch_exit) {
-                       // Exit from loop
-                       repeat = 0;
-               }
+               if (fds[0].revents & POLLIN)
+                       saImmOiDispatch(oiHandle, SA_DISPATCH_ONE);
+
+               if (fds[1].revents & POLLIN)
+                       break;
        }
 
-       s_dispatch_status = S_DISP_FINISH;
-
        return NULL;
 }
 
@@ -223,11 +210,9 @@ static void saImmOiLongDn_01(void) {
        safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       assert(pthread_create(&threadid, NULL, dispatchThread, NULL) == 0);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       assert(pthread_create(&threadid, NULL, dispatchThread, &immOiHandle) == 
0);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -249,10 +234,9 @@ static void saImmOiLongDn_01(void) {
        safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName), 
SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
@@ -289,11 +273,9 @@ static void saImmOiLongDn_02(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       pthread_create(&threadid, NULL, dispatchThread, NULL);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       pthread_create(&threadid, NULL, dispatchThread, &immOiHandle);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -314,10 +296,9 @@ static void saImmOiLongDn_02(void) {
        safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName), 
SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
@@ -346,11 +327,9 @@ static void saImmOiLongDn_03(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       pthread_create(&threadid, NULL, dispatchThread, NULL);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       pthread_create(&threadid, NULL, dispatchThread, &immOiHandle);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -371,10 +350,9 @@ static void saImmOiLongDn_03(void) {
        safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName), 
SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
@@ -400,11 +378,9 @@ static void saImmOiLongDn_04(void) {
        safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       pthread_create(&threadid, NULL, dispatchThread, NULL);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       pthread_create(&threadid, NULL, dispatchThread, &immOiHandle);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -422,10 +398,9 @@ static void saImmOiLongDn_04(void) {
        safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
@@ -451,11 +426,9 @@ static void saImmOiLongDn_05(void) {
        safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       pthread_create(&threadid, NULL, dispatchThread, NULL);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       pthread_create(&threadid, NULL, dispatchThread, &immOiHandle);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -494,10 +467,9 @@ static void saImmOiLongDn_05(void) {
        safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
@@ -533,11 +505,9 @@ static void saImmOiLongDn_06(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
-       s_dispatch_repeat = 0;
-       s_dispatch_oi_handle = immOiHandle;
-       s_dispatch_exit = 0;
-       s_dispatch_status = 0;
-       pthread_create(&threadid, NULL, dispatchThread, NULL);
+       s_dispatch_status = S_DISP_START;
+       pipe_stop_fd();
+       pthread_create(&threadid, NULL, dispatchThread, &immOiHandle);
 
        while(s_dispatch_status != S_DISP_READY) {
                usleep(100);
@@ -564,10 +534,9 @@ static void saImmOiLongDn_06(void) {
        safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName), 
SA_AIS_OK);
 
        // Wait for thread to exit
-       s_dispatch_exit = 1;
-       while(s_dispatch_status != S_DISP_FINISH) {
-               usleep(100);
-       }
+       indicate_stop_fd();
+       pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
 
diff --git a/tests/immsv/implementer/test_saImmOiSaStringT.c 
b/tests/immsv/implementer/test_saImmOiSaStringT.c
--- a/tests/immsv/implementer/test_saImmOiSaStringT.c
+++ b/tests/immsv/implementer/test_saImmOiSaStringT.c
@@ -25,7 +25,6 @@
 #include "immtest.h"
 
 static int mainThreadReady;
-static int oiThreadExit;
 
 static char *expectedRdnAttr;
 static SaStringT expectedObjectName;   // Used for both DN and RDN checks
@@ -240,23 +239,27 @@ static const SaImmOiCallbacksT_2 immOiCa
 static void *oi_thread(void *arg) {
        SaImmOiHandleT immOiHandle = *(SaImmOiHandleT *)arg;
        SaSelectionObjectT selObj;
-       struct pollfd fds[1];
+       struct pollfd fds[2];
+       int rc;
 
        safassert(saImmOiSelectionObjectGet(immOiHandle, &selObj), SA_AIS_OK);
        mainThreadReady = 1;
-       while(!oiThreadExit) {
-               fds[0].fd = (int)selObj;
-               fds[0].events = POLLIN;
-               if(poll(fds, 1, 1000) < 1) {
-                       continue;
-               }
-               if(fds[0].revents != POLLIN) {
+
+       fds[0].fd = (int)selObj;
+       fds[0].events = POLLIN;
+       fds[1].fd = stopFd[0];
+       fds[1].events = POLLIN;
+
+       while (1) {
+               rc = poll(fds, 2, -1);
+               if (rc == -1)
+                       fprintf(stderr, "poll error: %s\n", strerror(errno));
+
+               if (fds[0].revents & POLLIN)
+                       saImmOiDispatch(immOiHandle, SA_DISPATCH_ONE);
+
+               if (fds[1].revents & POLLIN)
                        break;
-               }
-
-               if(fds[0].fd == (int)selObj) {
-                       saImmOiDispatch(immOiHandle, SA_DISPATCH_ONE);
-               }
        }
 
        return NULL;
@@ -324,13 +327,13 @@ static void saImmOiSaStringT_01(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -348,8 +351,9 @@ static void saImmOiSaStringT_01(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -376,7 +380,6 @@ static void saImmOiSaStringT_02(void) {
        SaNameT expParentName = { strlen("rdn=root"), "rdn=root" };
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = "obj=1";   // RDN
        expectedParentName = &expParentName;
        expectedRdnAttr = "rdn";
@@ -385,6 +388,7 @@ static void saImmOiSaStringT_02(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -402,8 +406,9 @@ static void saImmOiSaStringT_02(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -432,13 +437,13 @@ static void saImmOiSaStringT_03(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = "obj=1,rdn=root";
 
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -456,8 +461,9 @@ static void saImmOiSaStringT_03(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -484,7 +490,6 @@ static void saImmOiSaStringT_04(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -497,6 +502,7 @@ static void saImmOiSaStringT_04(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -512,8 +518,9 @@ static void saImmOiSaStringT_04(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
 
@@ -543,7 +550,6 @@ static void saImmOiSaStringT_05(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -556,6 +562,7 @@ static void saImmOiSaStringT_05(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -571,8 +578,9 @@ static void saImmOiSaStringT_05(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
 
@@ -602,7 +610,6 @@ static void saImmOiSaStringT_06(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = (SaStringT)dn.value;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -615,6 +622,7 @@ static void saImmOiSaStringT_06(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -629,8 +637,9 @@ static void saImmOiSaStringT_06(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
 
@@ -655,7 +664,6 @@ static void saImmOiSaStringT_07(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -668,6 +676,7 @@ static void saImmOiSaStringT_07(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -687,8 +696,9 @@ static void saImmOiSaStringT_07(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -710,7 +720,6 @@ static void saImmOiSaStringT_08(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -723,6 +732,7 @@ static void saImmOiSaStringT_08(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -742,8 +752,9 @@ static void saImmOiSaStringT_08(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -765,7 +776,6 @@ static void saImmOiSaStringT_09(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = (SaStringT)dn.value;
 
        safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion), 
SA_AIS_OK);
@@ -778,6 +788,7 @@ static void saImmOiSaStringT_09(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -796,8 +807,9 @@ static void saImmOiSaStringT_09(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
        safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
@@ -816,11 +828,11 @@ static void saImmOiSaStringT_10(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
 
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -834,8 +846,9 @@ static void saImmOiSaStringT_10(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
@@ -848,11 +861,11 @@ static void saImmOiSaStringT_11(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
 
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -866,8 +879,9 @@ static void saImmOiSaStringT_11(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
@@ -880,12 +894,12 @@ static void saImmOiSaStringT_12(void) {
        pthread_t threadid;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -899,8 +913,9 @@ static void saImmOiSaStringT_12(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
        safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
@@ -917,7 +932,6 @@ static void saImmOiSaStringT_13(void) {
        SaImmAttrValuesT_2 **attributes;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
        srand((int)time(NULL));
        expectedU32 = (SaUint32T)rand();
@@ -929,6 +943,7 @@ static void saImmOiSaStringT_13(void) {
        safassert(saImmOiInitialize_o3(&immOiHandle, &immOiCallbacks_o3, 
&immVersion), SA_AIS_OK);
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -957,8 +972,9 @@ static void saImmOiSaStringT_13(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        safassert(saImmOmAccessorFinalize(accessorHandle), SA_AIS_OK);
        safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
@@ -983,7 +999,6 @@ static void saImmOiSaStringT_14(void) {
        SaAisErrorT returnError;
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
        srand((int)time(NULL));
        expectedU32 = (SaUint32T)rand();
@@ -1003,6 +1018,7 @@ static void saImmOiSaStringT_14(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -1028,8 +1044,9 @@ static void saImmOiSaStringT_14(void) {
 
        test_validate(rc, SA_AIS_OK);
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        saImmOmAdminOperationMemoryFree(ownerHandle, returnParams);
 
diff --git a/tests/immsv/management/test_saImmOmSaStringT.c 
b/tests/immsv/management/test_saImmOmSaStringT.c
--- a/tests/immsv/management/test_saImmOmSaStringT.c
+++ b/tests/immsv/management/test_saImmOmSaStringT.c
@@ -24,7 +24,6 @@
 #include "immtest.h"
 
 static int mainThreadReady;
-static int oiThreadExit;
 
 // Parameters from saImmOmAdminOperationInvokeCallback
 static SaInvocationT callbackInvocation = 0;
@@ -72,27 +71,29 @@ static const SaImmCallbacksT immOmCallba
 static void *oi_thread(void *arg) {
        SaImmOiHandleT immOiHandle = *(SaImmOiHandleT *)arg;
        SaSelectionObjectT selObj;
-       struct pollfd fds[1];
+       struct pollfd fds[2];
+       int rc;
 
        safassert(saImmOiSelectionObjectGet(immOiHandle, &selObj), SA_AIS_OK);
-       while(!oiThreadExit) {
-               mainThreadReady = 1;
-               fds[0].fd = (int)selObj;
-               fds[0].events = POLLIN;
-               if(poll(fds, 1, 1000) < 1) {
-                       continue;
-               }
-               if(fds[0].revents != POLLIN) {
+       mainThreadReady = 1;
+
+       fds[0].fd = (int)selObj;
+       fds[0].events = POLLIN;
+       fds[1].fd = stopFd[0];
+       fds[1].events = POLLIN;
+
+       while (1) {
+               rc = poll(fds, 2, -1);
+               if (rc == -1)
+                       fprintf(stderr, "poll error: %s\n", strerror(errno));
+
+               if (fds[0].revents & POLLIN)
+                       saImmOiDispatch(immOiHandle, SA_DISPATCH_ONE);
+
+               if (fds[1].revents & POLLIN)
                        break;
-               }
-
-               if(fds[0].fd == (int)selObj) {
-                       saImmOiDispatch(immOiHandle, SA_DISPATCH_ONE);
-               }
        }
 
-       oiThreadExit = 0;
-
        return NULL;
 }
 
@@ -342,7 +343,6 @@ static void saImmOmSaStringT_08(void) {
        const SaImmAdminOperationParamsT_2 *params[2] = { &param, NULL };
 
        mainThreadReady = 0;
-       oiThreadExit = 0;
        expectedObjectName = dn;
 
        safassert(saImmOmInitialize(&immOmHandle, &immOmCallback, &immVersion), 
SA_AIS_OK);
@@ -354,6 +354,7 @@ static void saImmOmSaStringT_08(void) {
        safassert(saImmOiImplementerSet(immOiHandle, implementerName), 
SA_AIS_OK);
        safassert(saImmOiClassImplementerSet(immOiHandle, configClassName), 
SA_AIS_OK);
 
+       pipe_stop_fd();
        assert(!pthread_create(&threadid, NULL, oi_thread, (void 
*)&immOiHandle));
 
        // Wait OI thread to be ready
@@ -385,8 +386,9 @@ static void saImmOmSaStringT_08(void) {
                }
        }
 
-       oiThreadExit = 1;
+       indicate_stop_fd();
        pthread_join(threadid, NULL);
+       close_stop_fd();
 
        test_validate(rc, SA_AIS_OK);
 


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to