- •1Introduction
- •2Multiprocessor Support in Windows
- •3Simultaneous Thread Execution
- •4Reentrant and Concurrent Routines
- •4.1Reentrancy
- •4.2Concurrency
- •4.2.1Concurrency with Respect to Driver Object
- •4.2.2Concurrency with Respect to Device Object
- •4.2.3Concurrency with Respect to File Object
- •5Synchronizing Access and Enforcing Program Order
- •5.1The volatile Keyword
- •5.2Windows Synchronization Mechanisms
- •6Memory Barriers and Hardware Reordering
- •6.1Memory Barrier Semantics
- •6.2Windows Kernel-Mode Memory Barrier Routines
- •6.3Hardware Reordering on x86, x64, and Itanium Architectures
- •6.3.1Additional Hardware Reordering on the Intel Itanium Architecture
- •7Performance and Scalability
- •7.1Locking Issues
- •7.1.1Frequently Used Locks
- •7.1.2Deadlocks
- •7.1.3Live Locks
- •7.2Caching Issues
- •8Testing
- •8.1Driver Verifier
- •8.2Call Usage Verifier
- •8.3Kernrate and KrView
- •8.4DevCon
- •9About numa Architectures
- •10Best Practices for Drivers
- •11Resources
4.2.1Concurrency with Respect to Driver Object
Table 2 lists the concurrency of standard driver routines with respect to the driver object.
Table 2. Concurrency of Driver Functions per Driver Object
Routine to be called |
AddDevice |
Cancel |
DispatchPnp1 |
DispatchPower |
DispatchXxx2 |
DPC |
ISR |
StartIo |
Unload |
Worker Thread Routine |
||
Routine currently running |
System3 |
Device4 |
||||||||||
AddDevice |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Maybe |
|
Cancel (if set)5 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Yes |
|
DispatchPnP |
Start device6 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
YesError: Reference source not found |
No |
Maybe |
Other7 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Maybe |
|
DispatchPower |
SystemError: Reference source not found |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Maybe |
DeviceError: Reference source not found |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Maybe |
|
DispatchXxxError: Reference source not found |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Maybe |
|
DPC |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Maybe |
Maybe |
Maybe |
|
ISR |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Maybe |
Maybe |
Maybe |
|
StartIo |
Yes |
Yes |
Yes8 |
Yes |
Yes |
Yes |
Maybe |
Maybe |
Maybe |
No |
Maybe |
|
Unload |
No |
No |
No |
No |
No |
No |
Maybe |
Maybe |
No |
No |
Maybe |
|
Worker Thread Routine |
Maybe |
Yes |
Maybe |
Maybe |
Maybe |
Maybe |
Maybe |
Maybe |
Maybe |
Maybe |
Maybe |
Most driver routines are concurrent with respect to the driver object because most driver tasks are performed on behalf of a file or device object, rather than the driver itself. Driver routines that perform driver-wide activities, such as adding a device, are typically not concurrent. For example, in Table 2, a driver’s Unload routine for a given driver object cannot be called while the driver’s AddDevice routine is running.