This example creates two semaphore record lists, with two event semaphores in each. It then creates a muxwait semaphore with the first semaphore record list, and it adds the second list later using DosAddMuxWaitSem.
#define INCL_DOSSEMAPHORES /* DOS semaphore values */ #define INCL_DOSERRORS /* DOS error values */ #include <os2.h> #include <stdio.h> int main(VOID) { HMUX hmuxHandAny = NULLHANDLE; /* Muxwaithandle */ HEV hevA[2] = {0}; /* Event semaphores */ SEMRECORD apsrA[2] = {{0}}; /* Semaphore records */ HEV hevB[2] = {0}; /* Event semaphores */ SEMRECORD apsrB[2] = {{0}}; /* Semaphore records */ APIRET rc = NO_ERROR; /* Return code */ ULONG ulLoop = 0; /* Loop count */ for (ulLoop = 0; ulLoop < 2; ulLoop++) { rc = DosCreateEventSem((PSZ) NULL, &hevA[ulLoop], 0, FALSE); if (rc != NO_ERROR) { printf("DosCreateEventSem error: return code = %u\n", rc); return 1; } apsrA[ulLoop].hsemCur = (HSEM) hevA[ulLoop], apsrA[ulLoop].ulUser = 0; rc = DosCreateEventSem((PSZ) NULL, &hevB[ulLoop], 0, FALSE); if (rc != NO_ERROR) { printf("DosCreateEventSem error: return code = %u\n", rc); return 1; } apsrB[ulLoop].hsemCur = (HSEM) hevB[ulLoop], apsrB[ulLoop].ulUser = 0; } /* endfor */ rc = DosCreateMuxWaitSem((PSZ) NULL, &hmuxHandAny, 2L, /* Number of semaphores in list */ apsrA, /* Semaphore list */ DCMW_WAIT_ANY); /* Wait for any semaphore */ if (rc != NO_ERROR) { printf("DosCreateMuxWaitSem error: return code = %u\n", rc); return 1; } rc = DosAddMuxWaitSem(hmuxHandAny, apsrB); if (rc != NO_ERROR) { printf("DosAddMuxWaitSem error: return code = %u\n", rc); return 1; } return NO_ERROR; }