Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/******************************************************************************\
* 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 <windows.h>
#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; }
|