static void pthreadpool_tevent_job_orphan(struct pthreadpool_tevent_job *job);
 
+static struct pthreadpool_tevent_job *orphaned_jobs;
+
+void pthreadpool_tevent_cleanup_orphaned_jobs(void)
+{
+       struct pthreadpool_tevent_job *job = NULL;
+       struct pthreadpool_tevent_job *njob = NULL;
+
+       for (job = orphaned_jobs; job != NULL; job = njob) {
+               njob = job->next;
+
+               /*
+                * The job destructor keeps the job alive
+                * (and in the list) or removes it from the list.
+                */
+               TALLOC_FREE(job);
+       }
+}
+
 static int pthreadpool_tevent_job_signal(int jobid,
                                         void (*job_fn)(void *private_data),
                                         void *job_private_data,
        struct pthreadpool_tevent *pool;
        int ret;
 
+       pthreadpool_tevent_cleanup_orphaned_jobs();
+
        pool = talloc_zero(mem_ctx, struct pthreadpool_tevent);
        if (pool == NULL) {
                return ENOMEM;
        }
        pool->pool = NULL;
 
+       pthreadpool_tevent_cleanup_orphaned_jobs();
+
        return 0;
 }
 
                /*
                 * state->im still there means, we need to wait for the
                 * immediate event to be triggered or just leak the memory.
+                *
+                * Move it to the orphaned list, if it's not already there.
                 */
                return -1;
        }
 
+       /*
+        * Finally remove from the orphaned_jobs list
+        * and let talloc destroy us.
+        */
+       DLIST_REMOVE(orphaned_jobs, job);
+
        return 0;
 }
 
         */
        DLIST_REMOVE(job->pool->jobs, job);
 
+       /*
+        * Add it to the list of orphaned jobs,
+        * which may be cleaned up later.
+        *
+        * The destructor removes it from the list
+        * when possible or it denies the free
+        * and keep it in the list.
+        */
+       DLIST_ADD_END(orphaned_jobs, job);
        TALLOC_FREE(job);
 }
 
        struct pthreadpool_tevent_job *job = NULL;
        int ret;
 
+       pthreadpool_tevent_cleanup_orphaned_jobs();
+
        req = tevent_req_create(mem_ctx, &state,
                                struct pthreadpool_tevent_job_state);
        if (req == NULL) {