diff mbox series

[2/2] qmimodem: Use l_queue instead of GList for pending service creation

Message ID 20240222235356.32485-2-steve.schrock@getcruise.com (mailing list archive)
State Superseded
Headers show
Series [1/2] qmimodem: Use l_queue instead of GList for notifications | expand

Commit Message

Steve Schrock Feb. 22, 2024, 11:53 p.m. UTC
---
 drivers/qmimodem/qmi.c | 43 ++++++++++++++++++++++--------------------
 1 file changed, 23 insertions(+), 20 deletions(-)

Comments

Denis Kenzior Feb. 23, 2024, 4:20 p.m. UTC | #1
Hi Steve,

On 2/22/24 17:53, Steve Schrock wrote:
> ---
>   drivers/qmimodem/qmi.c | 43 ++++++++++++++++++++++--------------------
>   1 file changed, 23 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c
> index 168dee1a..99b3d84d 100644
> --- a/drivers/qmimodem/qmi.c
> +++ b/drivers/qmimodem/qmi.c
> @@ -1382,24 +1382,27 @@ static void service_create_shared_reply(struct l_idle *idle, void *user_data)
>   	__qmi_device_discovery_complete(data->device, &data->super);
>   }
>   
> +static void service_create_shared_schedule_callback(void *data, void *user_data)
> +{
> +	struct service_create_shared_data *shared_data = data;
> +	struct qmi_service *service = user_data;
> +
> +	shared_data->service = qmi_service_ref(service);
> +	shared_data->idle = l_idle_create(service_create_shared_reply,
> +						shared_data, NULL);
> +

nit: empty line at end of function

> +}
> +
>   static void service_create_shared_pending_reply(struct qmi_device *device,
>   						unsigned int type,
>   						struct qmi_service *service)
>   {
> -	gpointer key = L_UINT_TO_PTR(type | 0x80000000);
> -	GList **shared = l_hashmap_remove(device->service_list, key);
> -	GList *l;
> -
> -	for (l = *shared; l; l = l->next) {
> -		struct service_create_shared_data *shared_data = l->data;
> -
> -		shared_data->service = qmi_service_ref(service);
> -		shared_data->idle = l_idle_create(service_create_shared_reply,
> -							shared_data, NULL);
> -	}
> +	void *key = L_UINT_TO_PTR(type | 0x80000000);
> +	struct l_queue *shared = l_hashmap_remove(device->service_list, key);
>   
> -	g_list_free(*shared);
> -	l_free(shared);
> +	l_queue_foreach(shared, service_create_shared_schedule_callback,
> +						service);

You could use l_queue_get_entries() here to avoid a foreach / creating a new 
function if you think that will look better.  Something like:

const struct l_queue_entry *entry;

for (entry = l_queue_get_entries(q); entry; entry = entry->next)
...

It looks like this function is always called from two places:

- qmux_client_create_reply()
This call site seems to be invoked on a timeout with a NULL service.  Don't 
think that makes sense?  Should this invocation just be dropped?

- qmux_client_create_callback()
This call site happens when we receive a reply, which should be on a different 
iteration of the event loop compared to qmi_device_qmux_client_create().  Can we 
invoke the callbacks directly here instead of scheduling another l_idle callback?

> +	l_queue_destroy(shared, NULL);
>   }
>   
>   static void service_create_shared_data_free(gpointer user_data)

<snip>

> @@ -2148,7 +2151,7 @@ bool qmi_service_create_shared(struct qmi_device *device, uint16_t type,
>   			qmi_create_func_t func, void *user_data,
>   			qmi_destroy_func_t destroy)
>   {
> -	GList **l = NULL;
> +	struct l_queue *shared = NULL;

nit: This doesn't need to be initialized.  Let the compiler warn us in case 
uninitiated variables are used.

>   	struct qmi_service *service = NULL;
>   	unsigned int type_val = type;
>   	int r;

Regards,
-Denis
diff mbox series

Patch

diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c
index 168dee1a..99b3d84d 100644
--- a/drivers/qmimodem/qmi.c
+++ b/drivers/qmimodem/qmi.c
@@ -1382,24 +1382,27 @@  static void service_create_shared_reply(struct l_idle *idle, void *user_data)
 	__qmi_device_discovery_complete(data->device, &data->super);
 }
 
+static void service_create_shared_schedule_callback(void *data, void *user_data)
+{
+	struct service_create_shared_data *shared_data = data;
+	struct qmi_service *service = user_data;
+
+	shared_data->service = qmi_service_ref(service);
+	shared_data->idle = l_idle_create(service_create_shared_reply,
+						shared_data, NULL);
+
+}
+
 static void service_create_shared_pending_reply(struct qmi_device *device,
 						unsigned int type,
 						struct qmi_service *service)
 {
-	gpointer key = L_UINT_TO_PTR(type | 0x80000000);
-	GList **shared = l_hashmap_remove(device->service_list, key);
-	GList *l;
-
-	for (l = *shared; l; l = l->next) {
-		struct service_create_shared_data *shared_data = l->data;
-
-		shared_data->service = qmi_service_ref(service);
-		shared_data->idle = l_idle_create(service_create_shared_reply,
-							shared_data, NULL);
-	}
+	void *key = L_UINT_TO_PTR(type | 0x80000000);
+	struct l_queue *shared = l_hashmap_remove(device->service_list, key);
 
-	g_list_free(*shared);
-	l_free(shared);
+	l_queue_foreach(shared, service_create_shared_schedule_callback,
+						service);
+	l_queue_destroy(shared, NULL);
 }
 
 static void service_create_shared_data_free(gpointer user_data)
@@ -1699,14 +1702,14 @@  static int qmi_device_qmux_client_create(struct qmi_device *device,
 	unsigned char client_req[] = { 0x01, 0x01, 0x00, service_type };
 	struct qmi_request *req;
 	struct qmux_client_create_data *data;
-	GList **shared;
+	struct l_queue *shared;
 	unsigned int type_val = service_type;
 	int i;
 
 	if (!device->version_list)
 		return -ENOENT;
 
-	shared = l_new(GList *, 1);
+	shared = l_queue_new();
 	data = l_new(struct qmux_client_create_data, 1);
 
 	data->super.destroy = qmux_client_create_data_free;
@@ -2148,7 +2151,7 @@  bool qmi_service_create_shared(struct qmi_device *device, uint16_t type,
 			qmi_create_func_t func, void *user_data,
 			qmi_destroy_func_t destroy)
 {
-	GList **l = NULL;
+	struct l_queue *shared = NULL;
 	struct qmi_service *service = NULL;
 	unsigned int type_val = type;
 	int r;
@@ -2159,10 +2162,10 @@  bool qmi_service_create_shared(struct qmi_device *device, uint16_t type,
 	if (type == QMI_SERVICE_CONTROL)
 		return false;
 
-	l = l_hashmap_lookup(device->service_list,
+	shared = l_hashmap_lookup(device->service_list,
 				L_UINT_TO_PTR(type_val | 0x80000000));
 
-	if (!l) {
+	if (!shared) {
 		/*
 		 * There is no way to find in an l_hashmap using a custom
 		 * function. Instead we use a temporary struct to store the
@@ -2179,7 +2182,7 @@  bool qmi_service_create_shared(struct qmi_device *device, uint16_t type,
 	} else
 		type_val |= 0x80000000;
 
-	if (l || service) {
+	if (shared || service) {
 		struct service_create_shared_data *data;
 
 		data = l_new(struct service_create_shared_data, 1);
@@ -2195,7 +2198,7 @@  bool qmi_service_create_shared(struct qmi_device *device, uint16_t type,
 			data->idle = l_idle_create(service_create_shared_reply,
 							data, NULL);
 		} else
-			*l = g_list_prepend(*l, data);
+			l_queue_push_head(shared, data);
 
 		__qmi_device_discovery_started(device, &data->super);