MessagePortService returns E_RESOURCE_UNAVAILABLE when the socket receiver buffer... 86/14086/1
authorHyunbin Lee <hyunbin.lee@samsung.com>
Tue, 19 Nov 2013 05:50:15 +0000 (14:50 +0900)
committerHyunbin Lee <hyunbin.lee@samsung.com>
Mon, 23 Dec 2013 06:51:34 +0000 (15:51 +0900)
Change-Id: I0c774d06ec0b973a517e183d922c963b9d6b4dd7
Signed-off-by: Hyunbin Lee <hyunbin.lee@samsung.com>
src/FIo_MessagePortService.cpp
src/IpcServer.cpp

index 6f6253f..45e4d85 100644 (file)
@@ -254,10 +254,12 @@ _MessagePortService::SendMessage(const BundleBuffer& metadata, const BundleBuffe
        }
 
        r = __pStub->SendMessage(clientId, metadata, buffer);
+       SysTryReturn(NID_IO, r != E_RESOURCE_UNAVAILABLE, MESSAGEPORT_ERROR_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE,
+                               "[E_RESOURCE_UNAVAILABLE] The socket receiver buffer of remote port is temporarily full.");
        SysTryReturn(NID_IO, r == E_SUCCESS, MESSAGEPORT_ERROR_IO_ERROR, E_SYSTEM,
                                "[E_SYSTEM] Failed to send a message.");
 
-       return E_SUCCESS;
+       return MESSAGEPORT_ERROR_NONE;
 }
 
 String 
index 3c449f5..e229672 100644 (file)
@@ -718,6 +718,7 @@ IpcServer::SendResponse(int client, IPC::Message* pMessage)
        GError* pGError = null;
        _ClientInfo* pClientInfo = null;
        int ret = 0;
+       int retry = 0;
 
        SysTryReturn(NID_IO, client >= 0 && pMessage != null, false, E_INVALID_ARG,
                                "[E_INVALID_ARG] pMessage(0x%x) is null or clinet(%d) < 0", pMessage,
@@ -734,12 +735,19 @@ IpcServer::SendResponse(int client, IPC::Message* pMessage)
 
        while (remain > 0)
        {
-               pGError = NULL;
+               pGError = null;
                ret = g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
-               if (ret != G_IO_STATUS_NORMAL)
+               if (ret == G_IO_STATUS_AGAIN)
                {
-                       SysLog(NID_IO, "Failed to send a response: %d", ret);
-                       SysTryCatch(NID_IO, ret != G_IO_STATUS_ERROR, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+                       ++retry;
+                       SysTryCatch(NID_IO, retry <= 2, r = E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE,
+                                       "[E_RESOURCE_UNAVAILABLE] The socket receiver buffer of remote port is temporarily full.");
+               }
+               else if (ret != G_IO_STATUS_NORMAL)
+               {
+                       SysLogException(NID_IO, E_SYSTEM, "[E_SYSTEM] Error occurred during writing data to socket.");
+                       r = E_SYSTEM;
+                       goto CATCH;
                }
 
                remain -= written;
@@ -749,10 +757,13 @@ IpcServer::SendResponse(int client, IPC::Message* pMessage)
        g_io_channel_flush(pClientInfo->pReverseChannel, &pGError);
 
        delete pMessage;
-
        return E_SUCCESS;
 
 CATCH:
+       if (pGError)
+       {
+               SysLog(NID_IO, "GError is %s", pGError->message);
+       }
        delete pMessage;
        return r;
 }
@@ -767,6 +778,7 @@ IpcServer::SendResponse(int client, const IPC::Message& message)
        GError* pGError = null;
        _ClientInfo* pClientInfo = null;
        int ret = 0;
+       int retry = 0;
 
        SysTryReturn(NID_IO, client >= 0, false, E_INVALID_ARG, "[E_INVALID_ARG] clinet(%d) < 0", client);
        SysTryCatch(NID_IO, !message.is_sync(), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Can't send sync. messagee.");
@@ -781,12 +793,19 @@ IpcServer::SendResponse(int client, const IPC::Message& message)
 
        while (remain > 0)
        {
-               pGError = NULL;
+               pGError = null;
                ret = g_io_channel_write_chars(pClientInfo->pReverseChannel, (char*) pData, remain, &written, &pGError);
-               if (ret != G_IO_STATUS_NORMAL)
+               if (ret == G_IO_STATUS_AGAIN)
                {
-                       SysLog(NID_IO, "Failed to send a response: %d", ret);
-                       SysTryCatch(NID_IO, ret != G_IO_STATUS_ERROR, , E_SYSTEM, "[E_SYSTEM] Error occurred during writing message to socket.");
+                       ++retry;
+                       SysTryCatch(NID_IO, retry <= 2, r = E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE,
+                                       "[E_RESOURCE_UNAVAILABLE] The socket receiver buffer of remote port is temporarily full.");
+               }
+               else if (ret != G_IO_STATUS_NORMAL)
+               {
+                       SysLogException(NID_IO, E_SYSTEM, "[E_SYSTEM] Error occurred during writing data to socket.");
+                       r = E_SYSTEM;
+                       goto CATCH;
                }
 
                remain -= written;
@@ -798,5 +817,10 @@ IpcServer::SendResponse(int client, const IPC::Message& message)
        return E_SUCCESS;
 
 CATCH:
+       if (pGError)
+       {
+               SysLog(NID_IO, "GError is %s", pGError->message);
+       }
        return r;
 }
+