Funnel (concurrent computing)

In Computer science, a funnel is a synchronization primitive used in kernel development to protect system resources. First used on Digital UNIX as a way to "funnel" device driver execution onto a single processor, funnels are now used in the Mac OS X kernel to serialize access to the BSD portion of XNU.

A funnel is a mutual exclusion (mutex) mechanism that prevents more than one thread from accessing certain kernel resources at the same time. Each thread acquires a funnel when it enters a synchronized portion of the kernel, and releases it when it leaves. If a thread blocks (sleeps) while holding a funnel, the kernel forces the thread to automatically drop the funnel, thereby allowing other threads to enter the synchronized portion of the kernel.

Because a funnel is automatically dropped when a thread blocks, care must be taken to ensure that synchronized resources are acquired again after any blocking operation. Specifically, acquiring a funnel can be a blocking operation, so if multiple funnels are needed, they must be acquired at once. This limits the utility of funnels because it increases the granularity of locking when multiple funnels need to be held at once.

In Mac OS X
There is only one funnel in OS X 10.4 and higher. Prior to version 10.4, there are two funnels: one protects network resources, and the other protects other BSD kernel resources. A thread was only allowed to hold one funnel at a time, and holding both would cause a kernel panic. As a result of these limitations and the lack of granularity, funnels are being phased out of Mac OS X. For example, the networking funnel has been replaced by finer-grained locking mechanisms.