dix: Add ClientSignalAll()

This is a variant of ClientSignal() that signals all clients with an
optional matching sleeping client, function and closure.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
(cherry picked from commit bc3634010c)
This commit is contained in:
Chris Wilson 2016-02-12 11:59:52 +00:00 committed by Adam Jackson
parent c06a4b4a24
commit 204e85786f
2 changed files with 30 additions and 0 deletions

View File

@ -620,6 +620,28 @@ ClientSignal(ClientPtr client)
return FALSE;
}
int
ClientSignalAll(ClientPtr client, ClientSleepProcPtr function, void *closure)
{
SleepQueuePtr q;
int count = 0;
for (q = sleepQueue; q; q = q->next) {
if (!(client == CLIENT_SIGNAL_ANY || q->client == client))
continue;
if (!(function == CLIENT_SIGNAL_ANY || q->function == function))
continue;
if (!(closure == CLIENT_SIGNAL_ANY || q->closure == closure))
continue;
count += QueueWorkProc(q->function, q->client, q->closure);
}
return count;
}
void
ClientWakeup(ClientPtr client)
{

View File

@ -255,6 +255,14 @@ extern _X_EXPORT Bool ClientSleep(ClientPtr client,
extern _X_EXPORT Bool ClientSignal(ClientPtr /*client */ );
#endif /* ___CLIENTSIGNAL_DEFINED___ */
#ifndef ___CLIENTSIGNALALL_DEFINED___
#define ___CLIENTSIGNALALL_DEFINED___
#define CLIENT_SIGNAL_ANY ((void *)-1)
extern _X_EXPORT int ClientSignalAll(ClientPtr /*client*/,
ClientSleepProcPtr /*function*/,
void * /*closure*/);
#endif /* ___CLIENTSIGNALALL_DEFINED___ */
extern _X_EXPORT void ClientWakeup(ClientPtr /*client */ );
extern _X_EXPORT Bool ClientIsAsleep(ClientPtr /*client */ );