2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
15 #include "TaAfsAdmSvrClientInternal.h"
16 #include <WINNT/AfsAppLib.h>
20 * VARIABLES __________________________________________________________________
30 HANDLE hCallbackThread;
36 * PROTOTYPES _________________________________________________________________
40 DWORD WINAPI ClientPingThread (LPVOID lp);
42 DWORD WINAPI ClientCallbackThread (LPVOID lp);
46 * ROUTINES ___________________________________________________________________
50 void StartPingThread (DWORD idClient)
54 for (size_t ii = 0; ii < l.cdwClients; ++ii)
56 if (!l.adwClients[ ii ])
59 if (REALLOC (l.adwClients, l.cdwClients, 1+ii, 1))
61 l.adwClients[ ii ] = idClient;
67 l.hPingThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ClientPingThread, (LPVOID)0, 0, &dwThreadID);
74 void StopPingThread (DWORD idClient)
78 for (size_t ii = 0; ii < l.cdwClients; ++ii)
80 if (l.adwClients[ ii ] == idClient)
81 l.adwClients[ ii ] = 0;
88 DWORD WINAPI ClientPingThread (LPVOID lp)
92 Sleep (csecAFSADMSVR_CLIENT_PING * 1000L); // server adds race allowance
96 for (size_t ii = 0; ii < l.cdwClients; ++ii)
99 if ((idClient = l.adwClients[ ii ]) == 0)
107 if (!AfsAdmSvr_Ping (idClient, &status))
109 if (status == ERROR_INVALID_HANDLE) // we've been disconnected!
110 StopPingThread (idClient);
123 l.hPingThread = NULL;
128 void StartCallbackThread (void)
131 if ((++l.cReqCallback) == 1)
134 l.hCallbackThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ClientCallbackThread, (LPVOID)0, 0, &dwThreadID);
140 void StopCallbackThread (void)
143 if (!(l.cReqCallback) || !(--l.cReqCallback))
145 if (l.hCallbackThread)
147 TerminateThread (l.hCallbackThread, 0);
148 l.hCallbackThread = NULL;
155 DWORD WINAPI ClientCallbackThread (LPVOID lp)
157 // The callback thread's task is simple: it initiates a particular
158 // RPC, which never returns. (Well, actually, it will return if the
159 // server shuts down.) By leaving a thread active, the server has a
160 // context in which to perform callback calls.
164 AfsAdmSvr_CallbackHost();
170 l.hCallbackThread = NULL;