*/
-/* A work_list is a thread-safe way to enqueue some work to be run on another
- * thread. It consists of a list, a task and a general-purpose argument.
- * A work is appended to the list by atomically adding a list element to the
- * list and waking up the associated task, which is done using work_add(). The
- * caller must be careful about how operations are run as it will definitely
- * happen that the element being enqueued is processed by the other thread
- * before the call returns. Some locking conventions between the caller and the
- * callee might sometimes be necessary. The task is always woken up with reason
- * TASK_WOKEN_OTHER and a context pointing to the work_list entry.
- */
-struct work_list {
- struct mt_list head;
- struct task *task;
- void *arg;
-};
-
#endif /* _HAPROXY_TASK_T_H */
/*
void tasklet_kill(struct tasklet *t);
void __task_wakeup(struct task *t);
void __task_queue(struct task *task, struct eb_root *wq);
-
-struct work_list *work_list_create(int nbthread,
- struct task *(*fct)(struct task *, void *, unsigned int),
- void *arg);
-void work_list_destroy(struct work_list *work, int nbthread);
unsigned int run_tasks_from_lists(unsigned int budgets[]);
/*
return !LIST_ISEMPTY(wake);
}
-/* adds list item <item> to work list <work> and wake up the associated task */
-static inline void work_list_add(struct work_list *work, struct mt_list *item)
-{
- MT_LIST_TRY_APPEND(&work->head, item);
- task_wakeup(work->task, TASK_WOKEN_OTHER);
-}
-
#endif /* _HAPROXY_TASK_H */
/*
activity[tid].long_rq++;
}
-/* create a work list array for <nbthread> threads, using tasks made of
- * function <fct>. The context passed to the function will be the pointer to
- * the thread's work list, which will contain a copy of argument <arg>. The
- * wake up reason will be TASK_WOKEN_OTHER. The pointer to the work_list array
- * is returned on success, otherwise NULL on failure.
- */
-struct work_list *work_list_create(int nbthread,
- struct task *(*fct)(struct task *, void *, unsigned int),
- void *arg)
-{
- struct work_list *wl;
- int i;
-
- wl = calloc(nbthread, sizeof(*wl));
- if (!wl)
- goto fail;
-
- for (i = 0; i < nbthread; i++) {
- MT_LIST_INIT(&wl[i].head);
- wl[i].task = task_new(1UL << i);
- if (!wl[i].task)
- goto fail;
- wl[i].task->process = fct;
- wl[i].task->context = &wl[i];
- wl[i].arg = arg;
- }
- return wl;
-
- fail:
- work_list_destroy(wl, nbthread);
- return NULL;
-}
-
-/* destroy work list <work> */
-void work_list_destroy(struct work_list *work, int nbthread)
-{
- int t;
-
- if (!work)
- return;
- for (t = 0; t < nbthread; t++)
- task_destroy(work[t].task);
- free(work);
-}
-
/*
* Delete every tasks before running the master polling loop
*/