X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=AcessNative%2Facesskernel_src%2Fserver.c;h=0cede83c38a64d1fcfe0e2dd237b943d5790935c;hb=3764c294f21229bdf700f436fa4884f5e76e0d3a;hp=af33bfd47b47fb60dce560b172eec9c68844a4fa;hpb=9ed2477f5f7e5b01501368719e93259aa336932f;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/server.c b/AcessNative/acesskernel_src/server.c index af33bfd4..0cede83c 100644 --- a/AcessNative/acesskernel_src/server.c +++ b/AcessNative/acesskernel_src/server.c @@ -17,6 +17,7 @@ # include #endif #include "../syscalls.h" +//#include #define USE_TCP 0 #define MAX_CLIENTS 16 @@ -36,6 +37,10 @@ typedef struct { // === IMPORTS === extern tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength); +extern int Threads_CreateRootProcess(void); +// 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, ...); // === PROTOTYPES === tClient *Server_GetClient(int ClientID); @@ -50,7 +55,6 @@ SOCKET gSocket = INVALID_SOCKET; # define INVALID_SOCKET -1 int gSocket = INVALID_SOCKET; #endif - int giServer_NextClientID = 1; tClient gaServer_Clients[MAX_CLIENTS]; // === CODE === @@ -75,12 +79,17 @@ tClient *Server_GetClient(int ClientID) tClient *ret = NULL; int i; + // Allocate an ID if needed + if(ClientID == 0) + ClientID = Threads_CreateRootProcess(); + for( i = 0; i < MAX_CLIENTS; i ++ ) { if( gaServer_Clients[i].ClientID == ClientID ) { - ret = &gaServer_Clients[i]; - break; + return &gaServer_Clients[i]; } + if(!ret && gaServer_Clients[i].ClientID == 0) + ret = &gaServer_Clients[i]; } // Uh oh, no free slots @@ -88,20 +97,18 @@ tClient *Server_GetClient(int ClientID) if( !ret ) return NULL; - if( ClientID == 0 ) - { - ret->ClientID = giServer_NextClientID ++; - ret->CurrentRequest = NULL; + // Allocate a thread for the process + ret->ClientID = ClientID; + ret->CurrentRequest = NULL; - if( !ret->WorkerThread ) { - ret->WorkerThread = SDL_CreateThread( Server_WorkerThread, ret ); - ret->WaitFlag = SDL_CreateCond(); - ret->Mutex = SDL_CreateMutex(); - SDL_mutexP( ret->Mutex ); - } + if( !ret->WorkerThread ) { + ret->WaitFlag = SDL_CreateCond(); + ret->Mutex = SDL_CreateMutex(); + SDL_mutexP( ret->Mutex ); + ret->WorkerThread = SDL_CreateThread( Server_WorkerThread, ret ); } - return &gaServer_Clients[i]; + return ret; } int Server_WorkerThread(void *ClientPtr) @@ -111,6 +118,7 @@ int Server_WorkerThread(void *ClientPtr) tRequestHeader errorHeader; int retSize = 0; int sentSize; + int cur_client_id = 0; #if USE_TCP #else @@ -120,14 +128,20 @@ int Server_WorkerThread(void *ClientPtr) while( Client->CurrentRequest == NULL ) SDL_CondWait(Client->WaitFlag, Client->Mutex); - printf("Worker for %i, Job: %p\n", Client->ClientID, Client->CurrentRequest); + if(Client->ClientID != cur_client_id) { + Threads_SetThread( Client->ClientID ); + cur_client_id = Client->ClientID; + } + + Log_Debug("AcessSrv", "Worker %i takes %p", + Client->ClientID, Client->CurrentRequest); // Get the response retHeader = SyscallRecieve(Client->CurrentRequest, &retSize); if( !retHeader ) { // Return an error to the client - printf("Error returned by SyscallRecieve\n"); + printf("ERROR: SyscallRecieve failed\n"); errorHeader.CallID = Client->CurrentRequest->CallID; errorHeader.NParams = 0; retHeader = &errorHeader; @@ -140,9 +154,10 @@ int Server_WorkerThread(void *ClientPtr) // Mark the thread as ready for another job Client->CurrentRequest = 0; - printf("Sending %i to %x:%i\n", + Log_Debug("AcessSrv", "Sending %i to %x:%i (Client %i)", retSize, ntohl(Client->ClientAddr.sin_addr.s_addr), - ntohs(Client->ClientAddr.sin_port) + ntohs(Client->ClientAddr.sin_port), + Client->ClientID ); // Return the data @@ -213,7 +228,7 @@ int SyscallServer(void) listen(gSocket, 5); #endif - Log_Notice("Syscall", "Listening on 0.0.0.0:%i\n", SERVER_PORT); + Log_Notice("AcessSrv", "Listening on 0.0.0.0:%i", SERVER_PORT); // Wait for something to do :) for( ;; ) @@ -227,7 +242,7 @@ int SyscallServer(void) break ; } - printf("Client connection %x:%i", + Log("Client connection %x:%i\n", ntohl(client.sin_addr), ntohs(client.sin_port) ); @@ -236,9 +251,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; @@ -269,7 +286,8 @@ int SyscallServer(void) continue; } - printf("client = %p, ClientID = %i\n", client, client->ClientID); + Log_Debug("AcessSrv", "Message from Client %i (%p)", + client->ClientID, client); client->CurrentRequest = req; SDL_CondSignal(client->WaitFlag);