summaryrefslogtreecommitdiffstats
path: root/udrv
diff options
context:
space:
mode:
Diffstat (limited to 'udrv')
-rw-r--r--udrv/ulinux/uipc.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/udrv/ulinux/uipc.c b/udrv/ulinux/uipc.c
index a0b8e2a5b..db58a21ae 100644
--- a/udrv/ulinux/uipc.c
+++ b/udrv/ulinux/uipc.c
@@ -69,6 +69,8 @@
#define SAFE_FD_ISSET(fd, set) (((fd) == -1) ? FALSE : FD_ISSET((fd), (set)))
+#define UIPC_FLUSH_BUFFER_SIZE 1024
+
/*****************************************************************************
** Local type definitions
******************************************************************************/
@@ -375,30 +377,40 @@ static int uipc_setup_server_locked(tUIPC_CH_ID ch_id, char *name, tUIPC_RCV_CBA
static void uipc_flush_ch_locked(tUIPC_CH_ID ch_id)
{
- char buf;
+ char buf[UIPC_FLUSH_BUFFER_SIZE];
struct pollfd pfd;
int ret;
- pfd.events = POLLIN|POLLHUP;
+ pfd.events = POLLIN;
pfd.fd = uipc_main.ch[ch_id].fd;
if (uipc_main.ch[ch_id].fd == UIPC_DISCONNECTED)
+ {
+ BTIF_TRACE_EVENT("%s() - fd disconnected. Exiting", __FUNCTION__);
return;
+ }
while (1)
{
ret = poll(&pfd, 1, 1);
- BTIF_TRACE_EVENT("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
+ BTIF_TRACE_VERBOSE("%s() - polling fd %d, revents: 0x%x, ret %d",
+ __FUNCTION__, pfd.fd, pfd.revents, ret);
if (pfd.revents & (POLLERR|POLLHUP))
+ {
+ BTIF_TRACE_EVENT("%s() - POLLERR or POLLHUP. Exiting", __FUNCTION__);
return;
+ }
if (ret <= 0)
{
- BTIF_TRACE_EVENT("uipc_flush_ch_locked : error (%d)", ret);
+ BTIF_TRACE_EVENT("%s() - error (%d). Exiting", __FUNCTION__, ret);
return;
}
- read(pfd.fd, &buf, 1);
+
+ /* read sufficiently large buffer to ensure flush empties socket faster than
+ it is getting refilled */
+ read(pfd.fd, &buf, UIPC_FLUSH_BUFFER_SIZE);
}
}