Rebase against 4e2ad334b5881af7661be4d6df3c51aae92ca4a2

This commit is contained in:
Alistair Leslie-Hughes
2020-05-05 09:11:37 +10:00
committed by Zebediah Figura
parent d4918b4305
commit 76ba9d2387
27 changed files with 209 additions and 302 deletions

View File

@@ -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;
+}

View File

@@ -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 );

View File

@@ -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");

View File

@@ -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

View File

@@ -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 );

View File

@@ -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;
+ }
+ }

View File

@@ -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] );

View File

@@ -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) );

View File

@@ -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 */
- }
-

View File

@@ -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

View File

@@ -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) );
}