Exemplo n.º 1
0
static os_result
condSignal(
    os_cond *cond,
    long mask)
{
    char name[OS_SERVICE_ENTITY_NAME_MAX];
    HANDLE hQueue;
    DWORD result;
    long oldState;
    os_result osr;

    assert(cond != NULL);

    osr = os_resultSuccess;

    if (cond->scope == OS_SCOPE_SHARED) {

        _snprintf(name, sizeof(name), "%s%s%d%d",
            (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""),
            OS_SERVICE_SEM_NAME_PREFIX,
            cond->qId,
            os_getShmBaseAddressFromPointer(cond));

        hQueue = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, name);
        if (hQueue == NULL) {
            OS_DEBUG_1("condSignal", "OpenSemaphore failed %d", (int)GetLastError());
            assert(0);
            return os_resultFail;
        }
    } else {
        hQueue       = (HANDLE)cond->qId;
    }

    oldState = InterlockedOr(&cond->state, mask);
    if (oldState == 0) { /* no waiters */
        InterlockedAnd(&cond->state, ~mask);
        return osr;
    }

    if (mask == BROADCAST_BIT_MASK) {
        result = ReleaseSemaphore(hQueue, oldState, 0);
    } else {
        result = ReleaseSemaphore(hQueue, 1, 0);
    }
    InterlockedAnd(&cond->state, ~mask);

    if (cond->scope == OS_SCOPE_SHARED) {
        CloseHandle(hQueue);
    }

    return osr;
}
Exemplo n.º 2
0
static HANDLE createNewHandle (os_cond * cond)
{
    HANDLE result = NULL;
    char name[OS_SERVICE_ENTITY_NAME_MAX];
    wchar_t* wStringName;

    _snprintf(name, sizeof(name), "%s%d%d",
                OS_SERVICE_SEM_NAME_PREFIX, cond->qId, os_getShmBaseAddressFromPointer(cond));
    wStringName = wce_mbtowc(name);
    result = CreateSemaphore(NULL, 0, 0x7fffffff, wStringName);
    os_free (wStringName);

    return result;
}
Exemplo n.º 3
0
static os_result
condTimedWait(
    os_cond *cond,
    os_mutex *mutex,
    DWORD timeout)
{
    HANDLE hQueue;
    HANDLE hMtx;
    char name[OS_SERVICE_ENTITY_NAME_MAX];
    DWORD wsr;
    LONG c;
    LONG lockCount;
    os_result osr;
    os_result result;

    assert(cond != NULL);
    assert(mutex != NULL);

    result = os_resultSuccess;
    if (cond->scope == OS_SCOPE_SHARED) {
        _snprintf(name, sizeof(name), "%s%s%d%d",
            (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""),
            OS_SERVICE_SEM_NAME_PREFIX,
            cond->qId,
            os_getShmBaseAddressFromPointer(cond));

        hQueue = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, name);
        if (hQueue == NULL) {
            OS_DEBUG_1("condTimedWait", "OpenSemaphore failed %d", (int)GetLastError());
            assert(0);
            return os_resultFail;
        }

        _snprintf(name, sizeof(name), "%s%s%d%d",
            (os_sharedMemIsGlobal() ? OS_SERVICE_GLOBAL_NAME_PREFIX : ""),
            OS_SERVICE_EVENT_NAME_PREFIX,
            mutex->id,
            os_getShmBaseAddressFromPointer(cond));
        hMtx = OpenEvent(EVENT_ALL_ACCESS, FALSE, name);
        if (hMtx == NULL) {
            OS_DEBUG_1("condTimedWait", "OpenEvent failed %d", (int)GetLastError());
            CloseHandle(hQueue);
            assert(0);
            return os_resultFail;
        }
    } else {
        hQueue  = (HANDLE)cond->qId;
        hMtx  = (HANDLE)mutex->id;
    }

    InterlockedIncrement(&cond->state);
    lockCount = InterlockedDecrement(&mutex->lockCount);
    if (lockCount > 0) {
        wsr = SignalObjectAndWait(hMtx, hQueue, timeout, FALSE);
    } else {
        wsr = WaitForSingleObject(hQueue, timeout);
    }
    assert((wsr == WAIT_OBJECT_0) || (wsr == WAIT_FAILED) || (wsr == WAIT_ABANDONED) || (wsr == WAIT_TIMEOUT));
    if (wsr == WAIT_TIMEOUT) {
        result = os_resultTimeout;
    } else if (wsr != WAIT_OBJECT_0) {
        result = os_resultFail;
    }

    c = InterlockedDecrement(&cond->state);
    osr = os_mutexLock(mutex);
    if (osr != os_resultSuccess) {
        result = osr;
    }
    if (cond->scope == OS_SCOPE_SHARED) {
        CloseHandle(hQueue);
        CloseHandle(hMtx);
    }

    return result;
}