Changeset 2027 for trunk


Ignore:
Timestamp:
Jun 13, 2005, 11:29:07 PM (20 years ago)
Author:
bird
Message:

Auto init fmutexes. fixed deadlock for the must-complete variant.

Location:
trunk/src/emx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/include/sys/fmutex.h

    • Property cvs2svn:cvs-rev changed from 1.5 to 1.6
    r2026 r2027  
    66
    77#ifndef _SYS_FMUTEX_H
    8     #define _SYS_FMUTEX_H
     8#define _SYS_FMUTEX_H
    99
    10     #include <sys/cdefs.h>
    11     #include <stdlib.h> /* need abort */
    12     #include <InnoTekLIBC/FastInfoBlocks.h>
     10#include <sys/cdefs.h>
     11#include <stdlib.h> /* need abort */
     12#include <InnoTekLIBC/FastInfoBlocks.h>
     13#include <386/builtin.h>
    1314
    1415__BEGIN_DECLS
     
    1617/* Constants for _fmutex.fs.  See _fmutex_available() for ordering. */
    1718
    18     #define _FMS_UNINIT       0
    19     #define _FMS_AVAILABLE    1
    20     #define _FMS_OWNED_SIMPLE 2
    21     #define _FMS_OWNED_HARD   3
     19#define _FMS_AUTO_INITIALIZE    (-1)
     20#define _FMS_UNINIT       0
     21#define _FMS_AVAILABLE    1
     22#define _FMS_OWNED_SIMPLE 2
     23#define _FMS_OWNED_HARD   3
    2224
    2325/* Constants for _fmutex_create() */
    2426
    25     #define _FMC_SHARED         0x01
    26     #define _FMC_MUST_COMPLETE  0x02
    27     #define _FMC_DUMMY          0x04    /* internal */
     27#define _FMC_SHARED         0x01
     28#define _FMC_MUST_COMPLETE  0x02
     29#define _FMC_DUMMY          0x04    /* internal */
    2830
    2931/* Constants for _fmutex_request() */
    3032
    31     #define _FMR_IGNINT     0x01
    32     #define _FMR_NOWAIT     0x02
     33#define _FMR_IGNINT     0x01
     34#define _FMR_NOWAIT     0x02
    3335
    3436/* We cannot use __attribute__ ((__packed__)) because G++ does not
    3537   support this. */
    3638
    37     #pragma pack(1)
     39#pragma pack(1)
    3840typedef struct
    3941{
     
    5153    const char             *pszDesc;
    5254} _fmutex;
    53     #pragma pack()
     55#pragma pack()
    5456
     57#define _FMUTEX_INITIALIZER                         _FMUTEX_INITIALIZER_EX(0, __FILE__)
     58#define _FMUTEX_INITIALIZER_EX(fFlags, pszDesc)     { 0, _FMS_AUTO_INITIALIZE, fFlags, {0x42,0x42}, 0, pszDesc }
    5559
    5660
  • trunk/src/emx/src/lib/process/fmutex.c

    • Property cvs2svn:cvs-rev changed from 1.9 to 1.10
    r2026 r2027  
    4545    sem->flags      = flags;
    4646    sem->padding[0] = 'f';
    47     sem->padding[0] = 'm';
     47    sem->padding[1] = 'm';
    4848    sem->pszDesc    = pszDesc;
    4949    rc = DosCreateEventSemEx(NULL, (PHEV)&sem->hev,
     
    7979        LIBC_ASSERTM_FAILED("Invalid handle, fs == _FMS_UNINIT\n");
    8080        LIBCLOG_RETURN_UINT(ERROR_INVALID_HANDLE);
     81    }
     82
     83    if (fs == _FMS_AUTO_INITIALIZE || !sem->hev)
     84    {
     85        HEV hev;
     86        rc = DosCreateEventSemEx(NULL, &hev, sem->flags & _FMC_SHARED ? DC_SEM_SHARED : 0, FALSE);
     87        if (rc)
     88        {
     89            LIBC_ASSERTM_FAILED("Failed to create event semaphore for fmutex '%s', rc=%d. flags=%#x\n", sem->pszDesc, rc, sem->flags);
     90            LIBCLOG_RETURN_UINT(ERROR_INVALID_HANDLE);
     91        }
     92        if (__atomic_cmpxchg32((volatile uint32_t *)&sem->hev, hev, 0))
     93        {
     94            LIBCLOG_MSG("auto initialized fmutex %p '%s'\n", (void *)sem, sem->pszDesc);
     95            __atomic_xchg(&sem->Owner, fibGetTidPid());
     96            LIBCLOG_RETURN_UINT(NO_ERROR);
     97        }
     98        LIBCLOG_MSG("lost auto initialization race for fmutex %p '%s'\n", (void *)sem, sem->pszDesc);
     99        DosCloseEventSemEx(hev);
     100        fs = _FMS_OWNED_HARD;
    81101    }
    82102
     
    160180    int     rc;
    161181    ULONG   ulNesting = 0;
     182    signed char fs;
    162183    FS_VAR();
    163184
     
    168189    }
    169190
    170     FS_SAVE_LOAD();
    171191    DosEnterMustComplete(&ulNesting);
     192    fs = __cxchg(&sem->fs, _FMS_OWNED_SIMPLE);
     193    if (fs == _FMS_AVAILABLE)
     194    {
     195        __atomic_xchg(&sem->Owner, fibGetTidPid());
     196        FS_RESTORE();
     197        LIBCLOG_RETURN_UINT(0);
     198    }
     199
     200    if (fs == _FMS_AUTO_INITIALIZE || !sem->hev)
     201    {
     202        HEV hev;
     203        rc = DosCreateEventSemEx(NULL, &hev, sem->flags & _FMC_SHARED ? DC_SEM_SHARED : 0, FALSE);
     204        if (rc)
     205        {
     206            LIBC_ASSERTM_FAILED("Failed to create event semaphore for fmutex '%s', rc=%d. flags=%#x\n", sem->pszDesc, rc, sem->flags);
     207            LIBCLOG_RETURN_UINT(ERROR_INVALID_HANDLE);
     208        }
     209        if (__atomic_cmpxchg32((volatile uint32_t *)&sem->hev, hev, 0))
     210        {
     211            LIBCLOG_MSG("auto initialized fmutex %p '%s'\n", (void *)sem, sem->pszDesc);
     212            __atomic_xchg(&sem->Owner, fibGetTidPid());
     213            LIBCLOG_RETURN_UINT(NO_ERROR);
     214        }
     215        LIBCLOG_MSG("lost auto initialization race for fmutex %p '%s'\n", (void *)sem, sem->pszDesc);
     216        DosCloseEventSemEx(hev);
     217        fs = _FMS_OWNED_HARD;
     218    }
     219
    172220    if (flags & _FMR_NOWAIT)
    173221    {
    174         if (__cxchg(&sem->fs, _FMS_OWNED_HARD) == _FMS_AVAILABLE)
    175         {
    176             __atomic_xchg(&sem->Owner, fibGetTidPid());
    177             FS_RESTORE();
    178             LIBCLOG_RETURN_UINT(0);
     222        if (fs == _FMS_OWNED_HARD)
     223        {
     224            if (__cxchg(&sem->fs, _FMS_OWNED_HARD) == _FMS_AVAILABLE)
     225            {
     226                __atomic_xchg(&sem->Owner, fibGetTidPid());
     227                FS_RESTORE();
     228                LIBCLOG_RETURN_UINT(0);
     229            }
    179230        }
    180231        DosExitMustComplete(&ulNesting);
Note: See TracChangeset for help on using the changeset viewer.