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

Enable IOPack, IOEnqueue, and IODequeue on Windows #88894

Merged
merged 22 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a8ed540
Testing IOPack
eduardo-vp Jul 13, 2023
8153deb
Add IOEnqueue event
eduardo-vp Jul 14, 2023
ed000ad
Add IODequeue event in NativeOverlappedCallback for Windows Threadpool
eduardo-vp Jul 24, 2023
d3ed46e
Search for ThreadPoolIOPack event
eduardo-vp Jul 25, 2023
bd58b31
Add EventPipeEventThreadPoolIOPack initialization
eduardo-vp Aug 1, 2023
4ae8996
Use EventLevel.Verbose, test fixed
eduardo-vp Aug 1, 2023
9cdf4a5
Add test to NativeAot CI runs + Evaluate WorkerThread events only in …
eduardo-vp Aug 2, 2023
70032d9
Fixed typo in runtime.yml
eduardo-vp Aug 2, 2023
1aee4f9
Fix test
eduardo-vp Aug 3, 2023
0fda41d
Nit: Comment removed
eduardo-vp Aug 3, 2023
951be33
Merge branch 'main' into feature/add-threadpool-events
eduardo-vp Aug 3, 2023
4d13acc
Test IOPack, IOEnqueue and IODequeue
eduardo-vp Aug 3, 2023
37cdadf
Nit: Fixed variable name
eduardo-vp Aug 3, 2023
cb86c96
Used a separate ManualResetEvent
eduardo-vp Aug 3, 2023
432136a
Used different ManualResetEvent for each IOEvent
eduardo-vp Aug 3, 2023
4d86a5e
Update test, test UnsafeQueueNativeOverlapped in Windows only
eduardo-vp Aug 4, 2023
8fb1008
Added events in RegisterWaitHandle and real async IO for Windows thre…
eduardo-vp Aug 5, 2023
2e94127
Test fixed. Still missing why the first part doesn't work on NativeAot
eduardo-vp Aug 5, 2023
e12ce91
PR comments
eduardo-vp Aug 8, 2023
07dd9ee
Merge branch 'main' into feature/add-threadpool-events
eduardo-vp Aug 8, 2023
84de91a
Fire IODequeue before CompleteWithCallback in OnNativeIOCompleted
eduardo-vp Aug 8, 2023
995f189
Fixed comment
eduardo-vp Aug 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,10 @@ public static void Free(NativeOverlapped* nativeOverlappedPtr)

#if FEATURE_PERFTRACING
#if !((TARGET_BROWSER || TARGET_WASI) && !FEATURE_WASM_THREADS)
#if !NATIVEAOT // TODO shipping criteria: no EVENTPIPE-NATIVEAOT-TODO left in the codebase
// TODO shipping criteria: no EVENTPIPE-NATIVEAOT-TODO left in the codebase
eduardo-vp marked this conversation as resolved.
Show resolved Hide resolved
if (NativeRuntimeEventSource.Log.IsEnabled())
NativeRuntimeEventSource.Log.ThreadPoolIOPack(pNativeOverlapped);
#endif
#endif
#endif

NativeOverlapped* pRet = pNativeOverlapped;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using Microsoft.Win32.SafeHandles;
using System.Diagnostics;
using System.Diagnostics.Tracing;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
Expand Down Expand Up @@ -200,6 +201,10 @@ public static unsafe bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapp

// OS doesn't signal handle, so do it here
overlapped->InternalLow = (IntPtr)0;

if (NativeRuntimeEventSource.Log.IsEnabled())
NativeRuntimeEventSource.Log.ThreadPoolIOEnqueue(overlapped);
eduardo-vp marked this conversation as resolved.
Show resolved Hide resolved

// Both types of callbacks are executed on the same thread pool
return ThreadPool.UnsafeQueueUserWorkItem(NativeOverlappedCallback, (nint)overlapped, preferLocal: false);
}
Expand Down
18 changes: 11 additions & 7 deletions src/tests/tracing/eventlistener/EventListenerThreadPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ internal sealed class RuntimeEventListener : EventListener
public volatile int TPWorkerThreadStartCount = 0;
public volatile int TPWorkerThreadStopCount = 0;
public volatile int TPWorkerThreadWaitCount = 0;
public volatile int TPIOPack = 0;

public ManualResetEvent TPWaitEvent = new ManualResetEvent(false);

Expand Down Expand Up @@ -40,6 +41,10 @@ protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
Interlocked.Increment(ref TPWorkerThreadWaitCount);
TPWaitEvent.Set();
} else if (eventData.EventName.Equals("IOPack"))
eduardo-vp marked this conversation as resolved.
Show resolved Hide resolved
eduardo-vp marked this conversation as resolved.
Show resolved Hide resolved
{
Interlocked.Increment(ref TPIOPack);
TPWaitEvent.Set();
}
}
}
Expand All @@ -50,18 +55,17 @@ static int Main()
{
using (RuntimeEventListener listener = new RuntimeEventListener())
{
int someNumber = 0;
Task[] tasks = new Task[100];
for (int i = 0; i < tasks.Length; i++)
Overlapped overlapped = new Overlapped();
IOCompletionCallback completionCallback = null;

unsafe
{
tasks[i] = Task.Run(() => { someNumber += 1; });
overlapped.Pack(completionCallback);
}

listener.TPWaitEvent.WaitOne(TimeSpan.FromMinutes(3));

if (listener.TPWorkerThreadStartCount > 0 ||
listener.TPWorkerThreadStopCount > 0 ||
listener.TPWorkerThreadWaitCount > 0)
if (listener.TPIOPack > 0)
eduardo-vp marked this conversation as resolved.
Show resolved Hide resolved
{
Console.WriteLine("Test Passed.");
return 100;
Expand Down