Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Mar 2013 13:19:19 -0400
From:      Ryan Stone <rysto32@gmail.com>
To:        Sebastian Huber <sebastian.huber@embedded-brains.de>
Cc:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Re: Purpose of kqueue_task?
Message-ID:  <CAFMmRNxbYpavy1XDuPYP--dZ57ifTZqC=PDBS%2Bv%2Bjx1KR0OrMw@mail.gmail.com>
In-Reply-To: <51435063.7050907@embedded-brains.de>
References:  <51435063.7050907@embedded-brains.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Mar 15, 2013 at 12:46 PM, Sebastian Huber <
sebastian.huber@embedded-brains.de> wrote:

> Hello,
>
> I want to port the FreeBSD kqueue implementation to another operating
> system (RTEMS in this case) to improve the Erlang support.
>
> I have difficulties to understand the purpose of the kqueue_task.  This
> function runs asynchronously.  It obtains some locks and wakes up the
> normal kqueue channel if (kq->kq_state & KQ_TASKDRAIN) == KQ_TASKDRAIN.
>  This state is only set in kqueue_close().  So most of the time the
> kqueue_task only obtains some locks, clears a flag (KQ_TASKSCHED) and
> releases the locks?
>

You missed the most important thing that it does: it calls KNOTE_LOCKED to
wake up any waiters sleeping on this event.  I suspect that it had to be
done in a separate task due to lock ordering problems with the kq_global
lock.

The call to wakeup() is used to synchronize with kqueue_close to ensure
that kqueue_close will not free the kqueue while the task is pending.
Otherwise the task could run after kq was freed and crash the system.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFMmRNxbYpavy1XDuPYP--dZ57ifTZqC=PDBS%2Bv%2Bjx1KR0OrMw>