Navigation Menu

Skip to content

Commit

Permalink
[battery-udev] Handle initial probe from idle callback
Browse files Browse the repository at this point in the history
In some devices initial power supply device probing can block mce for
several seconds. As this happens during mce startup, it also delays
readiness of mce systemd service. Which in turn can cause unnecessary
waiting during bootup.

Handle time-consuming udev property scanning from idle callback so
that it happens after systemd has been notified that mce is ready.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed Jun 23, 2020
1 parent 2661aba commit f4dbf7e
Showing 1 changed file with 25 additions and 6 deletions.
31 changes: 25 additions & 6 deletions modules/battery-udev.c
Expand Up @@ -1927,6 +1927,23 @@ udevtracker_event_cb(GIOChannel *chn, GIOCondition cnd, gpointer aptr)
* G_MODULE
* ========================================================================= */

static guint mcebat_init_tracker_id = 0;

static gboolean
mcebat_init_tracker_cb(gpointer aptr)
{
(void)aptr;

udevtracker_object = udevtracker_create();

if( !udevtracker_start(udevtracker_object) )
goto EXIT;

EXIT:
mcebat_init_tracker_id = 0;
return G_SOURCE_REMOVE;
}

/** Init function for the battery and charger module
*
* @param module (not used)
Expand All @@ -1940,16 +1957,15 @@ G_MODULE_EXPORT const gchar *g_module_check_init(GModule *module)
udevdevice_init_blacklist();
udevproperty_init_types();

udevtracker_object = udevtracker_create();

if( !udevtracker_start(udevtracker_object) )
goto EXIT;

mcebat_dbus_init();

/* Initial udev probing can take a long time.
* Do it from idle callback in order not to delay
* reaching systemd unit ready state.
*/
mcebat_init_tracker_id = g_idle_add(mcebat_init_tracker_cb, 0);
mce_log(LL_DEBUG, "%s: loaded", MODULE_NAME);

EXIT:
return NULL;
}

Expand All @@ -1961,6 +1977,9 @@ G_MODULE_EXPORT void g_module_unload(GModule *module)
{
(void)module;

if( mcebat_init_tracker_id )
g_source_remove(mcebat_init_tracker_id), mcebat_init_tracker_id = 0;

mcebat_dbus_quit();

udevtracker_delete(udevtracker_object), udevtracker_object = 0;
Expand Down

0 comments on commit f4dbf7e

Please sign in to comment.