secril-client: close fds on I/O errors
authorBasil Gello <vasek.gello@gmail.com>
Tue, 18 Jul 2017 19:00:01 +0000 (22:00 +0300)
committerChristopher N. Hesse <raymanfx@gmail.com>
Thu, 3 Aug 2017 21:03:38 +0000 (21:03 +0000)
if a kernel device returns an I/O error, it is better not to chew
the CPU resources retrying I/O operation on a not ready device.

Fixes periodical 100%-core load in audioserver after a voice call
completion.

Change-Id: I2b66ffd18c85823a11e50598a6b4e3c0245a0083

ril/libsecril-client/secril-client.cpp

index a0bf078446a4d5fc5c39dac31f6c6164e56268e8..e607f0078938d90cc6b5e549acec49d79977f9b2 100755 (executable)
@@ -1141,6 +1141,12 @@ error:
     FreeToken(&(client_prv->token_pool), token);
     ClearReqHistory(client_prv, token);
 
+    if (ret == -EPIPE || ret == -EBADFD) {
+        close(client_prv->sock);
+        client_prv->sock = -1;
+        client_prv->b_connect = 0;
+    }
+
     return RIL_CLIENT_ERR_UNKNOWN;
 }
 
@@ -1298,6 +1304,23 @@ static void * RxReaderFunc(void *param) {
                     client_prv->b_connect = 0;
                 }
             }
+        } else {
+            RLOGE("%s: select() returned %d\n", __FUNCTION__, -errno);
+
+            if (client_prv->sock > 0) {
+                close(client_prv->sock);
+                client_prv->sock = -1;
+                client_prv->b_connect = 0;
+            }
+
+            if (client_prv->p_rs)
+                record_stream_free(client_prv->p_rs);
+
+            // EOS
+            if (client_prv->err_cb) {
+                client_prv->err_cb(client_prv->err_cb_data, RIL_CLIENT_ERR_CONNECT);
+                return NULL;
+            }
         }
     }