/* * This function is where XPC's kthreads wait for messages to deliver. */ static void xpc_kthread_waitmsgs(struct xpc_partition *part, struct xpc_channel *ch) { do { /* deliver messages to their intended recipients */ while (xpc_n_of_deliverable_payloads(ch) > 0 && !(ch->flags & XPC_C_DISCONNECTING)) { xpc_deliver_payload(ch); } if (atomic_inc_return(&ch->kthreads_idle) > ch->kthreads_idle_limit) { /* too many idle kthreads on this channel */ atomic_dec(&ch->kthreads_idle); break; } dev_dbg(xpc_chan, "idle kthread calling " "wait_event_interruptible_exclusive()\n"); (void)wait_event_interruptible_exclusive(ch->idle_wq, (xpc_n_of_deliverable_payloads(ch) > 0 || (ch->flags & XPC_C_DISCONNECTING))); atomic_dec(&ch->kthreads_idle); } while (!(ch->flags & XPC_C_DISCONNECTING)); }
static void xpc_kthread_waitmsgs(struct xpc_partition *part, struct xpc_channel *ch) { int (*n_of_deliverable_payloads) (struct xpc_channel *) = xpc_arch_ops.n_of_deliverable_payloads; do { /* */ while (n_of_deliverable_payloads(ch) > 0 && !(ch->flags & XPC_C_DISCONNECTING)) { xpc_deliver_payload(ch); } if (atomic_inc_return(&ch->kthreads_idle) > ch->kthreads_idle_limit) { /* */ atomic_dec(&ch->kthreads_idle); break; } dev_dbg(xpc_chan, "idle kthread calling " "wait_event_interruptible_exclusive()\n"); (void)wait_event_interruptible_exclusive(ch->idle_wq, (n_of_deliverable_payloads(ch) > 0 || (ch->flags & XPC_C_DISCONNECTING))); atomic_dec(&ch->kthreads_idle); } while (!(ch->flags & XPC_C_DISCONNECTING)); }