- Timestamp:
- Jun 13, 2005, 11:29:07 PM (20 years ago)
- 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
to1.6
r2026 r2027 6 6 7 7 #ifndef _SYS_FMUTEX_H 8 8 #define _SYS_FMUTEX_H 9 9 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> 13 14 14 15 __BEGIN_DECLS … … 16 17 /* Constants for _fmutex.fs. See _fmutex_available() for ordering. */ 17 18 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 22 24 23 25 /* Constants for _fmutex_create() */ 24 26 25 26 27 27 #define _FMC_SHARED 0x01 28 #define _FMC_MUST_COMPLETE 0x02 29 #define _FMC_DUMMY 0x04 /* internal */ 28 30 29 31 /* Constants for _fmutex_request() */ 30 32 31 32 33 #define _FMR_IGNINT 0x01 34 #define _FMR_NOWAIT 0x02 33 35 34 36 /* We cannot use __attribute__ ((__packed__)) because G++ does not 35 37 support this. */ 36 38 37 39 #pragma pack(1) 38 40 typedef struct 39 41 { … … 51 53 const char *pszDesc; 52 54 } _fmutex; 53 55 #pragma pack() 54 56 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 } 55 59 56 60 -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/process/fmutex.c
-
Property cvs2svn:cvs-rev
changed from
1.9
to1.10
r2026 r2027 45 45 sem->flags = flags; 46 46 sem->padding[0] = 'f'; 47 sem->padding[ 0] = 'm';47 sem->padding[1] = 'm'; 48 48 sem->pszDesc = pszDesc; 49 49 rc = DosCreateEventSemEx(NULL, (PHEV)&sem->hev, … … 79 79 LIBC_ASSERTM_FAILED("Invalid handle, fs == _FMS_UNINIT\n"); 80 80 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; 81 101 } 82 102 … … 160 180 int rc; 161 181 ULONG ulNesting = 0; 182 signed char fs; 162 183 FS_VAR(); 163 184 … … 168 189 } 169 190 170 FS_SAVE_LOAD();171 191 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 172 220 if (flags & _FMR_NOWAIT) 173 221 { 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 } 179 230 } 180 231 DosExitMustComplete(&ulNesting); -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.