From: Matt H. <mat...@us...> - 2006-06-20 23:02:50
|
On Tue, 2006-06-20 at 15:28 +1000, Peter Williams wrote: > Matt Helsley wrote: > > This introduces a second, per-task, blocking notifier chain. The per-task > > chain offers watchers the chance to register with a specific task nstead of > > all tasks. It also allows the watcher to associate a block of data with the task > > by wrapping the notifier block using containerof(). > > > > Both the global, all-tasks chain and the per-task chain are called from the samefunction. The two types of chains share the same set of notification > > values, however registration functions and the registered notifier blocks must > > be separate. > > > > These notifiers are only safe if notifier blocks are registered with the current > > task while in the context of the current task. This ensures that there are no > > races between registration, unregistration, and notification. > > > > Signed-off-by: Matt Helsley <mat...@us...> > > Cc: Jes Sorensen <je...@sg...> > > Cc: Chandra S. Seetharaman <sek...@us...> > > Cc: Alan Stern <st...@ro...> > [bits deleted] > > > Index: linux-2.6.17-rc6-mm2/kernel/sys.c > > =================================================================== > > --- linux-2.6.17-rc6-mm2.orig/kernel/sys.c > > +++ linux-2.6.17-rc6-mm2/kernel/sys.c > > @@ -450,13 +450,41 @@ int unregister_task_watcher(struct notif > > return blocking_notifier_chain_unregister(&task_watchers, nb); > > } > > > > EXPORT_SYMBOL_GPL(unregister_task_watcher); > > > > +static inline int notify_per_task_watchers(unsigned int val, > > + struct task_struct *task) > > +{ > > + if (get_watch_event(val) != WATCH_TASK_INIT) > > + return raw_notifier_call_chain(&task->notify, val, task); > > + RAW_INIT_NOTIFIER_HEAD(&task->notify); > > + if (task->real_parent) > > + return raw_notifier_call_chain(&task->real_parent->notify, > > + val, task); > > +} > > It's possible for this task to exit without returning a result. Assuming you meant s/task/function/: In the common case this will return a result because most tasks have a real parent. The only exception should be the init task. However, the init task does not "fork" from another task so this function will never get called with WATCH_TASK_INIT and the init task. This means that if one wants to use per-task watchers to associate data and a function call with *every* task, special care will need to be taken to register with the init task. > Peter |