From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 1/2] Fix Use hashtable to record udev path
Date: Mon, 10 May 2010 09:33:21 -0500 [thread overview]
Message-ID: <201005100933.21924.denkenz@gmail.com> (raw)
In-Reply-To: <1273127293-4671-1-git-send-email-zhenhua.zhang@intel.com>
[-- Attachment #1: Type: text/plain, Size: 4137 bytes --]
Hi Zhenhua,
> Sometimes, Udev device 'remove' event could not report correct parent
> node of current udev_device. Current code replies on the devpath
> attached on the parent node to find modem and then remove it.
>
> This fix is to change the way to store the devpath info into a
> hashtable. So that we search hashtable to get devpath and remove the
> modem.
> ---
> plugins/udev.c | 59
> +++++++++++++++++++++++++++++++++++++------------------ 1 files changed,
> 40 insertions(+), 19 deletions(-)
>
> diff --git a/plugins/udev.c b/plugins/udev.c
> index 964ac65..6850bf9 100644
> --- a/plugins/udev.c
> +++ b/plugins/udev.c
> @@ -36,6 +36,7 @@
> #include <ofono/log.h>
>
> static GSList *modem_list = NULL;
> +static GHashTable *devpath_list = NULL;
>
> static struct ofono_modem *find_modem(const char *devpath)
> {
> @@ -258,7 +259,7 @@ static void add_modem(struct udev_device *udev_device)
> {
> struct ofono_modem *modem;
> struct udev_device *parent;
> - const char *devpath, *driver;
> + const char *devpath, *curpath, *driver;
>
> parent = udev_device_get_parent(udev_device);
> if (parent == NULL)
> @@ -294,6 +295,12 @@ static void add_modem(struct udev_device *udev_device)
> modem_list = g_slist_prepend(modem_list, modem);
> }
>
> + curpath = udev_device_get_devpath(udev_device);
> + if (curpath == NULL)
> + return;
> +
> + g_hash_table_insert(devpath_list, g_strdup(curpath), g_strdup(devpath));
> +
> if (g_strcmp0(driver, "mbm") == 0)
> add_mbm(modem, udev_device);
> else if (g_strcmp0(driver, "hso") == 0)
> @@ -306,30 +313,28 @@ static void add_modem(struct udev_device
> *udev_device) add_novatel(modem, udev_device);
> }
>
> +static gboolean devpath_remove(gpointer key, gpointer value, gpointer
> user_data) +{
> + const char *path = value;
> + const char *devpath = user_data;
> +
> + if (!g_strcmp0(path, devpath))
> + return TRUE;
How about a simple return g_str_equals here?
> +
> + return FALSE;
> +}
> +
> static void remove_modem(struct udev_device *udev_device)
> {
> struct ofono_modem *modem;
> - struct udev_device *parent;
> - const char *devpath, *driver = NULL;
> + const char *curpath = udev_device_get_devpath(udev_device);
> + char *devpath, *remove;
>
> - parent = udev_device_get_parent(udev_device);
> - if (parent == NULL)
> + if (curpath == NULL)
> return;
>
> - driver = get_driver(parent);
> - if (driver == NULL) {
> - parent = udev_device_get_parent(parent);
> - driver = get_driver(parent);
> - if (driver == NULL) {
> - parent = udev_device_get_parent(parent);
> - driver = get_driver(parent);
> - if (driver == NULL)
> - return;
> - }
> - }
> -
> - devpath = udev_device_get_devpath(parent);
> - if (devpath == NULL)
> + devpath = g_hash_table_lookup(devpath_list, curpath);
> + if (!devpath)
> return;
>
> modem = find_modem(devpath);
> @@ -339,6 +344,12 @@ static void remove_modem(struct udev_device
> *udev_device) modem_list = g_slist_remove(modem_list, modem);
>
> ofono_modem_remove(modem);
> +
> + remove = g_strdup(devpath);
> +
> + g_hash_table_foreach_remove(devpath_list, devpath_remove, remove);
> +
> + g_free(remove);
> }
>
> static void enumerate_devices(struct udev *context)
> @@ -443,6 +454,13 @@ static void udev_start(void)
>
> static int udev_init(void)
> {
> + devpath_list = g_hash_table_new_full(g_str_hash, g_str_equal,
> + g_free, g_free);
> + if (!devpath_list) {
> + ofono_error("Failed to create udev path list");
> + return -ENOMEM;
> + }
> +
You now need to take care of freeing the devpath_list on any further error
conditions that might occur, otherwise you leak memory.
> udev_ctx = udev_new();
> if (udev_ctx == NULL) {
> ofono_error("Failed to create udev context");
> @@ -483,6 +501,9 @@ static void udev_exit(void)
> g_slist_free(modem_list);
> modem_list = NULL;
>
> + g_hash_table_destroy(devpath_list);
> + devpath_list = NULL;
> +
> if (udev_ctx == NULL)
> return;
>
Regards,
-Denis
next prev parent reply other threads:[~2010-05-10 14:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-06 6:28 [PATCH 1/2] Fix Use hashtable to record udev path Zhenhua Zhang
2010-05-06 6:28 ` [PATCH 2/2] Fix check data device before register the modem Zhenhua Zhang
2010-05-06 6:30 ` Zhang, Zhenhua
2010-05-10 14:35 ` Denis Kenzior
2010-05-06 6:30 ` [PATCH 1/2] Fix Use hashtable to record udev path Zhang, Zhenhua
2010-05-10 14:33 ` Denis Kenzior [this message]
-- strict thread matches above, loose matches on Subject: below --
2010-05-11 1:04 Zhenhua Zhang
2010-05-11 14:21 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201005100933.21924.denkenz@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox