You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 4e2ad334b5881af7661be4d6df3c51aae92ca4a2
This commit is contained in:
committed by
Zebediah Figura
parent
d4918b4305
commit
76ba9d2387
@@ -82,7 +82,7 @@ index da35bdf85..2bb85d910 100644
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ obj = interlocked_xchg_ptr((void **)&esync_list[entry][idx], obj);
|
||||
+ obj = InterlockedExchangePointer((void **)&esync_list[entry][idx], obj);
|
||||
+ assert(!obj);
|
||||
+ return TRUE;
|
||||
+}
|
||||
|
@@ -26,7 +26,7 @@ index bca95b9b2d9..f7a427425b7 100644
|
||||
+
|
||||
+ if (entry < ESYNC_LIST_ENTRIES && esync_list[entry])
|
||||
+ {
|
||||
+ if ((obj = interlocked_xchg_ptr( (void **)&esync_list[entry][idx], 0 )))
|
||||
+ if ((obj = InterlockedExchangePointer( (void **)&esync_list[entry][idx], 0 )))
|
||||
+ {
|
||||
+ close( obj->fd );
|
||||
+ RtlFreeHeap( GetProcessHeap(), 0, obj );
|
||||
|
@@ -62,7 +62,7 @@ index 9da300853..25e049291 100644
|
||||
+
|
||||
+ if (count + current > semaphore->max)
|
||||
+ return STATUS_SEMAPHORE_LIMIT_EXCEEDED;
|
||||
+ } while (interlocked_cmpxchg( &semaphore->count, count + current, current ) != current);
|
||||
+ } while (InterlockedCompareExchange( &semaphore->count, count + current, current ) != current);
|
||||
+
|
||||
+ if (prev) *prev = current;
|
||||
+
|
||||
@@ -83,7 +83,7 @@ index 9da300853..25e049291 100644
|
||||
+ * the fact that we were able to grab it at all means the count
|
||||
+ * is nonzero, and if someone else grabbed it then the count
|
||||
+ * must have been >= 2, etc. */
|
||||
+ interlocked_xchg_add( &semaphore->count, -1 );
|
||||
+ InterlockedDecrement( &semaphore->count );
|
||||
+ }
|
||||
return i;
|
||||
}
|
||||
@@ -105,7 +105,7 @@ index 9da300853..25e049291 100644
|
||||
+ else if (objs[i]->type == ESYNC_SEMAPHORE)
|
||||
+ {
|
||||
+ struct semaphore *semaphore = (struct semaphore *)objs[i];
|
||||
+ interlocked_xchg_add( &semaphore->count, -1 );
|
||||
+ InterlockedDecrement( &semaphore->count );
|
||||
+ }
|
||||
}
|
||||
TRACE("Wait successful.\n");
|
||||
|
@@ -100,7 +100,7 @@ index c1d8882d817..ea71c960007 100644
|
||||
+
|
||||
+ TRACE("Mapping page %d at %p.\n", entry, addr);
|
||||
+
|
||||
+ if (interlocked_cmpxchg_ptr( &shm_addrs[entry], addr, 0 ))
|
||||
+ if (InterlockedCompareExchangePointer( &shm_addrs[entry], addr, 0 ))
|
||||
+ munmap( addr, pagesize ); /* someone beat us to it */
|
||||
+ }
|
||||
+
|
||||
@@ -654,7 +654,7 @@ index c1d8882d817..ea71c960007 100644
|
||||
{
|
||||
- struct semaphore *semaphore = (struct semaphore *)objs[i];
|
||||
+ struct semaphore *semaphore = objs[i]->shm;
|
||||
interlocked_xchg_add( &semaphore->count, -1 );
|
||||
InterlockedDecrement( &semaphore->count );
|
||||
}
|
||||
}
|
||||
diff --git a/dlls/ntdll/esync.h b/dlls/ntdll/esync.h
|
||||
|
@@ -43,10 +43,10 @@ index 0a1999162..3d0c17fd1 100644
|
||||
}
|
||||
}
|
||||
|
||||
- obj = interlocked_xchg_ptr((void **)&esync_list[entry][idx], obj);
|
||||
- obj = InterlockedExchangePointer((void **)&esync_list[entry][idx], obj);
|
||||
- assert(!obj);
|
||||
- return TRUE;
|
||||
+ if (!interlocked_cmpxchg((int *)&esync_list[entry][idx].type, type, 0))
|
||||
+ if (!InterlockedCompareExchange((int *)&esync_list[entry][idx].type, type, 0))
|
||||
+ {
|
||||
+ esync_list[entry][idx].fd = fd;
|
||||
+ esync_list[entry][idx].shm = shm;
|
||||
@@ -129,8 +129,8 @@ index 0a1999162..3d0c17fd1 100644
|
||||
|
||||
if (entry < ESYNC_LIST_ENTRIES && esync_list[entry])
|
||||
{
|
||||
- if ((obj = interlocked_xchg_ptr( (void **)&esync_list[entry][idx], 0 )))
|
||||
+ if (interlocked_xchg((int *)&esync_list[entry][idx].type, 0))
|
||||
- if ((obj = InterlockedExchangePointer( (void **)&esync_list[entry][idx], 0 )))
|
||||
+ if (InterlockedExchange((int *)&esync_list[entry][idx].type, 0))
|
||||
{
|
||||
- close( obj->fd );
|
||||
- RtlFreeHeap( GetProcessHeap(), 0, obj );
|
||||
|
@@ -68,7 +68,7 @@ index 506d1c99d..4e5fcef8e 100644
|
||||
+ if ((size = read( obj->fd, &value, sizeof(value) )) == sizeof(value))
|
||||
+ {
|
||||
+ TRACE("Woken up by handle %p [%d].\n", handles[i], i);
|
||||
+ interlocked_xchg_add( &semaphore->count, -1 );
|
||||
+ InterlockedDecrement( &semaphore->count );
|
||||
+ return i;
|
||||
+ }
|
||||
+ }
|
||||
|
@@ -155,12 +155,12 @@ index 4e5fcef8e..663b3658b 100644
|
||||
+ event = obj->shm;
|
||||
+
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
|
||||
- if (prev)
|
||||
+ /* Only bother signaling the fd if we weren't already signaled. */
|
||||
+ if (!(current = interlocked_xchg( &event->signaled, 1 )))
|
||||
+ if (!(current = InterlockedExchange( &event->signaled, 1 )))
|
||||
{
|
||||
- FIXME("Can't write previous value.\n");
|
||||
- *prev = 1;
|
||||
@@ -192,12 +192,12 @@ index 4e5fcef8e..663b3658b 100644
|
||||
+ event = obj->shm;
|
||||
+
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
|
||||
- if (prev)
|
||||
+ /* Only bother signaling the fd if we weren't already signaled. */
|
||||
+ if ((current = interlocked_xchg( &event->signaled, 0 )))
|
||||
+ if ((current = InterlockedExchange( &event->signaled, 0 )))
|
||||
{
|
||||
- FIXME("Can't write previous value.\n");
|
||||
- *prev = 1;
|
||||
@@ -233,7 +233,7 @@ index 4e5fcef8e..663b3658b 100644
|
||||
- *prev = 1;
|
||||
- }
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
|
||||
/* This isn't really correct; an application could miss the write.
|
||||
@@ -242,7 +242,7 @@ index 4e5fcef8e..663b3658b 100644
|
||||
return FILE_GetNtStatus();
|
||||
read( obj->fd, &value, sizeof(value) );
|
||||
|
||||
+ current = interlocked_xchg( &event->signaled, 0 );
|
||||
+ current = InterlockedExchange( &event->signaled, 0 );
|
||||
+ if (prev) *prev = current;
|
||||
+
|
||||
+ /* Release the spinlock. */
|
||||
@@ -273,7 +273,7 @@ index 4e5fcef8e..663b3658b 100644
|
||||
+ * fact that we were able to grab it at all means the count is nonzero,
|
||||
+ * and if someone else grabbed it then the count must have been >= 2,
|
||||
+ * etc. */
|
||||
+ interlocked_xchg_add( &semaphore->count, -1 );
|
||||
+ InterlockedDecrement( &semaphore->count );
|
||||
+ }
|
||||
+ else if (obj->type == ESYNC_AUTO_EVENT)
|
||||
+ {
|
||||
@@ -340,7 +340,7 @@ index 4e5fcef8e..663b3658b 100644
|
||||
- * the fact that we were able to grab it at all means the count
|
||||
- * is nonzero, and if someone else grabbed it then the count
|
||||
- * must have been >= 2, etc. */
|
||||
- interlocked_xchg_add( &semaphore->count, -1 );
|
||||
- InterlockedDecrement( &semaphore->count );
|
||||
- }
|
||||
+ update_grabbed_object( obj );
|
||||
return i;
|
||||
@@ -360,7 +360,7 @@ index 4e5fcef8e..663b3658b 100644
|
||||
- else if (objs[i]->type == ESYNC_SEMAPHORE)
|
||||
- {
|
||||
- struct semaphore *semaphore = objs[i]->shm;
|
||||
- interlocked_xchg_add( &semaphore->count, -1 );
|
||||
- InterlockedDecrement( &semaphore->count );
|
||||
- }
|
||||
- }
|
||||
+ update_grabbed_object( objs[i] );
|
||||
|
@@ -78,7 +78,7 @@ index 847f1e974..1fc9316b1 100644
|
||||
+ if (debug_level)
|
||||
+ fprintf( stderr, "esync: Mapping page %d at %p.\n", entry, addr );
|
||||
+
|
||||
+ if (interlocked_cmpxchg_ptr( &shm_addrs[entry], addr, 0 ))
|
||||
+ if (InterlockedCompareExchangePointer( &shm_addrs[entry], addr, 0 ))
|
||||
+ munmap( addr, pagesize ); /* someone beat us to it */
|
||||
+ }
|
||||
+
|
||||
@@ -116,10 +116,10 @@ index 847f1e974..1fc9316b1 100644
|
||||
+ fprintf( stderr, "esync_set_event() fd=%d\n", esync->fd );
|
||||
+
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+
|
||||
+ if (!interlocked_xchg( &event->signaled, 1 ))
|
||||
+ if (!InterlockedExchange( &event->signaled, 1 ))
|
||||
+ {
|
||||
+ if (write( esync->fd, &value, sizeof(value) ) == -1)
|
||||
+ perror( "esync: write" );
|
||||
@@ -143,11 +143,11 @@ index 847f1e974..1fc9316b1 100644
|
||||
+ fprintf( stderr, "esync_reset_event() fd=%d\n", esync->fd );
|
||||
+
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+
|
||||
+ /* Only bother signaling the fd if we weren't already signaled. */
|
||||
+ if (interlocked_xchg( &event->signaled, 0 ))
|
||||
+ if (InterlockedExchange( &event->signaled, 0 ))
|
||||
+ {
|
||||
+ /* we don't care about the return value */
|
||||
+ read( esync->fd, &value, sizeof(value) );
|
||||
|
@@ -234,7 +234,7 @@ index f5556e91c..19e614a89 100644
|
||||
+ if (debug_level)
|
||||
+ fprintf( stderr, "esync: Mapping page %d at %p.\n", entry, addr );
|
||||
+
|
||||
+ if (interlocked_cmpxchg_ptr( &shm_addrs[entry], addr, 0 ))
|
||||
+ if (InterlockedCompareExchangePointer( &shm_addrs[entry], addr, 0 ))
|
||||
+ munmap( addr, pagesize ); /* someone beat us to it */
|
||||
+ }
|
||||
+
|
||||
@@ -340,7 +340,7 @@ index f5556e91c..19e614a89 100644
|
||||
- if (debug_level)
|
||||
- fprintf( stderr, "esync: Mapping page %d at %p.\n", entry, addr );
|
||||
-
|
||||
- if (interlocked_cmpxchg_ptr( &shm_addrs[entry], addr, 0 ))
|
||||
- if (InterlockedCompareExchangePointer( &shm_addrs[entry], addr, 0 ))
|
||||
- munmap( addr, pagesize ); /* someone beat us to it */
|
||||
- }
|
||||
-
|
||||
|
@@ -23,7 +23,7 @@ index 597cb8fa8..d9b5b1a70 100644
|
||||
+
|
||||
read( obj->fd, &value, sizeof(value) );
|
||||
|
||||
current = interlocked_xchg( &event->signaled, 0 );
|
||||
current = InterlockedExchange( &event->signaled, 0 );
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
@@ -34,12 +34,12 @@ index 2f030c141..87f303403 100644
|
||||
event = obj->shm;
|
||||
|
||||
- /* Acquire the spinlock. */
|
||||
- while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
- while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
- small_pause();
|
||||
+ if (obj->type == ESYNC_MANUAL_EVENT)
|
||||
+ {
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+ }
|
||||
+
|
||||
@@ -53,8 +53,8 @@ index 2f030c141..87f303403 100644
|
||||
+ * *must* signal the fd now, or any waiting threads will never wake up. */
|
||||
|
||||
/* Only bother signaling the fd if we weren't already signaled. */
|
||||
- if (!(current = interlocked_xchg( &event->signaled, 1 )))
|
||||
+ if (!(current = interlocked_xchg( &event->signaled, 1 )) || obj->type == ESYNC_AUTO_EVENT)
|
||||
- if (!(current = InterlockedExchange( &event->signaled, 1 )))
|
||||
+ if (!(current = InterlockedExchange( &event->signaled, 1 )) || obj->type == ESYNC_AUTO_EVENT)
|
||||
{
|
||||
if (write( obj->fd, &value, sizeof(value) ) == -1)
|
||||
- return FILE_GetNtStatus();
|
||||
@@ -78,24 +78,24 @@ index 2f030c141..87f303403 100644
|
||||
event = obj->shm;
|
||||
|
||||
- /* Acquire the spinlock. */
|
||||
- while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
- while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
- small_pause();
|
||||
+ if (obj->type == ESYNC_MANUAL_EVENT)
|
||||
+ {
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+ }
|
||||
|
||||
- /* Only bother signaling the fd if we weren't already signaled. */
|
||||
- if ((current = interlocked_xchg( &event->signaled, 0 )))
|
||||
- if ((current = InterlockedExchange( &event->signaled, 0 )))
|
||||
+ /* For manual-reset events, as long as we're in a lock, we can take the
|
||||
+ * optimization of only calling read() if the event was already signaled.
|
||||
+ *
|
||||
+ * For auto-reset events, we have no guarantee that the previous "signaled"
|
||||
+ * state is actually correct. We need to leave both states unsignaled after
|
||||
+ * leaving this function, so we always have to read(). */
|
||||
+ if ((current = interlocked_xchg( &event->signaled, 0 )) || obj->type == ESYNC_AUTO_EVENT)
|
||||
+ if ((current = InterlockedExchange( &event->signaled, 0 )) || obj->type == ESYNC_AUTO_EVENT)
|
||||
{
|
||||
- /* we don't care about the return value */
|
||||
- read( obj->fd, &value, sizeof(value) );
|
||||
@@ -146,16 +146,16 @@ index 4521993d4..84d0951cb 100644
|
||||
fprintf( stderr, "esync_set_event() fd=%d\n", esync->fd );
|
||||
|
||||
- /* Acquire the spinlock. */
|
||||
- while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
- while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
- small_pause();
|
||||
+ if (esync->type == ESYNC_MANUAL_EVENT)
|
||||
+ {
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+ }
|
||||
|
||||
if (!interlocked_xchg( &event->signaled, 1 ))
|
||||
if (!InterlockedExchange( &event->signaled, 1 ))
|
||||
{
|
||||
@@ -406,8 +409,11 @@ void esync_set_event( struct esync *esync )
|
||||
perror( "esync: write" );
|
||||
@@ -176,17 +176,17 @@ index 4521993d4..84d0951cb 100644
|
||||
fprintf( stderr, "esync_reset_event() fd=%d\n", esync->fd );
|
||||
|
||||
- /* Acquire the spinlock. */
|
||||
- while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
- while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
- small_pause();
|
||||
+ if (esync->type == ESYNC_MANUAL_EVENT)
|
||||
+ {
|
||||
+ /* Acquire the spinlock. */
|
||||
+ while (interlocked_cmpxchg( &event->locked, 1, 0 ))
|
||||
+ while (InterlockedCompareExchange( &event->locked, 1, 0 ))
|
||||
+ small_pause();
|
||||
+ }
|
||||
|
||||
/* Only bother signaling the fd if we weren't already signaled. */
|
||||
if (interlocked_xchg( &event->signaled, 0 ))
|
||||
if (InterlockedExchange( &event->signaled, 0 ))
|
||||
@@ -432,8 +441,11 @@ void esync_reset_event( struct esync *esync )
|
||||
read( esync->fd, &value, sizeof(value) );
|
||||
}
|
||||
|
Reference in New Issue
Block a user