bcanputnext(D3DK) —
.IX \f4bcanputnext\fP(D3DK)
.IX STREAMS message queues
.IX message (STREAMS)
NAME
bcanputnext − test for flow control in a specified priority band
SYNOPSIS
#include <sys/types.h>
#include <sys/stream.h>
int bcanputnext(queue_t ∗q, uchar_t pri);
ARGUMENTS
qPointer to a message queue.
priMessage priority.
DESCRIPTION
bcanputnext searches through the stream (starting at q->q_next) until it finds a queue containing a service routine, or until it reaches the end of the stream. If found, the queue containing the service routine is tested to see if a message in priority band pri can be enqueued. If the band is full, bcanputnext marks the queue to automatically back-enable the caller’s service routine when the amount of data in messages on the queue has reached its low water mark.
If pri is 0, the bcanputnext call is equivalent to a call to canputnext.
It is possible because of race conditions to test for room using bcanputnext and get an indication that there is room for a message, and then have the queue fill up before subsequently enqueuing the message, causing a violation of flow control. This is not a problem since the violation of flow control in this case is bounded.
RETURN VALUE
bcanputnext returns 1 if a message of priority pri can be sent in the stream, or 0 if the priority band is flow-controlled. If bcanputnext reaches the end of the stream without finding a queue with a service routine, then it returns 1.
LEVEL
Base or Interrupt.
NOTES
Does not sleep. The driver writer is responsible for both testing a queue with bcanputnext and refraining from placing a message on the queue if bcanputnext fails. Driver defined basic locks, read/write locks, and sleep locks may be held across calls to this function. The q argument may not reference q_next (for example, an argument of q->q_next is erroneous on a multiprocessor and is disallowed by the DDI/DKI). bcanputnext(q) is provided as a multiprocessor-safe equivalent to the common call bcanput(q->q_next), which is no longer allowed.
SEE ALSO
bcanput(D3DK), canput(D3DK), canputnext(D3DK), putbq(D3DK), putnext(D3DK)
DDI/DKI — STREAMS