core-util: Add retry logic when pa_close returns Broken pipe error
[platform/upstream/pulseaudio.git] / src / pulsecore / core-util.c
index e63a676..1929ed1 100644 (file)
@@ -2477,14 +2477,40 @@ void *pa_will_need(const void *p, size_t l) {
     return (void*) p;
 }
 
+#ifdef __TIZEN__
+int pa_safe_close_pipe(int fd) {
+    int r, retry;
+
+    for (retry = 5; retry > 0; retry--) {
+        r = pa_close(fd);
+        if (!r)
+            break;
+
+        pa_log("pa_close() failed while trying to close fd(%d) retry(%d): %s",
+                fd, retry, pa_cstrerror(errno));
+        pa_msleep(50);
+    }
+
+    return r;
+}
+#endif
+
 void pa_close_pipe(int fds[2]) {
     pa_assert(fds);
 
     if (fds[0] >= 0)
+#ifdef __TIZEN__
+        pa_assert_se(pa_safe_close_pipe(fds[0]) == 0);
+#else
         pa_assert_se(pa_close(fds[0]) == 0);
+#endif
 
     if (fds[1] >= 0)
+#ifdef __TIZEN__
+        pa_assert_se(pa_safe_close_pipe(fds[1]) == 0);
+#else
         pa_assert_se(pa_close(fds[1]) == 0);
+#endif
 
     fds[0] = fds[1] = -1;
 }