Skip to content

Commit 252fdb0

Browse files
CopilotVSadov
andauthored
Remove dead prioritized-wait path from Unix WaitSubsystem (#129081)
This change removes the unused `prioritize` wait path from Unix `WaitSubsystem` internals. All wait registration now follows the existing FIFO behavior, with no public API impact. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: VSadov <8218165+VSadov@users.noreply.github.com>
1 parent c0d7ef5 commit 252fdb0

5 files changed

Lines changed: 21 additions & 58 deletions

File tree

src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ public NamedMutex(SharedMemoryProcessDataHeader<NamedMutexProcessDataBase> proce
647647
_processDataHeader = processDataHeader;
648648
}
649649

650-
public int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, bool prioritize, ref LockHolder lockHolder)
650+
public int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, ref LockHolder lockHolder)
651651
{
652652
lockHolder.Dispose();
653653
LockHolder scope = SharedMemoryManager<NamedMutexProcessDataBase>.Instance.AcquireCreationDeletionProcessLock();

src/libraries/System.Private.CoreLib/src/System/Threading/WaitSubsystem.HandleManager.Unix.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ internal static partial class WaitSubsystem
1313
public interface IWaitableObject
1414
{
1515
void OnDeleteHandle();
16-
int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, bool prioritize, ref LockHolder lockHolder);
16+
int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, ref LockHolder lockHolder);
1717
void Signal(int count, ref LockHolder lockHolder);
1818
}
1919

20-
public static int Wait(this IWaitableObject waitable, ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, bool prioritize)
20+
public static int Wait(this IWaitableObject waitable, ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible)
2121
{
2222
Debug.Assert(waitInfo.Thread == Thread.CurrentThread);
2323

@@ -32,7 +32,7 @@ public static int Wait(this IWaitableObject waitable, ThreadWaitInfo waitInfo, i
3232
throw new ThreadInterruptedException();
3333
}
3434

35-
return waitable.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, prioritize, ref lockHolder);
35+
return waitable.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, ref lockHolder);
3636
}
3737
finally
3838
{

src/libraries/System.Private.CoreLib/src/System/Threading/WaitSubsystem.ThreadWaitInfo.Unix.cs

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ private bool IsWaiting
127127
}
128128

129129
/// <summary>
130-
/// Callers must ensure to clear the array after use. Once <see cref="RegisterWait(int, bool, bool)"/> is called (followed
130+
/// Callers must ensure to clear the array after use. Once <see cref="RegisterWait(int, bool)"/> is called (followed
131131
/// by a call to <see cref="Wait(int, bool, bool, ref LockHolder)"/>, the array will be cleared automatically.
132132
/// </summary>
133133
public WaitableObject?[] GetWaitedObjectArray(int requiredCapacity)
@@ -174,7 +174,7 @@ private WaitedListNode[] GetWaitedListNodeArray(int requiredCapacity)
174174
/// <summary>
175175
/// The caller is expected to populate <see cref="GetWaitedObjectArray"/> and pass in the number of objects filled
176176
/// </summary>
177-
public void RegisterWait(int waitedCount, bool prioritize, bool isWaitForAll)
177+
public void RegisterWait(int waitedCount, bool isWaitForAll)
178178
{
179179
s_lock.VerifyIsLocked();
180180
Debug.Assert(_thread == Thread.CurrentThread);
@@ -218,19 +218,9 @@ public void RegisterWait(int waitedCount, bool prioritize, bool isWaitForAll)
218218

219219
_isWaitForAll = isWaitForAll;
220220
_waitedCount = waitedCount;
221-
if (prioritize)
222-
{
223-
for (int i = 0; i < waitedCount; ++i)
224-
{
225-
waitedListNodes[i].RegisterPrioritizedWait(waitedObjects[i]!);
226-
}
227-
}
228-
else
221+
for (int i = 0; i < waitedCount; ++i)
229222
{
230-
for (int i = 0; i < waitedCount; ++i)
231-
{
232-
waitedListNodes[i].RegisterWait(waitedObjects[i]!);
233-
}
223+
waitedListNodes[i].RegisterWait(waitedObjects[i]!);
234224
}
235225
}
236226

@@ -712,29 +702,6 @@ public void RegisterWait(WaitableObject waitableObject)
712702
waitableObject.WaitersTail = this;
713703
}
714704

715-
public void RegisterPrioritizedWait(WaitableObject waitableObject)
716-
{
717-
s_lock.VerifyIsLocked();
718-
Debug.Assert(_waitInfo.Thread == Thread.CurrentThread);
719-
720-
Debug.Assert(waitableObject != null);
721-
722-
Debug.Assert(_previous == null);
723-
Debug.Assert(_next == null);
724-
725-
WaitedListNode? head = waitableObject.WaitersHead;
726-
if (head != null)
727-
{
728-
_next = head;
729-
head._previous = this;
730-
}
731-
else
732-
{
733-
waitableObject.WaitersTail = this;
734-
}
735-
waitableObject.WaitersHead = this;
736-
}
737-
738705
public void UnregisterWait(WaitableObject waitableObject)
739706
{
740707
s_lock.VerifyIsLocked();

src/libraries/System.Private.CoreLib/src/System/Threading/WaitSubsystem.Unix.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public static SafeWaitHandle NewMutex(bool initiallyOwned)
189189
// by the thread. See <see cref="ThreadWaitInfo.LockedMutexesHead"/>. So, acquire the lock only after all
190190
// possibilities for exceptions have been exhausted.
191191
ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo;
192-
bool acquiredLock = waitableObject.Wait(waitInfo, timeoutMilliseconds: 0, interruptible: false, prioritize: false) == 0;
192+
bool acquiredLock = waitableObject.Wait(waitInfo, timeoutMilliseconds: 0, interruptible: false) == 0;
193193
Debug.Assert(acquiredLock);
194194
return safeWaitHandle;
195195
}
@@ -242,7 +242,7 @@ public static OpenExistingResult OpenNamedMutex(string name, bool isUserScope, o
242242
// by the thread. See <see cref="ThreadWaitInfo.LockedMutexesHead"/>. So, acquire the lock only after all
243243
// possibilities for exceptions have been exhausted.
244244
ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo;
245-
int status = waitableObject.Wait_Locked(waitInfo, timeoutMilliseconds: 0, interruptible: false, prioritize: false, ref lockHolder);
245+
int status = waitableObject.Wait_Locked(waitInfo, timeoutMilliseconds: 0, interruptible: false, ref lockHolder);
246246
Debug.Assert(status == 0);
247247
return safeWaitHandle;
248248
}
@@ -361,13 +361,12 @@ public static int Wait(IntPtr handle, int timeoutMilliseconds, bool interruptibl
361361
public static int Wait(
362362
IWaitableObject waitableObject,
363363
int timeoutMilliseconds,
364-
bool interruptible = true,
365-
bool prioritize = false)
364+
bool interruptible = true)
366365
{
367366
Debug.Assert(waitableObject != null);
368367
Debug.Assert(timeoutMilliseconds >= -1);
369368

370-
return waitableObject.Wait(Thread.CurrentThread.WaitInfo, timeoutMilliseconds, interruptible, prioritize);
369+
return waitableObject.Wait(Thread.CurrentThread.WaitInfo, timeoutMilliseconds, interruptible);
371370
}
372371

373372
public static int Wait(
@@ -385,7 +384,7 @@ public static int Wait(
385384
if (waitHandles.Length == 1 && HandleManager.FromHandle(waitHandles[0]) is NamedMutex namedMutex)
386385
{
387386
// Named mutexes don't participate in the wait subsystem fully.
388-
return namedMutex.Wait(waitInfo, timeoutMilliseconds, interruptible: true, prioritize: false);
387+
return namedMutex.Wait(waitInfo, timeoutMilliseconds, interruptible: true);
389388
}
390389
#endif
391390

@@ -439,7 +438,7 @@ public static int Wait(
439438
WaitableObject waitableObject = waitableObjects[0]!;
440439
waitableObjects[0] = null;
441440
return
442-
waitableObject.Wait(waitInfo, timeoutMilliseconds, interruptible: true, prioritize: false);
441+
waitableObject.Wait(waitInfo, timeoutMilliseconds, interruptible: true);
443442
}
444443

445444
return
@@ -449,8 +448,7 @@ public static int Wait(
449448
waitForAll,
450449
waitInfo,
451450
timeoutMilliseconds,
452-
interruptible: true,
453-
prioritize: false);
451+
interruptible: true);
454452
}
455453

456454
public static int SignalAndWait(
@@ -471,8 +469,7 @@ public static int SignalAndWait(
471469
IWaitableObject waitableObjectToSignal,
472470
IWaitableObject waitableObjectToWaitOn,
473471
int timeoutMilliseconds,
474-
bool interruptible = true,
475-
bool prioritize = false)
472+
bool interruptible = true)
476473
{
477474
Debug.Assert(waitableObjectToSignal != null);
478475
Debug.Assert(waitableObjectToWaitOn != null);
@@ -498,7 +495,7 @@ public static int SignalAndWait(
498495
s_lock.VerifyIsNotLocked();
499496
throw new InvalidOperationException(SR.Threading_WaitHandleTooManyPosts, ex);
500497
}
501-
return waitableObjectToWaitOn.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, prioritize, ref lockHolder);
498+
return waitableObjectToWaitOn.Wait_Locked(waitInfo, timeoutMilliseconds, interruptible, ref lockHolder);
502499
}
503500
finally
504501
{

src/libraries/System.Private.CoreLib/src/System/Threading/WaitSubsystem.WaitableObject.Unix.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ private void AcceptSignal(ThreadWaitInfo waitInfo)
305305
/// This function does not check for a pending thread interrupt. Callers are expected to do that soon after
306306
/// acquiring <see cref="s_lock"/>.
307307
/// </summary>
308-
public int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, bool prioritize, ref LockHolder lockHolder)
308+
public int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool interruptible, ref LockHolder lockHolder)
309309
{
310310
s_lock.VerifyIsLocked();
311311
Debug.Assert(waitInfo != null);
@@ -339,7 +339,7 @@ public int Wait_Locked(ThreadWaitInfo waitInfo, int timeoutMilliseconds, bool in
339339

340340
WaitableObject?[] waitableObjects = waitInfo.GetWaitedObjectArray(1);
341341
waitableObjects[0] = this;
342-
waitInfo.RegisterWait(1, prioritize, isWaitForAll: false);
342+
waitInfo.RegisterWait(1, isWaitForAll: false);
343343

344344
return
345345
waitInfo.Wait(
@@ -355,8 +355,7 @@ public static int Wait(
355355
bool waitForAll,
356356
ThreadWaitInfo waitInfo,
357357
int timeoutMilliseconds,
358-
bool interruptible,
359-
bool prioritize)
358+
bool interruptible)
360359
{
361360
s_lock.VerifyIsNotLocked();
362361
Debug.Assert(waitInfo != null);
@@ -481,7 +480,7 @@ public static int Wait(
481480

482481
waitableObjects = null; // no need to clear this anymore, RegisterWait / Wait will take over from here
483482

484-
waitInfo.RegisterWait(count, prioritize, waitForAll);
483+
waitInfo.RegisterWait(count, waitForAll);
485484
return waitInfo.Wait(timeoutMilliseconds, interruptible, isSleep: false, ref lockHolder);
486485
}
487486
finally

0 commit comments

Comments
 (0)