Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}