Changeset 8895 for trunk/src


Ignore:
Timestamp:
Jul 19, 2002, 1:06:45 PM (23 years ago)
Author:
sandervl
Message:

Dos*CriticalSection fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/odincrt/critsect.cpp

    r8890 r8895  
    1 /* $Id: critsect.cpp,v 1.3 2002-07-18 20:26:28 sandervl Exp $ */
     1/* $Id: critsect.cpp,v 1.4 2002-07-19 11:06:45 sandervl Exp $ */
    22/*
    33 * Critical sections
     
    7474    crit->OwningThread   = 0;
    7575
    76     rc = DosCreateMutexSem(pszSemName, &crit->hmtxLock, (pszSemName) ? DC_SEM_SHARED : 0, TRUE);
     76    rc = DosCreateEventSem(pszSemName, &crit->hmtxLock, (pszSemName) ? DC_SEM_SHARED : 0, 0);
    7777    if(rc != NO_ERROR) {
    7878        DebugInt3();
     
    9696    }
    9797
    98     rc = DosOpenMutexSem(pszSemName, &hmtxLock);
     98    rc = DosOpenEventSem(pszSemName, &hmtxLock);
    9999    if(rc != NO_ERROR) {
    100100        DebugInt3();
     
    115115        crit->RecursionCount = 0;
    116116        crit->OwningThread   = 0;
    117         DosCloseMutexSem(crit->hmtxLock);
     117        DosCloseEventSem(crit->hmtxLock);
    118118        crit->hmtxLock       = 0;
    119119        crit->Reserved       = (DWORD)-1;
     
    128128{
    129129    DWORD res;
     130    DWORD threadid = GetCurrentThreadId();
    130131
    131132    if (!crit->hmtxLock)
     
    135136    if (DosInterlockedIncrement( &crit->LockCount ))
    136137    {
    137         if (crit->OwningThread == GetCurrentThreadId())
     138testenter:
     139        if (crit->OwningThread == threadid)
    138140        {
    139141            crit->RecursionCount++;
     
    141143        }
    142144
    143         /* Now wait for it */
    144         APIRET rc = DosRequestMutexSem(crit->hmtxLock, SEM_INDEFINITE_WAIT);
     145        if(DosInterlockedCompareExchange((PLONG)&crit->OwningThread, threadid, 0))
     146        {
     147            ULONG ulnrposts;
     148
     149            /* Now wait for it */
     150            APIRET rc = DosWaitEventSem(crit->hmtxLock, SEM_INDEFINITE_WAIT);
     151            if(rc != NO_ERROR) {
     152                DebugInt3();
     153                return;
     154            }
     155            DosResetEventSem(crit->hmtxLock, &ulnrposts);
     156            goto testenter;
     157        }
    145158    }
    146159    crit->OwningThread   = GetCurrentThreadId();
     
    161174            return TRUE;
    162175        }
    163         /* FIXME: this doesn't work */
    164176        DosInterlockedDecrement( &crit->LockCount );
    165177        return FALSE;
     
    187199    {
    188200        /* Someone is waiting */
    189         DosReleaseMutexSem(crit->hmtxLock);
    190     }
    191 }
    192 
     201        DosPostEventSem(crit->hmtxLock);
     202    }
     203}
     204
Note: See TracChangeset for help on using the changeset viewer.