Commit 0669a8ac authored by Daniel Lehman's avatar Daniel Lehman Committed by Alexandre Julliard

kernel32: Don't use depth in RtlInterlockedFlushSList.

Depth wraps around at 65536 but list supports more elements.
parent 35f0cf26
...@@ -244,8 +244,9 @@ static void test_slist(void) ...@@ -244,8 +244,9 @@ static void test_slist(void)
} item1, item2, item3, *pitem; } item1, item2, item3, *pitem;
SLIST_HEADER slist_header; SLIST_HEADER slist_header;
PSLIST_ENTRY entry; PSLIST_ENTRY entry, next;
USHORT size; USHORT size;
int i;
VOID (WINAPI *pInitializeSListHead)(PSLIST_HEADER); VOID (WINAPI *pInitializeSListHead)(PSLIST_HEADER);
USHORT (WINAPI *pQueryDepthSList)(PSLIST_HEADER); USHORT (WINAPI *pQueryDepthSList)(PSLIST_HEADER);
...@@ -323,6 +324,21 @@ static void test_slist(void) ...@@ -323,6 +324,21 @@ static void test_slist(void)
} }
ok(((struct item*)entry)->value == 2, "item 2 not in front of list\n"); ok(((struct item*)entry)->value == 2, "item 2 not in front of list\n");
ok(((struct item*)entry->Next)->value == 1, "item 1 not at the back of list\n"); ok(((struct item*)entry->Next)->value == 1, "item 1 not at the back of list\n");
for (i = 0; i < 65536; i++)
{
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry));
pInterlockedPushEntrySList(&slist_header, entry);
}
entry = pInterlockedFlushSList(&slist_header);
ok(entry != NULL, "not flushed\n");
while (entry)
{
next = entry->Next;
HeapFree(GetProcessHeap(), 0, entry);
entry = next;
}
} }
static void test_event(void) static void test_event(void)
......
...@@ -1080,7 +1080,7 @@ PSLIST_ENTRY WINAPI RtlInterlockedFlushSList(PSLIST_HEADER list) ...@@ -1080,7 +1080,7 @@ PSLIST_ENTRY WINAPI RtlInterlockedFlushSList(PSLIST_HEADER list)
SLIST_HEADER old, new; SLIST_HEADER old, new;
#ifdef _WIN64 #ifdef _WIN64
if (!list->Header16.Depth) return NULL; if (!list->Header16.NextEntry) return NULL;
new.s.Alignment = new.s.Region = 0; new.s.Alignment = new.s.Region = 0;
new.Header16.HeaderType = 1; /* we use the 16-byte header */ new.Header16.HeaderType = 1; /* we use the 16-byte header */
do do
...@@ -1090,7 +1090,7 @@ PSLIST_ENTRY WINAPI RtlInterlockedFlushSList(PSLIST_HEADER list) ...@@ -1090,7 +1090,7 @@ PSLIST_ENTRY WINAPI RtlInterlockedFlushSList(PSLIST_HEADER list)
} while (!interlocked_cmpxchg128((__int64 *)list, new.s.Region, new.s.Alignment, (__int64 *)&old)); } while (!interlocked_cmpxchg128((__int64 *)list, new.s.Region, new.s.Alignment, (__int64 *)&old));
return (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4); return (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
#else #else
if (!list->s.Depth) return NULL; if (!list->s.Next.Next) return NULL;
new.Alignment = 0; new.Alignment = 0;
do do
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment