diff --git a/dix/dixutils.c b/dix/dixutils.c index 540023cbd..2983174a1 100644 --- a/dix/dixutils.c +++ b/dix/dixutils.c @@ -507,6 +507,19 @@ InitBlockAndWakeupHandlers(void) WorkQueuePtr workQueue; static WorkQueuePtr *workQueueLast = &workQueue; +void +ClearWorkQueue(void) +{ + WorkQueuePtr q, *p; + + p = &workQueue; + while ((q = *p)) { + *p = q->next; + free(q); + } + workQueueLast = p; +} + void ProcessWorkQueue(void) { diff --git a/dix/main.c b/dix/main.c index 273f30330..16a7d6d39 100644 --- a/dix/main.c +++ b/dix/main.c @@ -340,6 +340,8 @@ dix_main(int argc, char *argv[], char *envp[]) DeleteCallbackManager(); + ClearWorkQueue(); + if (dispatchException & DE_TERMINATE) { CloseWellKnownConnections(); } diff --git a/include/dix.h b/include/dix.h index cf263a1f5..f2516187f 100644 --- a/include/dix.h +++ b/include/dix.h @@ -240,6 +240,8 @@ extern _X_EXPORT void RemoveBlockAndWakeupHandlers(ServerBlockHandlerProcPtr blo extern _X_EXPORT void InitBlockAndWakeupHandlers(void); +extern _X_EXPORT void ClearWorkQueue(void); + extern _X_EXPORT void ProcessWorkQueue(void); extern _X_EXPORT void ProcessWorkQueueZombies(void);