static os_result getSem( os_cond* cond) { const char *pipename; struct os_servicemsg request; struct os_servicemsg reply; BOOL result; DWORD nRead; os_result osr; DWORD lastError; pipename = os_createPipeNameFromCond(cond); if (pipename == NULL) { pipename = os_servicePipeName(); OS_DEBUG_1("getSem", "Failed to get a domain name from cond, using default %s %d", pipename); } request.kind = OS_SRVMSG_CREATE_SEMAPHORE; reply.result = os_resultFail; reply.kind = OS_SRVMSG_UNDEFINED; do{ result = CallNamedPipe( pipename, &request, sizeof(request), &reply, sizeof(reply), &nRead, NMPWAIT_WAIT_FOREVER); if(!result){ lastError = GetLastError(); } else { lastError = ERROR_SUCCESS; } } while((!result) && (lastError == ERROR_PIPE_BUSY)); if (!result || (nRead != sizeof(reply))) { OS_DEBUG_4("getSem", "Failure %d %d %d %d\n", result, GetLastError(), nRead, reply.kind); osr = os_resultFail; } else { if ((reply.result == os_resultSuccess) && (reply.kind == OS_SRVMSG_CREATE_SEMAPHORE)) { cond->qId = reply._u.id; osr = os_resultSuccess; } else { osr = os_resultFail; } } return osr; }
static os_result getSem( os_cond* cond) { struct os_servicemsg request; struct os_servicemsg reply; os_result osr; char * writeQueueName; HANDLE h; request.kind = OS_SRVMSG_CREATE_SEMAPHORE; writeQueueName = os_createPipeNameFromCond(cond); osr = requestResponseFromServiceQueue (&request, &reply, writeQueueName); if (osr == os_resultSuccess) { if ((reply.result == os_resultSuccess) && (reply.kind == OS_SRVMSG_CREATE_SEMAPHORE)) { cond->qId = reply._u.id; cond->lifecycleId = reply.lifecycleId; /* Create and cache a local handle to the Semaphore */ h = createNewHandle (cond); if (h) { os_mutexLock(&semCacheMutex); /* Add to the cache, first removing any existing reference to the cond */ freeCachedItem (cond); addCacheItem (cond, h); os_mutexUnlock(&semCacheMutex); } osr = (h != NULL) ? os_resultSuccess : os_resultFail; } else { osr = os_resultFail; } } os_free (writeQueueName); return osr; }
static os_result returnSem( os_cond* cond) { const char *pipename; struct os_servicemsg request; struct os_servicemsg reply; BOOL result; DWORD nRead; os_result osr; pipename = os_createPipeNameFromCond(cond); if (pipename == NULL) { pipename = os_servicePipeName(); OS_DEBUG_1("returnSem", "Failed to get a domain name from cond, using default %s %d", pipename); } request.kind = OS_SRVMSG_DESTROY_SEMAPHORE; request._u.id = cond->qId; reply.result = os_resultFail; reply.kind = OS_SRVMSG_UNDEFINED; result = CallNamedPipe( pipename, &request, sizeof(request), &reply, sizeof(reply), &nRead, NMPWAIT_WAIT_FOREVER); if ((reply.result == os_resultSuccess) && (reply.kind = OS_SRVMSG_DESTROY_SEMAPHORE)) { osr = os_resultSuccess; } else { OS_DEBUG_4("returnSem", "Failure %d %d %d %d\n", result, GetLastError(), nRead, reply.kind); osr = os_resultFail; } return osr; }
static os_result returnSem( os_cond* cond) { struct os_servicemsg request; struct os_servicemsg reply; os_result osr; char * writeQueueName; HANDLE h = NULL; request.kind = OS_SRVMSG_DESTROY_SEMAPHORE; request._u.id = cond->qId; writeQueueName = os_createPipeNameFromCond(cond); osr = requestResponseFromServiceQueue (&request, &reply, writeQueueName); if (osr == os_resultSuccess) { if ((reply.result == os_resultSuccess) && (reply.kind == OS_SRVMSG_DESTROY_SEMAPHORE)) { /* Remove from the cache the local handle to the Semaphore */ os_mutexLock(&semCacheMutex); freeCachedItem (cond); os_mutexUnlock(&semCacheMutex); } else { OS_DEBUG_4("returnSem", "Failure %d %d %d %d\n", result, os_getErrno(), nRead, reply.kind); osr = os_resultFail; } } os_free (writeQueueName); return osr; }