aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Schrock <steve.schrock@getcruise.com>2024-02-22 23:53:55 +0000
committerDenis Kenzior <denkenz@gmail.com>2024-02-23 10:05:02 -0600
commit6254bf0ce2d77bf0b259286d251dec0ef17f40e0 (patch)
tree913a47e2fc36e872c8aa311f42dae9c013d4213f
parentb95a03190891bb206e863d6034edf2529da0f9f3 (diff)
downloadofono-6254bf0ce2d77bf0b259286d251dec0ef17f40e0.tar.gz
qmimodem: Use l_queue instead of GList for notifications
-rw-r--r--drivers/qmimodem/qmi.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c
index 268db1f76..168dee1a6 100644
--- a/drivers/qmimodem/qmi.c
+++ b/drivers/qmimodem/qmi.c
@@ -112,7 +112,7 @@ struct qmi_service {
uint16_t minor;
uint8_t client_id;
uint16_t next_notify_id;
- GList *notify_list;
+ struct l_queue *notify_list;
};
struct qmi_param {
@@ -256,7 +256,7 @@ static void __discovery_free(void *data)
destroy(d);
}
-static void __notify_free(gpointer data, gpointer user_data)
+static void __notify_free(void *data)
{
struct qmi_notify *notify = data;
@@ -266,12 +266,12 @@ static void __notify_free(gpointer data, gpointer user_data)
l_free(notify);
}
-static gint __notify_compare(gconstpointer a, gconstpointer b)
+static bool __notify_compare(const void *data, const void *user_data)
{
- const struct qmi_notify *notify = a;
- uint16_t id = L_PTR_TO_UINT(b);
+ const struct qmi_notify *notify = data;
+ uint16_t id = L_PTR_TO_UINT(user_data);
- return notify->id - id;
+ return notify->id == id;
}
struct service_find_by_type_data {
@@ -717,23 +717,26 @@ static uint16_t __request_submit(struct qmi_device *device,
return req->tid;
}
+static void service_notify_if_message_matches(void *data, void *user_data)
+{
+ struct qmi_notify *notify = data;
+ struct qmi_result *result = user_data;
+
+ if (notify->message == result->message)
+ notify->callback(result, notify->user_data);
+}
+
static void service_notify(const void *key, void *value, void *user_data)
{
struct qmi_service *service = value;
struct qmi_result *result = user_data;
- GList *list;
/* ignore those that are in process of creation */
if (L_PTR_TO_UINT(key) & 0x80000000)
return;
- for (list = g_list_first(service->notify_list); list;
- list = g_list_next(list)) {
- struct qmi_notify *notify = list->data;
-
- if (notify->message == result->message)
- notify->callback(result, notify->user_data);
- }
+ l_queue_foreach(service->notify_list, service_notify_if_message_matches,
+ result);
}
static void handle_indication(struct qmi_device *device,
@@ -1666,6 +1669,7 @@ static void qmux_client_create_callback(uint16_t message, uint16_t length,
service->minor = data->minor;
service->client_id = client_id->client;
+ service->notify_list = l_queue_new();
__debug_device(device, "service created [client=%d,type=%d]",
service->client_id, service->type);
@@ -2452,7 +2456,7 @@ uint16_t qmi_service_register(struct qmi_service *service,
notify->user_data = user_data;
notify->destroy = destroy;
- service->notify_list = g_list_append(service->notify_list, notify);
+ l_queue_push_tail(service->notify_list, notify);
return notify->id;
}
@@ -2461,21 +2465,17 @@ bool qmi_service_unregister(struct qmi_service *service, uint16_t id)
{
unsigned int nid = id;
struct qmi_notify *notify;
- GList *list;
if (!service || !id)
return false;
- list = g_list_find_custom(service->notify_list,
- L_UINT_TO_PTR(nid), __notify_compare);
- if (!list)
- return false;
-
- notify = list->data;
+ notify = l_queue_remove_if(service->notify_list, __notify_compare,
+ L_UINT_TO_PTR(nid));
- service->notify_list = g_list_delete_link(service->notify_list, list);
+ if (!notify)
+ return false;
- __notify_free(notify, NULL);
+ __notify_free(notify);
return true;
}
@@ -2485,9 +2485,7 @@ bool qmi_service_unregister_all(struct qmi_service *service)
if (!service)
return false;
- g_list_foreach(service->notify_list, __notify_free, NULL);
- g_list_free(service->notify_list);
-
+ l_queue_destroy(service->notify_list, __notify_free);
service->notify_list = NULL;
return true;