X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fserver.c;h=953722c0d726201fef838ac984d6d49c04fde57c;hb=7f1cbeafb4acc13d0cc7c11ac47df3efe473c106;hp=725a326bd283ba2b48378ac4ac7d6151b5347cf6;hpb=7f80ab30017689efe0aaaab18abc7ceda689d859;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/server.c b/AcessNative/acesskernel_src/server.c index 725a326b..953722c0 100644 --- a/AcessNative/acesskernel_src/server.c +++ b/AcessNative/acesskernel_src/server.c @@ -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; }