Просмотр исходного кода

* Ported xmlrpc server blocking fix from OpenSIPS.

Juha Heinanen 16 лет назад
Родитель
Сommit
9f6ac8e61b

+ 3 - 2
modules_k/mi_xmlrpc/abyss_server.c

@@ -1352,7 +1352,7 @@ waitForConnectionCapacity(outstandingConnList * const outstandingConnListP) {
 void
 ServerHandleSigchld(pid_t const pid) {
 
-    ThreadHandleSigchld(pid);
+    //ThreadHandleSigchld(pid);
 }
 #endif
 
@@ -1388,7 +1388,6 @@ destroyConnSocket(void * const userHandle) {
 }
 
 
-#include "../../dprint.h"
 static void 
 serverRun2(TServer * const serverP) {
 
@@ -1423,6 +1422,8 @@ serverRun2(TServer * const serverP) {
             if (!error) {
                 addToOutstandingConnList(outstandingConnListP, connectionP);
                 ConnProcess(connectionP);
+                SocketClose(connectedSocketP);
+                
                 /* When connection is done (which could be later, courtesy
                    of a background thread), destroyConnSocket() will
                    destroy *connectedSocketP.

+ 7 - 0
modules_k/mi_xmlrpc/abyss_socket.c

@@ -146,6 +146,13 @@ SocketCreate(const struct TSocketVtbl * const vtblP,
 
 
 
+void
+SocketClose(TSocket * const socketP) {
+    socketP->vtbl.close(socketP);
+}
+
+
+
 void
 SocketDestroy(TSocket * const socketP) {
 

+ 6 - 0
modules_k/mi_xmlrpc/abyss_socket.h

@@ -14,6 +14,8 @@
 
 typedef struct in_addr TIPAddr;
 
+typedef void SocketCloseImpl(TSocket * const socketP);
+
 typedef void SocketDestroyImpl(TSocket * const socketP);
 
 typedef void SocketWriteImpl(TSocket *             const socketP,
@@ -57,6 +59,7 @@ typedef void SocketGetPeerNameImpl(TSocket *    const socketP,
                                    abyss_bool * const successP);
 
 struct TSocketVtbl {
+    SocketCloseImpl              * close;
     SocketDestroyImpl            * destroy;
     SocketWriteImpl              * write;
     SocketReadImpl               * read;
@@ -91,6 +94,9 @@ SocketInit(void);
 void
 SocketTerm(void);
 
+void
+SocketClose(TSocket *       const socketP);
+
 void
 SocketCreate(const struct TSocketVtbl * const vtblP,
              void *                     const implP,

+ 14 - 2
modules_k/mi_xmlrpc/abyss_socket_unix.c

@@ -102,6 +102,7 @@ SocketUnixTerm(void) {
 
 
 
+static SocketCloseImpl              socketClose;
 static SocketDestroyImpl            socketDestroy;
 static SocketWriteImpl              socketWrite;
 static SocketReadImpl               socketRead;
@@ -116,6 +117,7 @@ static SocketGetPeerNameImpl        socketGetPeerName;
 
 
 static struct TSocketVtbl const vtbl = {
+    &socketClose,
     &socketDestroy,
     &socketWrite,
     &socketRead,
@@ -189,14 +191,24 @@ SocketUnixCreateFd(int        const fd,
 }
 
 
+static void
+socketClose(TSocket * const socketP) {
+
+    struct socketUnix * const socketUnixP = socketP->implP;
+
+    if (!socketUnixP->userSuppliedFd && socketUnixP->fd ) {
+        close(socketUnixP->fd);
+        socketUnixP->fd = 0;
+    }
+}
+
 
 static void
 socketDestroy(TSocket * const socketP) {
 
     struct socketUnix * const socketUnixP = socketP->implP;
 
-    if (!socketUnixP->userSuppliedFd)
-        close(socketUnixP->fd);
+    socketClose(socketP);
 
     free(socketUnixP);
 }