Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Socket.Dispose() hangs on Mac when invoked concurrently with a blocking Receive(Message)From #47342

Closed
antonfirsov opened this issue Jan 22, 2021 · 7 comments
Labels
area-System.Net.Sockets bug os-mac-os-x macOS aka OSX test-run-core Test failures in .NET Core test runs
Milestone

Comments

@antonfirsov
Copy link
Member

antonfirsov commented Jan 22, 2021

Discovered while implementing tests for #47229.

While on Windows and Linux Socket.Dispose/Close will abort a concurrent blocking ReceiveFrom or ReceiveMessageFrom call, on Mac it leads to a hang. The issue is not present with TCP receives.

Edit: Shutdown leads to the same result.

Repro code

private static async Task DisposeDuringPendingReceiveFrom_UDP(bool receiveMessageFrom)
{
    using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Any, 0));

    EndPoint testEndpoint = new IPEndPoint(IPAddress.Parse("1.2.3.4"), 1234);

    void DoReceiveFrom()
    {
        try
        {
            if (receiveMessageFrom)
            {
                var flags = SocketFlags.None;
                socket.ReceiveMessageFrom(new byte[128], 0, 128, ref flags, ref testEndpoint, out _);
            }
            else
            {
                socket.ReceiveFrom(new byte[128], ref testEndpoint);
            }   
        }
        catch (Exception ex)
        {
            Console.WriteLine($"ABORTED! {ex.GetType().Name} : {ex.Message}");
        }
    }

    Console.WriteLine("Starting operation...");
    Task receiveTask = Task.Run(DoReceiveFrom);
    await Task.Delay(200);

    Console.WriteLine("Disposing...");
    socket.Dispose(); // HANGS HERE

    var timeoutTask = Task.Delay(5000);
    Console.WriteLine("Waiting for operation...");
    if (Task.WhenAny(receiveTask, timeoutTask) == timeoutTask)
    {
        Console.WriteLine("TIMEOUT!!!");
    }
}

Dump

Dump

OS Thread Id: 0xb7669
        Child SP               IP Call Site
00007FFEE8C6DA00 00007fff6250786a [HelperMethodFrame_1OBJ: 00007ffee8c6da00] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)
00007FFEE8C6DB60 000000011DACB23B System.Threading.ManualResetEventSlim.Wait(Int32, System.Threading.CancellationToken)
00007FFEE8C6DBE0 000000011DADF220 System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, System.Threading.CancellationToken) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2849]
00007FFEE8C6DC40 000000011DADF0BB System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2788]
00007FFEE8C6DC90 000000011DB48CB6 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/TaskAwaiter.cs @ 141]
00007FFEE8C6DCB0 000000011DB48C69 System.Runtime.CompilerServices.TaskAwaiter.GetResult() [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/TaskAwaiter.cs @ 104]
00007FFEE8C6DCC0 000000011DF55F0F SendReceiveCancellation_TCP.Program.<Main>(System.String[])
OS Thread Id: 0xb7676
        Child SP               IP Call Site
00007000045D5E18 00007fff6250786a [DebuggerU2MCatchHandlerFrame: 00007000045d5e18]
OS Thread Id: 0xb7678
        Child SP               IP Call Site
OS Thread Id: 0xb7679
        Child SP               IP Call Site
000070000469B8B0 00007fff6250a78e [InlinedCallFrame: 000070000469b8b0] Interop+Sys.WaitForSocketEvents(IntPtr, SocketEvent*, Int32*)
000070000469B8B0 000000011df60ca8 [InlinedCallFrame: 000070000469b8b0] Interop+Sys.WaitForSocketEvents(IntPtr, SocketEvent*, Int32*)
000070000469B8A0 000000011DF60CA8 ILStubClass.IL_STUB_PInvoke(IntPtr, SocketEvent*, Int32*)
000070000469B930 000000011E1691A4 System.Net.Sockets.SocketAsyncEngine.EventLoop() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs @ 190]
000070000469B980 000000011E169725 System.Net.Sockets.SocketAsyncEngine+<>c.<.ctor>b__14_0(System.Object) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs @ 165]
000070000469B990 000000011DAC04DA System.Threading.ThreadHelper.ThreadStart(System.Object) [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs @ 79]
000070000469BDC8 0000000107409409 [DebuggerU2MCatchHandlerFrame: 000070000469bdc8]
OS Thread Id: 0xb767b
        Child SP               IP Call Site
00007000047A1430 00007fff6250978a [InlinedCallFrame: 00007000047a1430] Interop+Sys.ReceiveMessage(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A1430 000000011df693c8 [InlinedCallFrame: 00007000047a1430] Interop+Sys.ReceiveMessage(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A1420 000000011DF693C8 ILStubClass.IL_STUB_PInvoke(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A14C0 000000011E169C54 System.Net.Sockets.SocketPal.SysReceive(System.Net.Sockets.SafeSocketHandle, System.Net.Sockets.SocketFlags, System.Span`1<Byte>, Byte[], Int32 ByRef, System.Net.Sockets.SocketFlags ByRef, Error ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 144]
00007000047A1590 000000011E16B93B System.Net.Sockets.SocketPal.TryCompleteReceiveFrom(System.Net.Sockets.SafeSocketHandle, System.Span`1<Byte>, System.Collections.Generic.IList`1<System.ArraySegment`1<Byte>>, System.Net.Sockets.SocketFlags, Byte[], Int32 ByRef, Int32 ByRef, System.Net.Sockets.SocketFlags ByRef, System.Net.Sockets.SocketError ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 763]
00007000047A1610 000000011E164E06 System.Net.Sockets.SocketAsyncContext.ReceiveFrom(System.Memory`1<Byte>, System.Net.Sockets.SocketFlags ByRef, Byte[], Int32 ByRef, Int32, Int32 ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs @ 1502]
00007000047A1690 000000011E16CDF9 System.Net.Sockets.SocketPal.ReceiveFrom(System.Net.Sockets.SafeSocketHandle, Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, Byte[], Int32 ByRef, Int32 ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 1198]
00007000047A1720 000000011E14C391 System.Net.Sockets.Socket.ReceiveFrom(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.EndPoint ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1677]
00007000047A17B0 000000011E14C783 System.Net.Sockets.Socket.ReceiveFrom(Byte[], System.Net.EndPoint ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1741]
00007000047A17C0 000000011DF6856D SendReceiveCancellation_TCP.Program+<>c__DisplayClass1_0.<DisposeDuringPendingReceiveFrom_UDP>g__DoReceiveFrom|0() [/Users/presenter/anton/dev/SOX/Other/SendReceiveCancellation-TCP/Program.cs @ 30]
00007000047A1840 000000011DADE941 System.Threading.Tasks.Task.InnerInvoke() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2370]
00007000047A1860 000000011DAE4851 System.Threading.Tasks.Task+<>c.<.cctor>b__277_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2358]
00007000047A1870 000000011DAC9952 System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 274]
00007000047A18B0 000000011DADE779 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2320]
00007000047A1930 000000011DADE558 System.Threading.Tasks.Task.ExecuteEntryUnsafe(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2252]
00007000047A1950 000000011DADE4F7 System.Threading.Tasks.Task.ExecuteFromThreadPool(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2243]
00007000047A1960 000000011DAD2B33 System.Threading.ThreadPoolWorkQueue.Dispatch() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.cs @ 641]
00007000047A19E0 000000011DAC1E27 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs @ 29]
00007000047A1D88 0000000107409409 [DebuggerU2MCatchHandlerFrame: 00007000047a1d88]
OS Thread Id: 0xb767d
        Child SP               IP Call Site
0000700004867278 00007fff6250786a [HelperMethodFrame: 0000700004867278] System.Threading.Thread.SleepInternal(Int32)
00007000048673C0 000000011DF69DEF System.Threading.SpinWait.SpinOnceCore(Int32) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/SpinWait.cs @ 241]
0000700004867450 000000011E146A75 System.Net.Sockets.SafeSocketHandle.CloseAsIs(Boolean) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SafeSocketHandle.cs @ 113]
0000700004867490 000000011E1546F7 System.Net.Sockets.Socket.Dispose(Boolean) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 4374]
00007000048674F0 000000011E154BB7 System.Net.Sockets.Socket.Dispose() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 4443]
0000700004867510 000000011E14A089 System.Net.Sockets.Socket.Close() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1015]
0000700004867530 000000011DF58120 SendReceiveCancellation_TCP.Program+<DisposeDuringPendingReceiveFrom_UDP>d__1.MoveNext() [/Users/presenter/anton/dev/SOX/Other/SendReceiveCancellation-TCP/Program.cs @ 44]
0000700004867610 000000011DC27BC5 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].ExecutionContextCallback(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 289]
0000700004867620 000000011DAC9801 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 186]
0000700004867670 000000011DC27A5A System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].MoveNext(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 327]
00007000048676C0 000000011DC27B29 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].MoveNext() [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 305]
00007000048676D0 000000011DAE6EF1 System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(System.Runtime.CompilerServices.IAsyncStateMachineBox, Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/TaskContinuation.cs @ 795]
0000700004867710 000000011DADF90D System.Threading.Tasks.Task.RunContinuations(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3222]
00007000048677C0 000000011DADF849 System.Threading.Tasks.Task.FinishContinuations() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3194]00007000048677E0 000000011DADF699 System.Threading.Tasks.Task.TrySetResult() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3089]
0000700004867810 000000011DAE3A85 System.Threading.Tasks.Task+DelayPromise.CompleteTimedOut() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 5397]
0000700004867830 000000011DAE3B65 System.Threading.Tasks.Task+DelayPromise+<>c.<.ctor>b__1_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 5384]
0000700004867840 000000011DAD49A1 System.Threading.TimerQueueTimer.CallCallback(Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 627]
0000700004867880 000000011DAD47CD System.Threading.TimerQueueTimer.Fire(Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 589]
00007000048678D0 000000011DAC3E62 System.Threading.TimerQueue.FireNextTimers() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 274]
0000700004867940 000000011DAC3A75 System.Threading.TimerQueue.AppDomainTimerCallback(Int32) [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Timer.CoreCLR.cs @ 59]
0000700004867CE8 0000000107409409 [DebuggerU2MCatchHandlerFrame: 0000700004867ce8]
OS Thread Id: 0xb767e
        Child SP               IP Call Site
@dotnet-issue-labeler dotnet-issue-labeler bot added area-System.Net.Sockets untriaged New issue has not been triaged by the area owner labels Jan 22, 2021
@ghost
Copy link

ghost commented Jan 22, 2021

Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

Issue Details

Discovered while implementing tests for #47229.

While on Windows and Linux Socket.Dispose/Close will abort a concurrent blocking ReceiveFrom or ReceiveMessageFrom call, on Mac it leads to a hang. The issue is not present with TCP receives.

Repro code

private static async Task DisposeDuringPendingReceiveFrom_UDP(bool receiveMessageFrom)
{
    using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Any, 0));

    EndPoint testEndpoint = new IPEndPoint(IPAddress.Parse("1.2.3.4"), 1234);

    void DoReceiveFrom()
    {
        try
        {
            if (receiveMessageFrom)
            {
                var flags = SocketFlags.None;
                socket.ReceiveMessageFrom(new byte[128], 0, 128, ref flags, ref testEndpoint, out _);
            }
            else
            {
                socket.ReceiveFrom(new byte[128], ref testEndpoint);
            }   
        }
        catch (Exception ex)
        {
            Console.WriteLine($"ABORTED! {ex.GetType().Name} : {ex.Message}");
        }
    }

    Console.WriteLine("Starting operation...");
    Task receiveTask = Task.Run(DoReceiveFrom);
    await Task.Delay(200);

    Console.WriteLine("Disposing...");
    socket.Dispose(); // HANGS HERE

    var timeoutTask = Task.Delay(5000);
    Console.WriteLine("Waiting for operation...");
    if (Task.WhenAny(receiveTask, timeoutTask) == timeoutTask)
    {
        Console.WriteLine("TIMEOUT!!!");
    }
}

Dump

Dump

OS Thread Id: 0xb7669
        Child SP               IP Call Site
00007FFEE8C6DA00 00007fff6250786a [HelperMethodFrame_1OBJ: 00007ffee8c6da00] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)
00007FFEE8C6DB60 000000011DACB23B System.Threading.ManualResetEventSlim.Wait(Int32, System.Threading.CancellationToken)
00007FFEE8C6DBE0 000000011DADF220 System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, System.Threading.CancellationToken) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2849]
00007FFEE8C6DC40 000000011DADF0BB System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2788]
00007FFEE8C6DC90 000000011DB48CB6 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/TaskAwaiter.cs @ 141]
00007FFEE8C6DCB0 000000011DB48C69 System.Runtime.CompilerServices.TaskAwaiter.GetResult() [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/TaskAwaiter.cs @ 104]
00007FFEE8C6DCC0 000000011DF55F0F SendReceiveCancellation_TCP.Program.<Main>(System.String[])
OS Thread Id: 0xb7676
        Child SP               IP Call Site
00007000045D5E18 00007fff6250786a [DebuggerU2MCatchHandlerFrame: 00007000045d5e18]
OS Thread Id: 0xb7678
        Child SP               IP Call Site
OS Thread Id: 0xb7679
        Child SP               IP Call Site
000070000469B8B0 00007fff6250a78e [InlinedCallFrame: 000070000469b8b0] Interop+Sys.WaitForSocketEvents(IntPtr, SocketEvent*, Int32*)
000070000469B8B0 000000011df60ca8 [InlinedCallFrame: 000070000469b8b0] Interop+Sys.WaitForSocketEvents(IntPtr, SocketEvent*, Int32*)
000070000469B8A0 000000011DF60CA8 ILStubClass.IL_STUB_PInvoke(IntPtr, SocketEvent*, Int32*)
000070000469B930 000000011E1691A4 System.Net.Sockets.SocketAsyncEngine.EventLoop() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs @ 190]
000070000469B980 000000011E169725 System.Net.Sockets.SocketAsyncEngine+<>c.<.ctor>b__14_0(System.Object) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEngine.Unix.cs @ 165]
000070000469B990 000000011DAC04DA System.Threading.ThreadHelper.ThreadStart(System.Object) [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs @ 79]
000070000469BDC8 0000000107409409 [DebuggerU2MCatchHandlerFrame: 000070000469bdc8]
OS Thread Id: 0xb767b
        Child SP               IP Call Site
00007000047A1430 00007fff6250978a [InlinedCallFrame: 00007000047a1430] Interop+Sys.ReceiveMessage(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A1430 000000011df693c8 [InlinedCallFrame: 00007000047a1430] Interop+Sys.ReceiveMessage(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A1420 000000011DF693C8 ILStubClass.IL_STUB_PInvoke(System.Runtime.InteropServices.SafeHandle, MessageHeader*, System.Net.Sockets.SocketFlags, Int64*)
00007000047A14C0 000000011E169C54 System.Net.Sockets.SocketPal.SysReceive(System.Net.Sockets.SafeSocketHandle, System.Net.Sockets.SocketFlags, System.Span`1<Byte>, Byte[], Int32 ByRef, System.Net.Sockets.SocketFlags ByRef, Error ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 144]
00007000047A1590 000000011E16B93B System.Net.Sockets.SocketPal.TryCompleteReceiveFrom(System.Net.Sockets.SafeSocketHandle, System.Span`1<Byte>, System.Collections.Generic.IList`1<System.ArraySegment`1<Byte>>, System.Net.Sockets.SocketFlags, Byte[], Int32 ByRef, Int32 ByRef, System.Net.Sockets.SocketFlags ByRef, System.Net.Sockets.SocketError ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 763]
00007000047A1610 000000011E164E06 System.Net.Sockets.SocketAsyncContext.ReceiveFrom(System.Memory`1<Byte>, System.Net.Sockets.SocketFlags ByRef, Byte[], Int32 ByRef, Int32, Int32 ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs @ 1502]
00007000047A1690 000000011E16CDF9 System.Net.Sockets.SocketPal.ReceiveFrom(System.Net.Sockets.SafeSocketHandle, Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, Byte[], Int32 ByRef, Int32 ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @ 1198]
00007000047A1720 000000011E14C391 System.Net.Sockets.Socket.ReceiveFrom(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.EndPoint ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1677]
00007000047A17B0 000000011E14C783 System.Net.Sockets.Socket.ReceiveFrom(Byte[], System.Net.EndPoint ByRef) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1741]
00007000047A17C0 000000011DF6856D SendReceiveCancellation_TCP.Program+<>c__DisplayClass1_0.<DisposeDuringPendingReceiveFrom_UDP>g__DoReceiveFrom|0() [/Users/presenter/anton/dev/SOX/Other/SendReceiveCancellation-TCP/Program.cs @ 30]
00007000047A1840 000000011DADE941 System.Threading.Tasks.Task.InnerInvoke() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2370]
00007000047A1860 000000011DAE4851 System.Threading.Tasks.Task+<>c.<.cctor>b__277_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2358]
00007000047A1870 000000011DAC9952 System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 274]
00007000047A18B0 000000011DADE779 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2320]
00007000047A1930 000000011DADE558 System.Threading.Tasks.Task.ExecuteEntryUnsafe(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2252]
00007000047A1950 000000011DADE4F7 System.Threading.Tasks.Task.ExecuteFromThreadPool(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 2243]
00007000047A1960 000000011DAD2B33 System.Threading.ThreadPoolWorkQueue.Dispatch() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.cs @ 641]
00007000047A19E0 000000011DAC1E27 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs @ 29]
00007000047A1D88 0000000107409409 [DebuggerU2MCatchHandlerFrame: 00007000047a1d88]
OS Thread Id: 0xb767d
        Child SP               IP Call Site
0000700004867278 00007fff6250786a [HelperMethodFrame: 0000700004867278] System.Threading.Thread.SleepInternal(Int32)
00007000048673C0 000000011DF69DEF System.Threading.SpinWait.SpinOnceCore(Int32) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/SpinWait.cs @ 241]
0000700004867450 000000011E146A75 System.Net.Sockets.SafeSocketHandle.CloseAsIs(Boolean) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SafeSocketHandle.cs @ 113]
0000700004867490 000000011E1546F7 System.Net.Sockets.Socket.Dispose(Boolean) [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 4374]
00007000048674F0 000000011E154BB7 System.Net.Sockets.Socket.Dispose() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 4443]
0000700004867510 000000011E14A089 System.Net.Sockets.Socket.Close() [/_/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @ 1015]
0000700004867530 000000011DF58120 SendReceiveCancellation_TCP.Program+<DisposeDuringPendingReceiveFrom_UDP>d__1.MoveNext() [/Users/presenter/anton/dev/SOX/Other/SendReceiveCancellation-TCP/Program.cs @ 44]
0000700004867610 000000011DC27BC5 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].ExecutionContextCallback(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 289]
0000700004867620 000000011DAC9801 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 186]
0000700004867670 000000011DC27A5A System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].MoveNext(System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 327]
00007000048676C0 000000011DC27B29 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib],[System.__Canon, System.Private.CoreLib]].MoveNext() [/_/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncTaskMethodBuilderT.cs @ 305]
00007000048676D0 000000011DAE6EF1 System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(System.Runtime.CompilerServices.IAsyncStateMachineBox, Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/TaskContinuation.cs @ 795]
0000700004867710 000000011DADF90D System.Threading.Tasks.Task.RunContinuations(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3222]
00007000048677C0 000000011DADF849 System.Threading.Tasks.Task.FinishContinuations() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3194]00007000048677E0 000000011DADF699 System.Threading.Tasks.Task.TrySetResult() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 3089]
0000700004867810 000000011DAE3A85 System.Threading.Tasks.Task+DelayPromise.CompleteTimedOut() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 5397]
0000700004867830 000000011DAE3B65 System.Threading.Tasks.Task+DelayPromise+<>c.<.ctor>b__1_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @ 5384]
0000700004867840 000000011DAD49A1 System.Threading.TimerQueueTimer.CallCallback(Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 627]
0000700004867880 000000011DAD47CD System.Threading.TimerQueueTimer.Fire(Boolean) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 589]
00007000048678D0 000000011DAC3E62 System.Threading.TimerQueue.FireNextTimers() [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs @ 274]
0000700004867940 000000011DAC3A75 System.Threading.TimerQueue.AppDomainTimerCallback(Int32) [/_/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Timer.CoreCLR.cs @ 59]
0000700004867CE8 0000000107409409 [DebuggerU2MCatchHandlerFrame: 0000700004867ce8]
OS Thread Id: 0xb767e
        Child SP               IP Call Site
Author: antonfirsov
Assignees: -
Labels:

area-System.Net.Sockets, untriaged

Milestone: -

antonfirsov added a commit to antonfirsov/runtime that referenced this issue Jan 22, 2021
@karelz karelz added os-mac-os-x macOS aka OSX test-run-core Test failures in .NET Core test runs bug and removed untriaged New issue has not been triaged by the area owner labels Feb 4, 2021
@karelz
Copy link
Member

karelz commented Feb 4, 2021

Triage: It is deadlock (or waiting for another packet) on Mac (development scenario) using UDP (which is not super common). Does not affect TCP, which is already fixed -- Idea: Can we reuse TCP solution in UDP as well?
We had discussion in the past to not spin and use alternatives, may be non-trivial work.

Until we have hits from customers / high impact on CI, moving to Future.

@karelz karelz added this to the Future milestone Feb 4, 2021
@rdcm
Copy link

rdcm commented Apr 12, 2021

@antonfirsov

Hi, same issue for me.

I develop my own udp lib under MacOs and after the call Dispose for the socket, the call never returns.
ReceiveFrom and Dispose called from independent threads.

Could you suggest any workaround?
This bug prevents typical disposable pattern implementation.

@antonfirsov
Copy link
Member Author

@rdcm I recommend to go async with either the task-based or the SocketSyncEventArgs overload of ReceiveFromAsync. The latter is more efficient with the current implementation, though harder to use.

@wfurt
Copy link
Member

wfurt commented Jan 25, 2023

It seems like we did not find a way how to do this on macOS, right @tmds?
It seems like we may just need to document it. And perhaps recommend to use select/poll to avoid it.

@wfurt
Copy link
Member

wfurt commented Sep 10, 2024

This seems like dup of #64551. While this is older, the other issue has more discussion in it. So perhaps we can close this one instead @antonfirsov ?

@antonfirsov
Copy link
Member Author

Duplicate of #64551.

@github-actions github-actions bot locked and limited conversation to collaborators Oct 12, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.Net.Sockets bug os-mac-os-x macOS aka OSX test-run-core Test failures in .NET Core test runs
Projects
None yet
Development

No branches or pull requests

4 participants