Holger Macht wrote:
> Hi,
>
> we have still problems with dbus reconnecting if dbus shuts
> down. Powersave daemon reconnects, but not until the first or second acpi
> event has happened as long as CPUFREQ_USERSPACE is used.
>
> So the trick would be to poll the filedescriptor in a specific intervall
> as long as dbus is away and switch back to blocking mode as soon as dbus
> back. I appended a patch which does exactly this. I tested with different
> example usages:
>
> with(out) battery, CPUFREQ_KERNEL/ CPUFREQ_USERSPACE and mixtures
> of these modes.
>
> Please comment and test if it works!
>
> Greetings,
> Holger
>
>
>
>
>
> ------------------------------------------------------------------------
>
> Index: daemon/powersaved.cpp
> ===================================================================
> RCS file: /cvsroot/powersave/powersave/daemon/powersaved.cpp,v
> retrieving revision 1.139
> diff -u -r1.139 powersaved.cpp
> --- daemon/powersaved.cpp 30 Aug 2005 15:31:34 -0000 1.139
> +++ daemon/powersaved.cpp 31 Aug 2005 12:37:11 -0000
> @@ -345,13 +345,30 @@
> gettimeofday(&tv_start, &dummy);
> for (;;){
> do{
> + // we must try to reconnect to dbus in a specific
> + // timeout if dbus died. If select blocks because
> + // of CPUFREQ_KERNEL, we wouldn't reconnect until
> + // the first or second acpi event happens. This is
> + // also only a workaround which should be fixed
> + // properly.
> + if ( DBus_Server::DBusDied ) {
> + req.tv_sec = 3;
> + req.tv_usec = 0;
> + }
> + else {
> + req.tv_sec = req_init.tv_sec;
> + req.tv_usec = req_init.tv_usec;
> + }
> +
wrong, you have to do it at the end of the select loop, not at the
beginning. Otherwise, if you get events constantly, you'll never fall
through to the timeout.
> - // if no cpufreq and no battery is supported do not
> poll at all!
> + // if no cpufreq and no battery is supported and
> + // dbus did not die do not poll at all!
> if ((cur_state.BAT_STATE == BAT_NONE_STATE &&
> !CPUFreq_Interface::isSupported() && !acpidDied) ||
> (!config->current_scheme->FORCE_BATTERY_POLLING &&
> - (config->CPUFREQ_CONTROL == CPUFREQ_KERNEL))) {
> + (config->CPUFREQ_CONTROL == CPUFREQ_KERNEL)) &&
> + (!DBus_Server::DBusDied) ) {
> pDebug(DBG_DEBUG, "Select waiting without
> timeout, polling disabled.");
> ret = select (max_FD_value+1, &temp_fd_set,
> NULL, NULL, NULL);
> pDebug(DBG_INFO, "Select came out");
This looks fine.
--
Stefan Seyfried \ "I didn't want to write for pay. I
QA / R&D Team Mobile Devices \ wanted to be paid for what I write."
SUSE LINUX Products GmbH, Nürnberg \ -- Leonard Cohen
_______________________________________________
powersave-devel mailing list
[email protected]
http://forge.novell.com/mailman/listinfo/powersave-devel