/******************************************************************************\ * This is a part of the Microsoft Source Code Samples. * Copyright 1995 - 1997 Microsoft Corporation. * All rights reserved. * This source code is only intended as a supplement to * Microsoft Development Tools and/or WinHelp documentation. * See these sources for detailed information regarding the * Microsoft samples programs. \******************************************************************************/ /*++ Copyright (c) 1997 Microsoft Corporation Module Name: SrvList.c Abstract: The server component of Remote. This module implements three lists of REMOTE_CLIENT structures, for handshaking, connected, and closing clients. To simplify the interface items always progress through the three lists in order, with list node memory being freed as it is removed from the closing list. Author: Dave Hart 30 May 1997 Environment: Console App. User mode. Revision History: --*/ #include #include "Remote.h" #include "Server.h" #include "SrvList.h" VOID FASTCALL InitializeClientLists( VOID ) { InitializeCriticalSection( &csHandshakingList ); InitializeCriticalSection( &csClientList ); InitializeCriticalSection( &csClosingClientList ); InitializeListHead( &HandshakingListHead ); InitializeListHead( &ClientListHead ); InitializeListHead( &ClosingClientListHead ); } VOID FASTCALL AddClientToHandshakingList( PREMOTE_CLIENT pClient ) { EnterCriticalSection( &csHandshakingList ); InsertTailList( &HandshakingListHead, &pClient->Links ); LeaveCriticalSection( &csHandshakingList ); } VOID FASTCALL MoveClientToNormalList( PREMOTE_CLIENT pClient ) { EnterCriticalSection( &csHandshakingList ); RemoveEntryList( &pClient->Links ); LeaveCriticalSection( &csHandshakingList ); EnterCriticalSection( &csClientList ); InsertTailList( &ClientListHead, &pClient->Links ); LeaveCriticalSection( &csClientList ); } VOID FASTCALL MoveClientToClosingList( PREMOTE_CLIENT pClient ) { EnterCriticalSection( &csClientList ); RemoveEntryList( &pClient->Links ); LeaveCriticalSection( &csClientList ); EnterCriticalSection( &csClosingClientList ); InsertTailList( &ClosingClientListHead, &pClient->Links ); LeaveCriticalSection( &csClosingClientList ); } PREMOTE_CLIENT FASTCALL RemoveFirstClientFromClosingList( VOID ) { PREMOTE_CLIENT pClient; EnterCriticalSection( &csClosingClientList ); if (IsListEmpty(&ClosingClientListHead)) { pClient = NULL; } else { pClient = (PREMOTE_CLIENT) RemoveHeadList( &ClosingClientListHead ); ZeroMemory( &pClient->Links, sizeof(&pClient->Links) ); } LeaveCriticalSection( &csClosingClientList ); return pClient; }