On 08/19, Roland McGrath wrote:
>
> > OK, instead of filling utrace_detached_ops{} we can change start_callback()
> >
> >     - if (want & UTRACE_EVENT(QUIESCE)) {
> >     + if ((want & UTRACE_EVENT(QUIESCE)) || ops == detached_ops) {
>
> If we're going to have a special-case check for &utrace_detached_ops, then
> it can just short-circuit entirely and there is no need for any callbacks
> in utrace_detached_ops.  (Then we might even use NULL or (void *)-1l
> instead of &utrace_detached_ops.)  All it needs to do is:
>
>       report->detaches = true;
>       utrace->reporting = NULL;
>       return NULL;

Yes, I thought about this too, see the changelog.

But probably we need utrace_detached_ops->report_reap() anyway.
->report_death can return UTRACE_DETACH, and after that utrace_report_death()
can skip utrace_reset() and do ->report_reap().

> > And, in particular, I don't understand this code in utrace_get_signal:
> >
> >             } else if (!(task->utrace_flags & UTRACE_EVENT(QUIESCE))) {
> >                     /*
> >                      * We only got here to clear utrace->signal_handler.
> >                      */
> >                     return -1;
> >             }
> >
> > How so? What if we were called because of utrace_control(INTERRUPT)
> > and QUIESCE is not set?
>
> If an engine used UTRACE_INTERRUPT without having first set QUIESCE,
> then it has no rightful expectation of getting any callback.

Hmm. This is certainly new to me. Could you confirm?

If yes, shouldn't we change utrace_control()

        - if (action >= UTRACE_REPORT && action < UTRACE_RESUME &&
        + if (action >= UTRACE_INTERRUPT && action < UTRACE_RESUME &&
              unlikely(!(engine->flags & UTRACE_EVENT(QUIESCE)))) {

then?

I must admit, I do not understand why INTERRUPT needs QUIESCE.
utrace_get_signal() should respect QUIESCE, this is clear. But why
it is needed?

Oleg.

Reply via email to