Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / AcessNative / acesskernel_src / server.c
index 725a326..953722c 100644 (file)
@@ -38,6 +38,7 @@ typedef struct {
 // === IMPORTS ===
 extern tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength);
 extern int     Threads_CreateRootProcess(void);
+extern void    Threads_SetThread(int TID);
 // HACK: Should have these in a header
 extern void    Log_Debug(const char *Subsys, const char *Message, ...);
 extern void    Log_Notice(const char *Subsys, const char *Message, ...);
@@ -46,6 +47,7 @@ extern void   Log_Notice(const char *Subsys, const char *Message, ...);
 tClient        *Server_GetClient(int ClientID);
  int   Server_WorkerThread(void *ClientPtr);
  int   SyscallServer(void);
+ int   Server_ListenThread(void *Unused);
 
 // === GLOBALS ===
 #ifdef __WIN32__
@@ -56,6 +58,7 @@ SOCKET        gSocket = INVALID_SOCKET;
  int   gSocket = INVALID_SOCKET;
 #endif
 tClient        gaServer_Clients[MAX_CLIENTS];
+SDL_Thread     *gpServer_ListenThread;
 
 // === CODE ===
 int Server_GetClientID(void)
@@ -118,6 +121,7 @@ int Server_WorkerThread(void *ClientPtr)
        tRequestHeader  errorHeader;
         int    retSize = 0;
         int    sentSize;
+        int    cur_client_id = 0;
        
        #if USE_TCP
        #else
@@ -127,11 +131,17 @@ int Server_WorkerThread(void *ClientPtr)
                while( Client->CurrentRequest == NULL )
                        SDL_CondWait(Client->WaitFlag, Client->Mutex);
                
-               Log_Debug("AcessSrv", "Worker %i takes %p",
-                       Client->ClientID, Client->CurrentRequest);
+               if(Client->ClientID != cur_client_id) {
+                       Threads_SetThread( Client->ClientID );
+                       cur_client_id = Client->ClientID;
+               }
                
                // Get the response
                retHeader = SyscallRecieve(Client->CurrentRequest, &retSize);
+
+               Log_Debug("AcessSrv", "Client %i request %i",
+                       Client->ClientID, Client->CurrentRequest->CallID);
+               
                
                if( !retHeader ) {
                        // Return an error to the client
@@ -223,7 +233,12 @@ int SyscallServer(void)
        #endif
        
        Log_Notice("AcessSrv", "Listening on 0.0.0.0:%i", SERVER_PORT);
-       
+       gpServer_ListenThread = SDL_CreateThread( Server_ListenThread, NULL );
+       return 0;
+}
+
+int Server_ListenThread(void *Unused)
+{      
        // Wait for something to do :)
        for( ;; )
        {
@@ -245,9 +260,11 @@ int SyscallServer(void)
                tRequestHeader  *req = (void*)data;
                struct sockaddr_in      addr;
                uint    clientSize = sizeof(addr);
-                int    length = recvfrom(gSocket, data, BUFSIZ, 0, (struct sockaddr*)&addr, &clientSize);
+                int    length;
                tClient *client;
                
+               length = recvfrom(gSocket, data, BUFSIZ, 0, (struct sockaddr*)&addr, &clientSize);
+               
                if( length == -1 ) {
                        perror("SyscallServer - recv");
                        break;
@@ -259,7 +276,8 @@ int SyscallServer(void)
                        ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port));
                
                client = Server_GetClient(req->ClientID);
-               if( req->ClientID == 0 )
+               // NOTE: Hack - Should check if all zero
+               if( req->ClientID == 0 || client->ClientAddr.sin_port == 0 )
                {
                        memcpy(&client->ClientAddr, &addr, sizeof(addr));
                }
@@ -285,6 +303,5 @@ int SyscallServer(void)
                SDL_CondSignal(client->WaitFlag);
                #endif
        }
-       
        return -1;
 }

UCC git Repository :: git.ucc.asn.au