Index: sys/dev/sysmon/sysmon_power.c =================================================================== RCS file: /cvsroot/src/sys/dev/sysmon/sysmon_power.c,v retrieving revision 1.38 diff -u -p -r1.38 sysmon_power.c --- sys/dev/sysmon/sysmon_power.c 10 May 2008 14:01:32 -0000 1.38 +++ sys/dev/sysmon/sysmon_power.c 19 May 2008 21:04:03 -0000 @@ -184,6 +184,21 @@ static void sysmon_power_destroy_diction #define SYSMON_NEXT_EVENT(x) (((x) + 1) % SYSMON_MAX_POWER_EVENTS) /* + * sysmon_power_event_queue_flush: + * + * Flush the event queue, and reset all state. + */ +static void +sysmon_power_event_queue_flush(void) +{ + KASSERT(mutex_owned(&sysmon_power_event_queue_mtx)); + + sysmon_power_event_queue_head = 0; + sysmon_power_event_queue_tail = 0; + sysmon_power_event_queue_count = 0; +} + +/* * sysmon_power_init: * * Initializes the mutexes and condition variables in the @@ -195,6 +210,7 @@ sysmon_power_init(void) mutex_init(&sysmon_power_event_queue_mtx, MUTEX_DEFAULT, IPL_NONE); cv_init(&sysmon_power_event_queue_cv, "smpower"); selinit(&sysmon_power_event_queue_selinfo); + sysmon_power_event_queue_flush(); } /* @@ -242,21 +258,6 @@ sysmon_get_power_event(power_event_t *pe } /* - * sysmon_power_event_queue_flush: - * - * Flush the event queue, and reset all state. - */ -static void -sysmon_power_event_queue_flush(void) -{ - KASSERT(mutex_owned(&sysmon_power_event_queue_mtx)); - - sysmon_power_event_queue_head = 0; - sysmon_power_event_queue_tail = 0; - sysmon_power_event_queue_count = 0; -} - -/* * sysmon_power_daemon_task: * * Assign required power event members and sends a signal @@ -384,10 +385,8 @@ sysmonopen_power(dev_t dev, int flag, in mutex_enter(&sysmon_power_event_queue_mtx); if (sysmon_power_daemon != NULL) error = EBUSY; - else { + else sysmon_power_daemon = l; - sysmon_power_event_queue_flush(); - } mutex_exit(&sysmon_power_event_queue_mtx); return error; @@ -977,8 +976,13 @@ sysmon_pswitch_event(struct sysmon_pswit case PSWITCH_TYPE_HOTKEY: /* - * Eat up the event, there's nothing we can do + * Queue the event until powerd is running (again) */ + ped = kmem_zalloc(sizeof(*ped), KM_NOSLEEP); + if (!ped) + return; + ped->dict = prop_dictionary_create(); + sysmon_power_daemon_task(ped, smpsw, event); break; case PSWITCH_TYPE_LID: