ReactOS 0.4.17-dev-1281-g065abb3
idlesm.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Idle notification state machine of a hub child device
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
11
12class HubPdo;
13
14enum class IdleEvent : UCHAR
15{
16 /* Child device created, the machine reads the selective suspend policy */
17 Start,
18
19 /* Idle notification IOCTL from the client driver, carries the IRP */
21
22 /* Cancel routine of the held IRP ran */
24
25 /* Work item queued for the held IRP ran at passive level */
27
28 /* Client idle callback returned */
30
31 /* Child device power changes and removal */
34 Cleanup,
35
36 Count
37};
38
43class IdleMachine : public SmMachine<IdleMachine, IdleEvent>
44{
45 friend class SmMachine<IdleMachine, IdleEvent>;
46
47public:
48 VOID
50 _In_ HubPdo* Pdo);
51
53 Post(
56
57 HubPdo*
58 Pdo() const
59 {
60 return m_Pdo;
61 }
62
63 /* The held idle IRP, NULL when there is none */
64 PIRP
65 HeldIrp() const
66 {
67 return m_HeldIrp;
68 }
69
70 static const SM_EVENT_INFO EventInfo[];
71
72private:
74 {
80 };
81
83 {
87 };
88
89 /* States */
90 static const State Starting;
91 static const State Present;
92 static const State NoRequest;
93 static const State Ready;
95 static const State Parked;
96 static const State Holding;
97 static const State Pending;
98 static const State AwaitingWorkItem;
99 static const State CallbackDone;
100 static const State CallbackRunning;
101 static const State AwaitingCancel;
102 static const State Removed;
103 static const State Gone;
104 static const State CallbackRemoved;
106
107 /* Handlers */
112 OnPresent(
118 OnReady(
124 OnParked(
127 OnHolding(
130 OnPending(
142 OnRemoved(
150
151 /* Helpers */
152 VOID
155
156 VOID
157 RejectNew(
159
160 VOID
161 HoldNew();
162
164 Release(
166
169
171 EndCallback();
172
173 /* Actions and queries, implemented by the child device object */
175 VOID
177 _In_ PIRP Irp);
178 BOOLEAN
179 ArmCancel(
180 _In_ PIRP Irp);
181 BOOLEAN
183 _In_ PIRP Irp);
185 VOID
187 _In_ PIRP Irp);
188 VOID
190 _In_ PIRP Irp,
192
203};
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
_In_ BOOLEAN Release
Definition: cdrom.h:920
Posts run to completion under m_PostLock; IRP completion and callbacks run after it is dropped.
Definition: idlesm.h:44
static const State AwaitingCancelRemoved
Definition: idlesm.h:105
static const SM_EVENT_INFO EventInfo[]
Definition: idlesm.h:70
SM_RESULT EndCallback()
Definition: idlesm.cpp:220
NTSTATUS m_FollowUpStatus
Definition: idlesm.h:197
SM_RESULT OnCallbackRunning(_In_ IdleEvent Event)
Definition: idlesm.cpp:395
VOID HoldNew()
Definition: idlesm.cpp:188
BOOLEAN m_CancelSeen
Definition: idlesm.h:202
PIRP m_HeldIrp
Definition: idlesm.h:195
BOOLEAN m_SuspendSupported
Definition: idlesm.h:201
IDLE_POWER_CHANGE m_PowerChange
Definition: idlesm.h:199
static const State CallbackRemoved
Definition: idlesm.h:104
BOOLEAN DisarmCancel(_In_ PIRP Irp)
Definition: suspend.cpp:126
SM_RESULT OnSuspendUnsupported(_In_ IdleEvent Event)
Definition: idlesm.cpp:303
static const State AwaitingCancel
Definition: idlesm.h:101
static const State Holding
Definition: idlesm.h:96
SM_RESULT OnAwaitingCancelRemoved(_In_ IdleEvent Event)
Definition: idlesm.cpp:474
NTSTATUS Post(_In_ IdleEvent Event, _In_opt_ PIRP Irp)
Irp is the new idle IRP for RequestSubmitted, else NULL.
Definition: idlesm.cpp:112
static const State Pending
Definition: idlesm.h:97
static const State Gone
Definition: idlesm.h:103
BOOLEAN m_ReturnPending
Definition: idlesm.h:200
SM_RESULT OnAwaitingWorkItem(_In_ IdleEvent Event)
Definition: idlesm.cpp:382
SM_RESULT OnStarting(_In_ IdleEvent Event)
Definition: idlesm.cpp:244
SM_RESULT OnRemoved(_In_ IdleEvent Event)
Definition: idlesm.cpp:444
HubPdo * Pdo() const
Definition: idlesm.h:58
VOID QueueIdleWorkItem()
Definition: suspend.cpp:134
SM_RESULT OnCallbackRemoved(_In_ IdleEvent Event)
Definition: idlesm.cpp:464
IDLE_FOLLOW_UP
Definition: idlesm.h:74
@ FollowUpCompleteHeld
Definition: idlesm.h:76
@ FollowUpNone
Definition: idlesm.h:75
@ FollowUpCallback
Definition: idlesm.h:78
@ FollowUpRejectNew
Definition: idlesm.h:77
@ FollowUpWorkItem
Definition: idlesm.h:79
BOOLEAN SelectiveSuspendSupported()
Definition: suspend.cpp:88
PIRP HeldIrp() const
Definition: idlesm.h:65
static const State Parked
Definition: idlesm.h:95
static const State CallbackDone
Definition: idlesm.h:99
SM_RESULT OnPresent(_In_ IdleEvent Event)
Definition: idlesm.cpp:255
SM_RESULT ReleaseForRemoval()
Definition: idlesm.cpp:209
PIRP m_NewIrp
Definition: idlesm.h:196
VOID FinishHeld(_In_ NTSTATUS Status)
Definition: idlesm.cpp:171
IDLE_FOLLOW_UP m_FollowUp
Definition: idlesm.h:198
SM_RESULT OnPending(_In_ IdleEvent Event)
Definition: idlesm.cpp:358
VOID CompleteIdleRequest(_In_ PIRP Irp, _In_ NTSTATUS Status)
Definition: suspend.cpp:152
static const State CallbackRunning
Definition: idlesm.h:100
VOID MarkRequestPending(_In_ PIRP Irp)
Definition: suspend.cpp:100
VOID RejectNew(_In_ NTSTATUS Status)
Definition: idlesm.cpp:180
BOOLEAN ArmCancel(_In_ PIRP Irp)
Definition: suspend.cpp:108
SM_RESULT OnParked(_In_ IdleEvent Event)
Definition: idlesm.cpp:318
SM_RESULT OnAwaitingCancel(_In_ IdleEvent Event)
Definition: idlesm.cpp:426
SM_RESULT OnReady(_In_ IdleEvent Event)
Definition: idlesm.cpp:275
static const State Present
Definition: idlesm.h:91
static const State SuspendUnsupported
Definition: idlesm.h:94
static const State Removed
Definition: idlesm.h:102
IDLE_POWER_CHANGE
Definition: idlesm.h:83
@ PowerUp
Definition: idlesm.h:85
@ PowerUnchanged
Definition: idlesm.h:84
@ PowerDown
Definition: idlesm.h:86
SM_RESULT OnNoRequest(_In_ IdleEvent Event)
Definition: idlesm.cpp:265
static const State Ready
Definition: idlesm.h:93
VOID InvokeIdleCallback(_In_ PIRP Irp)
Definition: suspend.cpp:140
HubPdo * m_Pdo
Definition: idlesm.h:194
KSPIN_LOCK m_PostLock
Definition: idlesm.h:193
static const State Starting
Definition: idlesm.h:90
SM_RESULT OnHolding(_In_ IdleEvent Event)
Definition: idlesm.cpp:340
static const State NoRequest
Definition: idlesm.h:92
static const State AwaitingWorkItem
Definition: idlesm.h:98
Run to completion engine. The first thread to post into an idle machine drains the queue; everyone el...
Definition: smengine.h:114
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
Status
Definition: gdiplustypes.h:24
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
Definition: hubucx.h:280
IdleEvent
Definition: idlesm.h:15
@ RequestSubmitted
@ ClientCallbackFinished
_In_ PIRP Irp
Definition: kse.h:79
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
One state. Handler gets every event the state sees.
Definition: smengine.h:93
unsigned char UCHAR
Definition: typedefs.h:53
static void Initialize()
Definition: xlate.c:212