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] = { ¶m, 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