ReactOS 0.4.15-dev-7994-gb388cb6
iotimer.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/io/iomgr/iotimer.c
5 * PURPOSE: I/O Wrappers for Executive Timers
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES *****************************************************************/
10
11#include <ntoskrnl.h>
12#define NDEBUG
13#include <debug.h>
14
15/* GLOBALS *******************************************************************/
16
17/* Timer Database */
20
21/* Timer Firing */
24
25/* Keep count of how many timers we have */
27
28/* PRIVATE FUNCTIONS *********************************************************/
29
30VOID
36{
38 PLIST_ENTRY TimerEntry;
40 ULONG i;
41
42 /* Check if any Timers are actually enabled as of now */
43 if (IopTimerCount)
44 {
45 /* Lock the Timers */
47
48 /* Call the Timer Routine of each enabled Timer */
49 for (TimerEntry = IopTimerQueueHead.Flink, i = IopTimerCount;
50 (TimerEntry != &IopTimerQueueHead) && i;
51 TimerEntry = TimerEntry->Flink)
52 {
53 /* Get the timer and check if it's enabled */
54 Timer = CONTAINING_RECORD(TimerEntry, IO_TIMER, IoTimerList);
55 if (Timer->TimerEnabled)
56 {
57 /* Call the timer routine */
58 Timer->TimerRoutine(Timer->DeviceObject, Timer->Context);
59 i--;
60 }
61 }
62
63 /* Unlock the Timers */
65 }
66}
67
68VOID
71{
73
74 /* Lock Timers */
76
77 /* Remove Timer from the List and Drop the Timer Count if Enabled */
78 RemoveEntryList(&Timer->IoTimerList);
79 if (Timer->TimerEnabled) IopTimerCount--;
80
81 /* Unlock the Timers */
83}
84
85/* PUBLIC FUNCTIONS **********************************************************/
86
87/*
88 * @implemented
89 */
95{
96 PIO_TIMER IoTimer = DeviceObject->Timer;
97 PAGED_CODE();
98
99 /* Check if we don't have a timer yet */
100 if (!IoTimer)
101 {
102 /* Allocate Timer */
104 sizeof(IO_TIMER),
106 if (!IoTimer) return STATUS_INSUFFICIENT_RESOURCES;
107
108 /* Set up the Timer Structure */
109 RtlZeroMemory(IoTimer, sizeof(IO_TIMER));
110 IoTimer->Type = IO_TYPE_TIMER;
111 IoTimer->DeviceObject = DeviceObject;
112 DeviceObject->Timer = IoTimer;
113 }
114
115 /* Setup the timer routine and context */
116 IoTimer->TimerRoutine = TimerRoutine;
117 IoTimer->Context = Context;
118
119 /* Add it to the Timer List */
121 &IoTimer->IoTimerList,
122 &IopTimerLock);
123
124 /* Return Success */
125 return STATUS_SUCCESS;
126}
127
128/*
129 * @implemented
130 */
131VOID
132NTAPI
134{
136 PIO_TIMER IoTimer = DeviceObject->Timer;
137
138 /* Make sure the device isn't unloading */
139 if (!(((PEXTENDED_DEVOBJ_EXTENSION)(DeviceObject->DeviceObjectExtension))->
140 ExtensionFlags & (DOE_UNLOAD_PENDING |
144 {
145 /* Lock Timers */
147
148 /* Check if the timer isn't already enabled */
149 if (!IoTimer->TimerEnabled)
150 {
151 /* Enable it and increase the timer count */
152 IoTimer->TimerEnabled = TRUE;
154 }
155
156 /* Unlock Timers */
158 }
159}
160
161/*
162 * @implemented
163 */
164VOID
165NTAPI
167{
169 PIO_TIMER IoTimer = DeviceObject->Timer;
170
171 /* Lock Timers */
173
174 /* Check if the timer is enabled */
175 if (IoTimer->TimerEnabled)
176 {
177 /* Disable it and decrease the timer count */
178 IoTimer->TimerEnabled = FALSE;
180 }
181
182 /* Unlock Timers */
184}
185
186/* EOF */
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define NonPagedPool
Definition: env_spec_w32.h:307
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
KDPC IopTimerDpc
Definition: iotimer.c:22
VOID NTAPI IopRemoveTimerFromTimerList(IN PIO_TIMER Timer)
Definition: iotimer.c:70
NTSTATUS NTAPI IoInitializeTimer(IN PDEVICE_OBJECT DeviceObject, IN PIO_TIMER_ROUTINE TimerRoutine, IN PVOID Context)
Definition: iotimer.c:92
KSPIN_LOCK IopTimerLock
Definition: iotimer.c:18
KTIMER IopTimer
Definition: iotimer.c:23
VOID NTAPI IoStartTimer(IN PDEVICE_OBJECT DeviceObject)
Definition: iotimer.c:133
VOID NTAPI IoStopTimer(PDEVICE_OBJECT DeviceObject)
Definition: iotimer.c:166
VOID NTAPI IopTimerDispatch(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: iotimer.c:32
ULONG IopTimerCount
Definition: iotimer.c:26
LIST_ENTRY IopTimerQueueHead
Definition: iotimer.c:19
#define DOE_DELETE_PENDING
Definition: iotypes.h:150
#define DOE_REMOVE_PROCESSED
Definition: iotypes.h:152
#define DOE_UNLOAD_PENDING
Definition: iotypes.h:149
#define DOE_REMOVE_PENDING
Definition: iotypes.h:151
#define STATUS_SUCCESS
Definition: shellext.h:65
LIST_ENTRY IoTimerList
Definition: iotypes.h:854
USHORT Type
Definition: iotypes.h:852
PDEVICE_OBJECT DeviceObject
Definition: iotypes.h:857
PVOID Context
Definition: iotypes.h:856
PIO_TIMER_ROUTINE TimerRoutine
Definition: iotypes.h:855
USHORT TimerEnabled
Definition: iotypes.h:853
Definition: ketypes.h:699
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define TAG_IO_TIMER
Definition: tag.h:94
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_In_ PIO_TIMER_ROUTINE TimerRoutine
Definition: iofuncs.h:1078
#define IO_TYPE_TIMER
IO_TIMER_ROUTINE * PIO_TIMER_ROUTINE
Definition: iotypes.h:2863
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:688
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:687
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:689