Skip to content

Add the durable ioring and the Win32 layers under it - #159

Merged
MikeGrier merged 17 commits into
mainfrom
mikegrier/durable-ioring-release
Oct 22, 2026
Merged

MikeGrier merged 17 commits into
mainfrom
mikegrier/durable-ioring-release

Conversation

@MikeGrier

@MikeGrier MikeGrier commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

Summary

The durable ioring and the safe Windows layers under it, cut into one commit per releasing crate so that release-please attributes each crate's changes to it. Apart from the two fixes at the end, the content is mikegrier/durable-ioring-squashed's (the trees were identical) as 105 commits.

The durable ioring

  • durable-ioring (portable core), win-durable-ioring (the Windows driver) and the new durable-ioring-events (an ETW provider and EtwDiagnostics).
  • A typed Key<A> carries a target's declared access to the ring's submit methods, and RoutingProvider dispatches each seal by flush domain.
  • Diagnostics are begin/end pairs (seals, flushes, lock waits) joined by a CorrelationId. PairingChecker is the one definition of what a correct producer emits. A sink assumes no begin for an end, and a fan-out hands every pair's end to every sink (DI-D-96).
  • Each pair is written as one ETW activity, created by EventActivityIdControl and carried on both events (DE-D-6). Text in an event ends at its first zero (DE-D-7).
  • DebugOutputDiagnostics writes each event to the debugger.

Safe layers over Win32

  • New crates: win-etw-sys, win-debugging-sys and win-text-sys.
  • win-handles-sys gains set_handle_information, compare_object_handles, close_handle and duplicate_handle, which chooses both the access and the inheritance.
  • windows-file-watcher, windows-waitable-queues and win-job-launcher duplicate handles through win-handles-sys instead of their own DuplicateHandle calls.
  • windows-file-watcher hands out its doorbell as a SharedHandle through Receiver::doorbell_shared.
  • windows-threadpool-sys accepts a SharedHandle as a wait target, and windows-file-enumeration-sys is rebuilt on the request crate's entries and the shared event.

How the commits are cut

  • One commit per crate that makes a release, each with a conventional subject carrying ! and a BREAKING CHANGE: footer where the crate breaks. A "Squashes:" list in each body names the original commits.
  • The crates that make no release (docs, plans, refactors) are grouped in chore commits, and the workspace's CI, tooling and root documents follow the crate commits.
  • Two commits at the end answer this PR's first CI run and review: win-handles-sys joins the shared inputs of the sabotage sweeps, because win-job-launcher, which supervises every sweep, now builds on it (the harness test that checks the launcher's dependencies against cargo caught it); and a doc comment in durable-ioring that still described the removed lock-wait timing is corrected. The first makes a change to win-handles-sys reach every manifest's sweep, which is the cost of the launcher depending on it.
  • Every commit builds. Each was checked on its own with a workspace cargo check --all-targets, and the tip passes --locked.
  • win-sync-sys has two commits on purpose. An additive feat comes first, the dependents move, and the deleting feat! comes last. Deleting first would break win-durable-ioring, which still calls try_clone.
  • durable-ioring, durable-ioring-events and win-durable-ioring are one feat! commit. Each needs the others' final API, so none builds alone. All three take a breaking bump, so none gets one it did not earn. tools/check-commit-scope.ps1 flags it for that reason.

Breaking changes

  • durable-ioring and win-durable-ioring: the typed Key<A>, the begin/end pair events, and win-durable-ioring's typed access, share mode, path and disposition. durable-ioring-events is new, and takes its first breaking bump from the same commit.
  • win-etw-sys (new): events are written with an explicit activity id, so Recorded gains fields and is #[non_exhaustive].
  • win-sync-sys: Event clones share one handle, and try_clone and the conversions into OwnedHandle are removed.
  • windows-file-enumeration-sys: doorbell_owned is replaced by doorbell_waitable, and it takes the request crate's path contract.
  • windows-threadpool-sys: a wait built from an Event is a shared target, so WaitableHandle::into_handle returns the wrapper unchanged while any clone of the Event remains.

Merging

Please merge with a merge commit or a rebase, not a squash. release-please attributes versions and changelog entries to crates from the individual commit subjects and the paths they touch, so a squash would collapse the branch into one subject.

Release order

The three crates that call win_handles_sys::duplicate_handle require win-handles-sys = "0.1.0", which is also what win-sync-sys requires. The win-handles-sys release that adds duplicate_handle should publish first. If a consumer is published against 0.1.0, the build verification fails loudly, so nothing wrong would ship.

Verification

  • Each of the original commits was gated on fmt, clippy with warnings denied, tests and doctests, rustdoc with broken intra-doc links denied, the locked workspace check, and the repo's checks (publishable, archives, encoding, sabotage patches, commit scope).
  • Behaviour that the tests could miss is covered by sabotage manifests, each with a control that must survive, swept with tools/run-sabotage.ps1.
  • Two reviews of the full branch diff were run. Their findings (embedded NULs corrupting later ETW fields, a fan-out that leaked activity-map entries, and the missing breaking-change marker on the threadpool change) are fixed.

Trace-session tests: the ETW session tests in durable-ioring-events/tests/session.rs need an elevated process, so they are ignored by default and CI runs them with --include-ignored in the default-features job. They passed there on this branch's first CI run, including the ones rewritten or added after the last local elevated run. One session sabotage entry (DE-D-7, an end releasing its pair only when it is written) was added without a sweep.

Mike Grier and others added 15 commits October 22, 2026 09:02
… take no release

The crates that make no release on this branch: io-buffers, win-error-codes,
win-numa-sys, win-pipes-sys, win-shared-os-owned-handle, win-volume-sys,
windows-impersonation-token-sys, windows-namespace-request-sys,
windows-overlapped-io-sys, windows-topology-sys and wtf-string. Their checklists,
design notes and the refactors that came with the durable-ioring work, as they
stand at the end of mikegrier/durable-ioring-squashed.

Squashes:
- chore: tests, docs and plans of the crates that take no release from the durable-ioring branch
- docs(shared-handle): close SH-1+.1 -- every crate that wrapped Arc<OwnedHandle> now holds a SharedHandle
- docs(win-volume-sys): move the completed milestones WV-M1 to WV-M3 to COMPLETED-CHECKLIST.md
- docs(win-pipes-sys): migrate the completed WP-1 stubs out of CHECKLIST.md
- docs(wtf-string): move the M-inf horizon into PARKED.md
- docs(overlapped-io), docs(win-numa-sys): mark the reopened plans not started
- docs: park what the completed checklists of the tail watcher and win-volume-sys have left

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…se a handle with its result, and duplicate with the access and inheritance chosen

set_handle_information over SetHandleInformation, compare_object_handles over
CompareObjectHandles, close_handle over CloseHandle taking an OwnedHandle and
reporting the call's error, and duplicate_handle over DuplicateHandle with the
access (the source's or a chosen mask) and the inheritance chosen.
duplicate_handle_with_access is the same call with a mask and no inheritance, so the
crate has one DuplicateHandle site. Decisions WH-D-3 to WH-D-6; the checklist is
complete.

Squashes:
- feat(win-handles-sys): set a handle's flags with SetHandleInformation
- feat(win-handles-sys): ask whether two handles name one kernel object with CompareObjectHandles
- feat(win-handles-sys): close a handle and learn whether it closed with CloseHandle
- feat(win-handles-sys): duplicate a handle with the access kept or chosen and its inheritance chosen

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ingOrdinal

A memory-safe wrapper over CompareStringOrdinal for the ordinal, optionally
case-folded comparison of two counted UTF-16 slices. It adds no policy; what a caller
does with a refused length is the caller's (WT-D-2). The crate is registered in the
workspace, the release manifest and the release config.

Squashes:
- feat(win-text-sys): new crate, compare_string_ordinal over CompareStringOrdinal

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…bugStringW, and a test-util debugger that keeps what a process sends

output_debug_string over OutputDebugStringW, and under a test-util feature
run_debugged, a debugger that launches a process and keeps the strings it sends to the
debugger. The crate is registered in the workspace, the release manifest and the
release config.

Squashes:
- feat(win-debugging-sys): new crate, output_debug_string over OutputDebugStringW
- feat(win-debugging-sys): a test-util feature with run_debugged, a debugger that keeps what a process sends

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…provider functions, with activity ids

A Registration over EventRegister, EventWrite and EventWriteTransfer, which takes an
activity id and a related activity id from the caller so a begin and its end written
on two threads carry one activity, and create_activity_id over EventActivityIdControl.
A test-util session starts a trace session and reads what it recorded, each Recorded
carrying its activity and related activity ids. The crate is registered in the
workspace, the release manifest and the release config.

Squashes:
- feat(win-etw-sys): new crate, a Registration over the Event Tracing provider functions
- feat(win-etw-sys): create an activity id with EventActivityIdControl
- feat(win-etw-sys)!: write an event with an explicit activity id by EventWriteTransfer

BREAKING CHANGE: Recorded gains two fields and is #[non_exhaustive]; WriteError's Display text changes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… operation is duplicate_wait_only

An Event and a WaitOnlyEvent are Clone, and a clone shares the one handle through a
win-shared-os-owned-handle SharedHandle, closed when the last holder drops. The
conversions into SharedHandle and try_into_owned are added beside try_clone and the
conversions into OwnedHandle, which stay until their dependents have moved.
DuplicateHandle and the Access mask now come from win-handles-sys and are
re-exported at the paths they had.

Squashes:
- feat(win-sync): an Event's clones share one handle, and the wait-only operation is duplicate_wait_only

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ilt from an Event shares its handle with the clones the caller keeps

WaitableHandle::assume_waitable_shared takes a SharedHandle, held by the wait with
every clone the caller keeps, and closed when the last holder drops. From<Event> for
WaitableHandle builds such a shared target, so a caller keeps a clone of the Event to
signal it once the wait holds it. The documentation on From<Event> and
WaitableHandle::event says what into_handle returns for each.

Squashes:
- feat(threadpool): a wait target may be a SharedHandle, shared with the caller
- fix(threadpool)!: state what a wait built from an Event is, and mark the breaking changes it came with
- docs(threadpool): the milestone moves, the M-T14+ graduation and the archive repairs

BREAKING CHANGE: From<Event> for WaitableHandle takes win-sync-sys' new Event, whose clones share one handle and which no longer converts to OwnedHandle, so it is not the Event type 0.3.0 accepted. A wait built from an Event is a shared target: WaitableHandle::into_handle returns the wrapper unchanged while any clone of the Event remains, where it returned the handle unconditionally.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… and the crate takes the request crate's path contract

The completion ring holds its doorbell as a win_sync_sys::Event and sets and resets
it through that type. Receiver::doorbell_owned, which returned a duplicate, is
replaced by Receiver::doorbell_waitable, a WaitableHandle made from a clone of the
ring's event, so a ThreadpoolWait shares the ring's handle and a client cannot set or
reset it without unsafe. The crate anchors its paths through
windows-namespace-request-sys' AnchoredPath and deletes its own path preparation, and
opens and queries a directory through the request crate's entries. The
case-insensitive name comparison is win-text-sys's compare_string_ordinal, and the
crate forbids unsafe code.

Squashes:
- feat(file-enumeration)!: take the request crate's path contract and delete the older copy
- feat(file-enumeration)!: the doorbell is a shared win-sync-sys Event, and doorbell_owned is doorbell_waitable
- refactor(file-enumeration): the directory's open and queries are the request crate's entries
- refactor(file-enumeration): the case-insensitive name comparison is win-text-sys's compare_string_ordinal
- refactor(file-enumeration): the crate forbids unsafe code
- docs(file-enumeration): park REVIEW-1, move the completed PATH and ERR milestones, and record the checklist complete

BREAKING CHANGE: Receiver::doorbell_owned is removed and Receiver::doorbell_waitable, which returns a WaitableHandle sharing the ring's event, takes its place; the crate takes the request crate's path contract in place of its own path preparation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… job launcher and the queue, and land the ring and tail watcher plans

windows-waitable-queues' doorbell and win-job-launcher's redirected standard handles
make their same-process DuplicateHandle through win-handles-sys' duplicate_handle
instead of their own calls, and windows-ioring-sys and win-multi-file-tail-watcher
move their completed milestones to their archives and park what they leave. None of
these makes a release.

Squashes:
- refactor(waitable-queues): duplicate the doorbell with win-handles-sys
- refactor(win-job-launcher): duplicate the command's standard handles with win-handles-sys
- docs(ioring-sys): move the completed milestones M31, M34, M40 and M41 to COMPLETED-CHECKLIST.md
- docs(tail-watcher): move the completed milestones M2 to M10 to COMPLETED-CHECKLIST.md
- docs: park what the completed checklists of the tail watcher and win-volume-sys have left

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The queue holds its doorbell as a win-shared-os-owned-handle SharedHandle, and
Receiver::doorbell_shared returns one more owner of it: no new kernel handle, closed
when the last holder drops, so a ThreadpoolWait can take it through
assume_waitable_shared without a duplicate per consumer. doorbell and doorbell_owned
are unchanged (D-87). The queue's doorbell duplicate is made by win-handles-sys'
duplicate_handle, and a route's name comparison is win-text-sys's
compare_string_ordinal.

Squashes:
- feat(file-watcher): hand out the receiver's doorbell as a shared handle
- refactor(file-watcher): duplicate the queue doorbell with win-handles-sys
- refactor(file-watcher): a route's name comparison is win-text-sys's compare_string_ordinal
- docs(file-watcher): move the M-inf horizon into PARKED.md
- chore: point SAFE-4 and M17.1 at the archived M43.1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… placement name

Each measurement carries its raw pass and a stable name for its placement, so a
reader can compare runs without re-deriving either.

Squashes:
- feat(placement-probe): carry each measurement's raw pass and a stable placement name

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…mmand line, and the queue probe's smallest run no longer panics

The probes' sampling is settable from the command line, and the queue probe's smallest
run no longer panics for a capacity of one.

Squashes:
- feat(platform-probes): make the probes' sampling settable from the command line
- fix(platform-probes): the queue probe's smallest run no longer panics for a capacity of one

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…y sink takes the begin/end pairs, and the ETW provider writes each pair as one activity

durable-ioring, durable-ioring-events and win-durable-ioring in one commit because they
changed together and none builds without the others: the core's target and submit
traits gained a declared access, its diagnostics became begin/end pairs that the ETW
provider and the driver's sinks consume, and the driver implements both.

durable-ioring: a target states its access and the core refuses what it does not
cover; the typed Key<A> carries it to the ring's submit methods. A seal, a flush part
and a lock wait are each a pair of events joined by a CorrelationId, and PairingChecker
is the one definition of what a correct producer emits. A sink assumes no begin for an
end, and a fan-out hands every pair's end to every sink (DI-D-96). RoutingProvider
dispatches each seal by flush domain. The in-memory backend's targets fault on a
script.

durable-ioring-events (new): the ETW provider and EtwDiagnostics. Each pair is written
as one activity created by EventActivityIdControl and repeated on its end (DE-D-6), and
text ends at its first zero so no later field is misread (DE-D-7).

win-durable-ioring: file access is a typed set of named rights and data access is the
type parameter of every handle the crate opens; a share mode is a typed set and a
sharing violation a typed error; OpenedFile::open takes its path as a Wtf16String and
the disposition is Win32's own. DebugOutputDiagnostics writes each event to the
debugger, and the default sink is EtwDiagnostics.

Squashes:
- feat(durable-ioring)!: a typed Key<A> carries a target's declared access to the ring's submit methods
- feat(durable-ioring)!: report the delay events: lock waits, flush issue and answer, a seal's wait
- feat(durable-ioring)!: move every sink to the begin/end pairs and remove the old delay events
- feat(durable-ioring): add CorrelationId, a process-scoped id that pairs a begin event with its end
- feat(durable-ioring): add the seal, flush and lock-wait pair events and PairingChecker
- feat(durable-ioring): emit the seal and flush pairs from the core, each ended on every path
- feat(durable-ioring): report a lock wait as a pair, its end written with the lock held, and state the sink's leaf-lock rule
- feat(durable-ioring): add RoutingProvider's build, refusing a flush domain claimed twice
- feat(durable-ioring): make RoutingProvider a DurabilityProvider that dispatches each seal by domain
- feat(durable-ioring): the in-memory backend's targets and the backend itself fault on a script
- feat(durable-ioring): export FlushPart, and LINE_PREFIX for the sinks that write a line
- fix(durable-ioring): panic on a flush domain the router does not route, as the only report of it
- fix(durable-ioring): hand every pair's end to every sink in a fan-out
- feat(durable-ioring-events): new crate, the ETW provider and EtwDiagnostics for durable-ioring
- feat(durable-ioring-events): write each pair as one ETW activity the platform creates
- fix(durable-ioring-events): end text at its first zero so no later field is misread
- feat(win-durable-ioring): DebugOutputDiagnostics, a sink that writes each event to the debugger
- feat(win-durable-ioring): the default diagnostic sink is EtwDiagnostics
- refactor(win-durable-ioring): remove HandleKindQuery and HandleKind, which no Windows API can answer
- and the checklists, design notes and tests of the three crates

BREAKING CHANGE: durable-ioring's target and submit traits gain a declared access and carry it in a typed Key<A>, Diagnostic and DiagnosticKind gain the begin/end pair variants, and a sink is given every pair's end; win-durable-ioring asks for file access as a typed set of named rights, takes data access as the type parameter of every handle it opens, takes a share mode as a typed set, takes OpenedFile::open's path as a Wtf16String, uses Win32's own disposition enum, and removes HandleKindQuery and HandleKind.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…e, now that clones share

The deletion that follows its dependents' move, in its own commit so that every commit
builds.

Squashes:
- feat(win-sync)!: delete try_clone and the conversions into OwnedHandle, now that clones share
- docs: renumber win-sync-sys' shared-event item WS-2.2, and tie M21.3 and M21.4 to SAFE-2

BREAKING CHANGE: Event and WaitOnlyEvent are Clone and their clones share one handle; try_clone is removed, try_clone_wait_only is renamed duplicate_wait_only, and the conversions into OwnedHandle are replaced by conversions into SharedHandle, with try_into_owned recovering an OwnedHandle from the last holder.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…rn map for the durable-ioring work

The files at the root of the workspace and its tooling, as they stand at the end of
mikegrier/durable-ioring-squashed: the CI and publish workflows, the archive lint and
its tests, the Learn table-of-contents snapshot and the Win32 Learn map, the workspace
checklists, plans, design notes and rationale, the instructions for working in the
repository, and the design session on router domains and paired events. None of these
belongs to a crate, so none makes a release.

Squashes:
- the workspace's checklist, plans and design-note updates that accompanied each crate's work
- docs: repoint the links the handle-kind removal and the archive move left dead
- docs: renumber win-sync-sys' shared-event item WS-2.2, and tie M21.3 and M21.4 to SAFE-2
- docs: archive M44, one handle duplication for the workspace
- the archive lint, the Learn map and the sabotage tooling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 22, 2026 13:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Cross-crate durability and Windows ownership changes require human approval, and elevated ETW verification remains incomplete.

1 open issue
What changed in this PR

Adds the durable I/O ring and its supporting Win32 layers, including typed target access, paired diagnostics, ETW integration, and shared-handle ownership.

Changes:

  • Connects durability diagnostics to ETW activities and debugger output.
  • Centralizes Win32 handle operations and adopts shared handles across consumers.
  • Extends platform-probe reporting, sabotage coverage, release configuration, and planning records.

One documentation nit remains in crates/durable-ioring/src/engine.rs:267: lock-wait diagnostics end when the mutex is acquired, not when the returned guard is dropped.

File Description
tools/​test-run-sabotage.ps1 Tests case-only sabotage patches.
tools/​sabotage2.json Adds case-comparison sabotage coverage.
release-please-config.json Registers new release components.
DESIGN-RATIONALE.md Explains shared wait-target ownership.
crates/​wtf-string/​PLANS.md Indexes parked work.
crates/​wtf-string/​PARKED.md Preserves deferred C-string work.
crates/​wtf-string/​CHECKLIST.md Moves deferred work out of active planning.
crates/​windows-waitable-queues/​README.md Clarifies measurement order and provenance.
crates/​windows-waitable-queues/​Cargo.toml Adds the common handle-wrapper dependency.
crates/​windows-topology-sys/​COMPLETED-CHECKLIST.md Separates an archive heading.
crates/​windows-threadpool-sys/​PLANS.md Indexes parked diagnostic work.
crates/​windows-threadpool-sys/​PARKED.md Preserves the close-race investigation.
crates/​windows-threadpool-sys/​Cargo.toml Adds shared handles and pipe test helpers.
crates/​windows-platform-probes/​src/​worker_context.rs Exposes raw worker-context reporting.
crates/​windows-platform-probes/​src/​row/​tests.rs Tests numeric and boolean rendering.
crates/​windows-platform-probes/​src/​report.rs Centralizes argument-refusal output.
crates/​windows-platform-probes/​src/​long_path.rs Adds stable names and raw-row exports.
crates/​windows-platform-probes/​src/​long_path_report.rs Emits raw observations after prose.
crates/​windows-platform-probes/​src/​lib.rs Exposes reporting-support modules.
crates/​windows-platform-probes/​src/​device_map.rs Exposes raw device-map reporting.
crates/​windows-platform-probes/​src/​completion_port.rs Exposes raw completion-port reporting.
crates/​windows-platform-probes/​src/​cancel_io.rs Names the attempt count and exports rows.
crates/​windows-platform-probes/​src/​build_identity.rs Reads crate-specific build stamps.
crates/​windows-platform-probes/​src/​bin/​worker_context.rs Emits machine-readable worker observations.
crates/​windows-platform-probes/​src/​bin/​peer_index_cache.rs Emits measured or declined rows.
crates/​windows-platform-probes/​src/​bin/​device_map.rs Emits observations and fixture refusals.
crates/​windows-platform-probes/​src/​bin/​core_affinity.rs Emits affinity data with host readings.
crates/​windows-platform-probes/​src/​bin/​completion_port.rs Emits measured or unavailable results.
crates/​windows-platform-probes/​src/​bin/​cancel_io.rs Emits cancellation outcomes.
crates/​windows-platform-probes/​Cargo.toml Uses safe pipe fixtures.
crates/​windows-platform-probes/​captures/​2026-10-19-interleaved-order/​sequential-drained.txt Records sequential-order measurements.
crates/​windows-platform-probes/​captures/​2026-10-19-interleaved-order/​interleaved-drained.txt Records interleaved-order measurements.
crates/​windows-platform-probes/​captures/​2026-09-16-drained-handshake/​README.md Documents historical sampling order.
crates/​windows-platform-probes/​build.rs Reuses build-identity stamping.
crates/​windows-placement-probe/​src/​peer_index_cache.rs Exposes repetition counts and strategy labels.
crates/​windows-placement-probe/​src/​core_affinity/​tests.rs Updates fixtures and tests stable names.
crates/​windows-placement-probe/​src/​build_identity.rs Shares build-stamp interpretation.
crates/​windows-overlapped-io-sys/​PLANS.md Updates plan status.
crates/​windows-overlapped-io-sys/​COMPLETED-CHECKLIST.md Separates an archive heading.
crates/​windows-overlapped-io-sys/​Cargo.toml Adds safe pipe test helpers.
crates/​windows-namespace-request-sys/​DESIGN-NOTES.md Records withdrawn consumer work.
crates/​windows-namespace-request-sys/​COMPLETED-CHECKLIST.md Repoints an archived-work link.
crates/​windows-ioring-sys/​Cargo.toml Uses safe pipe test fixtures.
crates/​windows-impersonation-token-sys/​src/​tests.rs Tests shared clones and independent captures.
crates/​windows-impersonation-token-sys/​src/​lib.rs Adopts SharedHandle for captured tokens.
crates/​windows-impersonation-token-sys/​PLANS.md Removes completed adoption work.
crates/​windows-impersonation-token-sys/​COMPLETED-PLANS.md Records shared-handle adoption.
crates/​windows-impersonation-token-sys/​COMPLETED-CHECKLIST.md Archives adoption rationale and verification.
crates/​windows-impersonation-token-sys/​CHECKLIST.md Removes the completed work item.
crates/​windows-impersonation-token-sys/​Cargo.toml Adds the shared-handle dependency.
crates/​windows-file-watcher/​PLANS.md Indexes parked work.
crates/​windows-file-watcher/​PARKED.md Preserves deferred watcher capabilities.
crates/​windows-file-enumeration-sys/​src/​session.rs Returns a shared doorbell wait target.
crates/​windows-file-enumeration-sys/​src/​record.rs Updates buffer-alignment documentation.
crates/​windows-file-enumeration-sys/​src/​model.rs Polls borrowed doorbells through win-sync-sys.
crates/​windows-file-enumeration-sys/​src/​error/​tests.rs Aligns tests with path-capture failures.
crates/​windows-file-enumeration-sys/​src/​admission.rs Allocates staging through AlignedBuf.
crates/​windows-file-enumeration-sys/​README.md Documents request-layer integration.
crates/​windows-file-enumeration-sys/​PLANS.md Indexes the parked contract review.
crates/​windows-file-enumeration-sys/​COMPLETED-PLANS.md Records path and error-type consolidation.
crates/​win-volume-sys/​PLANS.md Indexes completed and parked work.
crates/​win-volume-sys/​PARKED.md Preserves future volume capabilities.
crates/​win-volume-sys/​COMPLETED-PLANS.md Records completed volume-wrapper work.
crates/​win-text-sys/​src/​lib.rs Exposes Windows ordinal text comparison.
crates/​win-text-sys/​PLANS.md Links wrapper implementation planning.
crates/​win-sync-sys/​src/​wait/​tests.rs Adapts tests to shared event clones.
crates/​win-sync-sys/​src/​wait_many/​tests.rs Updates cloning and ownership recovery.
crates/​win-sync-sys/​src/​signal/​tests.rs Adapts signal tests to shared ownership.
crates/​win-sync-sys/​src/​signal.rs Updates the wait-only duplication example.
crates/​win-sync-sys/​src/​lib.rs Re-exports common handle APIs.
crates/​win-sync-sys/​CHECKLIST.md Clarifies release sequencing and adoption status.
crates/​win-sync-sys/​Cargo.toml Adds handle and shared-owner dependencies.
crates/​win-shared-os-owned-handle/​PLANS.md Removes completed adoption work.
crates/​win-shared-os-owned-handle/​COMPLETED-PLANS.md Records shared-owner adoption.
crates/​win-numa-sys/​PLANS.md Updates plan status.
crates/​win-multi-file-tail-watcher/​PLANS.md Indexes parked follow-ups.
crates/​win-multi-file-tail-watcher/​PARKED.md Preserves diagnostic and buffer-policy questions.
crates/​win-multi-file-tail-watcher/​COMPLETED-PLANS.md Records completed watcher work.
crates/​win-job-launcher/​Cargo.toml Adds the common handle-wrapper dependency.
crates/​win-handles-sys/​src/​lib.rs Exposes close, comparison, flags, and duplication APIs.
crates/​win-handles-sys/​PLANS.md Removes completed handle-wrapper planning.
crates/​win-handles-sys/​COMPLETED-PLANS.md Records completed handle APIs.
crates/​win-handles-sys/​CHECKLIST.md Links completed handle operations.
crates/​win-handles-sys/​Cargo.toml Describes the expanded handle API.
crates/​win-etw-sys/​src/​lib.rs Exposes ETW provider, activity, and test-session APIs.
crates/​win-etw-sys/​src/​activity/​tests.rs Tests activity-ID creation and uniqueness.
crates/​win-etw-sys/​src/​activity.rs Wraps explicit ETW activity-ID creation.
crates/​win-etw-sys/​PLANS.md Links ETW implementation planning.
crates/​win-error-codes/​CHECKLIST.md Updates a cross-component work-order link.
crates/​win-durable-ioring/​src/​windows_backend/​wait/​tests.rs Explicitly duplicates event test handles.
crates/​win-durable-ioring/​src/​windows_backend/​disposition/​tests.rs Tests typed creation-disposition mappings.
crates/​win-durable-ioring/​src/​lib.rs Exposes diagnostics and path types.
crates/​win-durable-ioring/​src/​dioring/​tests/​stamps.rs Removes the relocated flush-stamp test.
crates/​win-durable-ioring/​src/​dioring/​tests/​seals.rs Declares access for deliberate write failure.
crates/​win-durable-ioring/​src/​dioring/​delivery.rs Clarifies shared event-clone terminology.
crates/​win-durable-ioring/​examples/​blocking_push/​main.rs Adopts typed file options and target setup.
crates/​win-debugging-sys/​src/​lib.rs Exposes debugger-output and capture APIs.
crates/​win-debugging-sys/​PLANS.md Links debugging-wrapper planning.
crates/​io-buffers/​COMPLETED-CHECKLIST.md Marks archived work complete.
crates/​durable-ioring/​src/​provider.rs Links the routing-provider API.
crates/​durable-ioring/​src/​oracle.rs Exposes the diagnostic pairing checker.
crates/​durable-ioring/​src/​io_target/​tests.rs Tests declared target access.
crates/​durable-ioring/​src/​io_core/​tests.rs Wires diagnostic and scripted-backend tests.
crates/​durable-ioring/​src/​io_core/​provider.rs Supplies provider-domain diagnostic names.
crates/​durable-ioring/​src/​engine.rs Integrates watched engine guards; has the timing-documentation nit noted above.
crates/​durable-ioring/​src/​durability/​tests/​providers.rs Supplies domain names in provider fixtures.
crates/​durable-ioring/​src/​durability/​tests.rs Supports diagnostic sinks and named domains.
crates/​durable-ioring/​src/​durability/​lineages.rs Ends diagnostic pairs on lineage termination.
crates/​durable-ioring/​src/​driver.rs Exposes lock-watch integration APIs.
crates/​durable-ioring/​src/​backend/​tests.rs Tests access-denied refusal mapping.
crates/​durable-ioring/​src/​backend.rs Adds access-denied refusal semantics.
crates/​durable-ioring/​PLANS.md Indexes parked work.
crates/​durable-ioring/​CONTRACT.md Specifies target access and shared readiness ownership.
crates/​durable-ioring/​COMPONENT.md Clarifies sample-log layering.
crates/​durable-ioring-events/​tests/​registration.rs Tests provider-registration lifetime across sink clones.
crates/​durable-ioring-events/​src/​lib.rs Exposes ETW diagnostics, schemas, and manifest.
crates/​durable-ioring-events/​PLANS.md Links event-provider implementation planning.
Cargo.toml Adds new workspace members.
.release-please-manifest.json Seeds new crate release versions.

Review effort: Balanced

Comment thread crates/durable-ioring/src/engine.rs Outdated
Mike Grier and others added 2 commits October 22, 2026 12:29
…, now that the launcher builds on it

win-job-launcher supervises every phase of every sweep, and its handle duplication is
now win-handles-sys' duplicate_handle, so a change to win-handles-sys is a change to the
supervisor and reaches every manifest. The harness test that checks the launcher's
workspace dependencies against cargo caught the new dependency as intended. The list of
shared inputs, its recognition test (both directions, with a sibling that shares the
prefix) and the root design note's statement of the list say so.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed, not when its guard is dropped

present_watched's documentation still said a watched lock's wait is reported when the
guard is dropped, which was the removed duration design. LockWatch::lock reports the end
of a contended wait with the lock just taken, before it returns the guard, so the pair
does not include the time the lock is held. Found by the Copilot review of the pull
request; no other statement of the old timing remains in the crates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 22, 2026 16:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Broad breaking changes to durability, diagnostics, and handle ownership require human approval; elevated ETW validation remains incomplete.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

@MikeGrier
MikeGrier enabled auto-merge October 22, 2026 16:37
@MikeGrier
MikeGrier merged commit 28c666f into main Oct 22, 2026
44 checks passed
@MikeGrier
MikeGrier deleted the mikegrier/durable-ioring-release branch October 22, 2026 16:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants