library: insert request info to hash table before sending request 37/47337/1 accepted/tizen/mobile/20150902.235955 accepted/tizen/tv/20150903.000136 accepted/tizen/wearable/20150903.000403 submit/tizen/20150902.103836
authorSuchang Woo <suchang.woo@samsung.com>
Wed, 2 Sep 2015 08:02:50 +0000 (17:02 +0900)
committerSuchang Woo <suchang.woo@samsung.com>
Wed, 2 Sep 2015 08:02:50 +0000 (17:02 +0900)
In multi-thread context, a response can be received before inserting
request info to hash table. In that case, the response is dropped
and it makes timeout of the request.
To prevent a response drop and timeout, request info should be inserted
before sending request to Buxton daemon.

Change-Id: I4663f206c62138fc6076d8286922d29bd814a752
Signed-off-by: Suchang Woo <suchang.woo@samsung.com>
lib/buxton2.c

index 37f1ad8..a7933f6 100644 (file)
@@ -808,14 +808,15 @@ static struct bxt_req *set_value(struct buxton_client *client,
        rqst.key = (char *)key;
        rqst.val = (struct buxton_value *)val;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -893,14 +894,15 @@ static struct bxt_req *get_value(struct buxton_client *client,
        rqst.layer = req->layer;
        rqst.key = (char *)key;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -986,14 +988,15 @@ static struct bxt_req *list_keys(struct buxton_client *client,
        rqst.msgid = req->msgid;
        rqst.layer = req->layer;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1153,14 +1156,15 @@ static struct bxt_req *register_noti(struct buxton_client *client,
        rqst.layer = req->layer;
        rqst.key = (char *)key;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1332,14 +1336,15 @@ static struct bxt_req *unregister_noti(struct buxton_client *client,
        rqst.layer = req->layer;
        rqst.key = (char *)key;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1470,14 +1475,15 @@ static struct bxt_req *create_value(struct buxton_client *client,
        rqst.wpriv = (char *)write_privilege;
        rqst.val = (struct buxton_value *)val;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1559,14 +1565,15 @@ static struct bxt_req *unset_value(struct buxton_client *client,
        rqst.layer = req->layer;
        rqst.key = (char *)key;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1654,14 +1661,15 @@ static struct bxt_req *set_priv(struct buxton_client *client,
        val.type = BUXTON_TYPE_PRIVILEGE;
        val.value.s = (char *)privilege;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }
 
@@ -1749,14 +1757,15 @@ static struct bxt_req *get_priv(struct buxton_client *client,
        rqst.layer = req->layer;
        rqst.key = (char *)key;
 
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        r = send_req(client, &rqst);
        if (r == -1) {
-               free_req(req);
+               g_hash_table_remove(client->req_cbs,
+                               GUINT_TO_POINTER(req->msgid));
                return NULL;
        }
 
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
        return req;
 }