Browse Source

Check and handle signal interrupts in sockets

Signed-off-by: Haitao Huang <4699115+haitaohuang@users.noreply.github.com>
Haitao Huang 6 years ago
parent
commit
9d8046e310

+ 22 - 4
psw/ae/common/src/NonBlockingUnixCommunicationSocket.cpp

@@ -43,7 +43,7 @@
 #include <errno.h>
 #include <sys/epoll.h>
 #include <string.h>
-
+#include <se_trace.h>
 NonBlockingUnixCommunicationSocket::~NonBlockingUnixCommunicationSocket()
 {
    if (mEvents != NULL)
@@ -136,6 +136,10 @@ char* NonBlockingUnixCommunicationSocket::readRaw(ssize_t length)
     do{
         //try a direct read (maybe all data is available already)
         step = read(mSocket, recBuf, length);
+        if(step == -1 && errno == EINTR && CheckForTimeout() == false){
+             SE_TRACE_WARNING("read is interrupted by signal\n");
+             continue;
+        }
         if (step == -1 && errno != EAGAIN)
         {
             errorDetected = true;
@@ -154,7 +158,10 @@ char* NonBlockingUnixCommunicationSocket::readRaw(ssize_t length)
         }
 
         //wait for events
-        eventNum = epoll_wait(mEpoll, mEvents, MAX_EVENTS, epollTimeout);    
+        do {
+            eventNum = epoll_wait(mEpoll, mEvents, MAX_EVENTS, epollTimeout);
+        } while (eventNum == -1 && errno == EINTR && CheckForTimeout() == false);
+
         if (eventNum == -1)
         {
             errorDetected = true;
@@ -253,6 +260,12 @@ ssize_t NonBlockingUnixCommunicationSocket::partialRead(char* buffer, ssize_t ma
         remaining = maxLength - totalRead;        
 
         step = read(mSocket, buffer + totalRead,  (remaining > chunkSize ? chunkSize : remaining));
+
+        if(step == -1 && errno == EINTR && CheckForTimeout() == false){
+             SE_TRACE_WARNING("read was interrupted by signal\n");
+             continue;
+        }
+
         if (step == -1)
         {
             if (errno != EAGAIN)
@@ -291,6 +304,10 @@ ssize_t  NonBlockingUnixCommunicationSocket::writeRaw(const char* data, ssize_t
     do
     {
         step = write(mSocket, data + total_write, length - total_write);
+        if(step == -1 && errno == EINTR && CheckForTimeout() == false){
+             SE_TRACE_WARNING("write was interrupted by signal\n");
+             continue;
+        }
 
         if (step == -1 && errno != EAGAIN)
         {
@@ -343,8 +360,9 @@ ssize_t  NonBlockingUnixCommunicationSocket::writeRaw(const char* data, ssize_t
                 continue;
             }
         }
-
-        eventNum = epoll_wait(mEpoll, mEvents, MAX_EVENTS, epollTimeout);
+        do {
+            eventNum = epoll_wait(mEpoll, mEvents, MAX_EVENTS, epollTimeout);
+        } while (eventNum == -1 && errno == EINTR && CheckForTimeout() == false);
         if (eventNum == -1)
         {
             errorDetected = true;

+ 10 - 3
psw/ae/common/src/UnixCommunicationSocket.cpp

@@ -34,10 +34,10 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <stdlib.h>
-
+#include <errno.h>
 #include <IAERequest.h>
 #include <IAEResponse.h>
-
+#include <se_trace.h>
 #include <UnixCommunicationSocket.h>
 
 
@@ -147,6 +147,10 @@ ssize_t UnixCommunicationSocket::writeRaw(const char* data, ssize_t length)
     do {
         ssize_t step = write(mSocket, data+written, length-written);
 
+        if(step == -1 && errno == EINTR && CheckForTimeout() == false){
+            SE_TRACE_WARNING("write was interrupted by signal\n");
+            continue;
+        }
         if (step < 0 || CheckForTimeout())
         {
             //this connection is probably closed
@@ -174,7 +178,10 @@ char* UnixCommunicationSocket::readRaw(ssize_t length)
 
     do {
         ssize_t step = read(mSocket, recBuf + total_read, length - total_read);
-
+        if(step == -1 && errno == EINTR && CheckForTimeout() == false){
+            SE_TRACE_WARNING("read was interrupted by signal\n");
+            continue;
+        }
         //check connection closed by peer
         if (step <= 0 || CheckForTimeout())
         {

+ 6 - 2
psw/uae_service/linux/Makefile

@@ -62,8 +62,9 @@ CXXFLAGS += -fPIC -Werror -g -DPROTOBUF_INLINE_NOT_IN_HEADERS=0
 EXTERNAL_LIB += -lprotobuf 
  
 vpath %.cpp .. $(COMMON_DIR)/src  $(IPC_COMMON_SRC_DIR) $(IPC_COMMON_PROTO_DIR) $(UAE_SRC_DIR) $(AE_COMMON_DIR)
+vpath %.c   $(COMMON_DIR)/src
 
-
+C_SRC   := se_trace.c
 
 IPC_SRC  := AECloseSessionRequest.cpp    \
              AEGetQuoteResponse.cpp \
@@ -110,7 +111,7 @@ SRC :=       AEServicesImpl.cpp \
              uae_service_version.cpp \
              uae_service_assert.cpp
 
-OBJ := $(SRC:.cpp=.o) $(IPC_SRC:.cpp=.o)  $(PROTOBUF_SRC:.cc=.o) 
+OBJ := $(C_SRC:.c=.o) $(SRC:.cpp=.o) $(IPC_SRC:.cpp=.o)  $(PROTOBUF_SRC:.cc=.o) 
 
 LDUFLAGS:= -pthread -L$(BUILD_DIR)
 LDUFLAGS += -Wl,--version-script=uae_service.lds -Wl,--gc-sections
@@ -151,6 +152,9 @@ messages.pb.o : $(IPC_COMMON_PROTO_DIR)/messages.pb.cc
 	$(CXX) $(filter-out -Wshadow, $(CXXFLAGS)) -c $< -o $@
 %.o :%.cpp
 	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@
+%.o: %.c
+	$(CC) $(CFLAGS) $(INCLUDE) -Werror -fPIC -c $< -o $@
+
 
 $(BUILD_DIR):
 	@$(MKDIR) $@