mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 00:54:40 +00:00
[BATTC] Signal the wait battery tag event when notifying Battery Class
BatteryClassStatusNotify is used by battery miniport drivers to notify the Battery Class of a status change. This can either be a battery status change or battery tag assignation, depending on what the device extension (namely the composite battery) waits for. We do have implementation for EVENT_BATTERY_STATUS but not for EVENT_BATTERY_TAG. What happens is when BatteryClassIoctl fails to query the battery tag because it has not yet been assigned, the thread is stuck on waiting for the event object to be signaled, forever. This tipically happens when a timeout of -1 (meaning the calling thread must wait indefinitely) is supplied. The composite battery driver (COMPBATT) is responsible to signal the Battery Class when a CM (Control Method) ACPI battery receives a tag, which then this function will signal the event. CORE-18969 CORE-19452
This commit is contained in:
parent
c10c5224ff
commit
b0680d65fe
1 changed files with 11 additions and 2 deletions
|
@ -76,11 +76,13 @@ BatteryClassQueryWmiDataBlock(PVOID ClassData,
|
||||||
BCLASSAPI
|
BCLASSAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
BatteryClassStatusNotify(PVOID ClassData)
|
BatteryClassStatusNotify(
|
||||||
|
_In_ PVOID ClassData)
|
||||||
{
|
{
|
||||||
PBATTERY_CLASS_DATA BattClass;
|
PBATTERY_CLASS_DATA BattClass;
|
||||||
PBATTERY_WAIT_STATUS BattWait;
|
PBATTERY_WAIT_STATUS BattWait;
|
||||||
BATTERY_STATUS BattStatus;
|
BATTERY_STATUS BattStatus;
|
||||||
|
ULONG Tag;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("Received battery status notification from %p\n", ClassData);
|
DPRINT("Received battery status notification from %p\n", ClassData);
|
||||||
|
@ -99,7 +101,14 @@ BatteryClassStatusNotify(PVOID ClassData)
|
||||||
{
|
{
|
||||||
case EVENT_BATTERY_TAG:
|
case EVENT_BATTERY_TAG:
|
||||||
ExReleaseFastMutex(&BattClass->Mutex);
|
ExReleaseFastMutex(&BattClass->Mutex);
|
||||||
DPRINT1("Waiting for battery is UNIMPLEMENTED!\n");
|
Status = BattClass->MiniportInfo.QueryTag(BattClass->MiniportInfo.Context,
|
||||||
|
&Tag);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ExAcquireFastMutex(&BattClass->Mutex);
|
||||||
|
KeSetEvent(&BattClass->WaitEvent, IO_NO_INCREMENT, FALSE);
|
||||||
|
ExReleaseFastMutex(&BattClass->Mutex);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_BATTERY_STATUS:
|
case EVENT_BATTERY_STATUS:
|
||||||
|
|
Loading…
Reference in a new issue