Now when trying to allocate a channel buffer, we can check if we've been
notified of availability via the producer stream connector callback, in
which case we should not consult the queue, or if we're doing a first
allocation and check the queue.
*/
static inline int channel_alloc_buffer(struct channel *chn, struct buffer_wait *wait)
{
- if (b_alloc(&chn->buf, DB_CHANNEL) != NULL)
+ int force_noqueue;
+
+ /* If the producer has been notified of recent availability, we must
+ * not check the queue again.
+ */
+ force_noqueue = !!(chn_prod(chn)->flags & SC_FL_HAVE_BUFF);
+
+ if (b_alloc(&chn->buf, DB_CHANNEL | (force_noqueue ? DB_F_NOQUEUE : 0)) != NULL)
return 1;
b_requeue(DB_CHANNEL, wait);