SVR5 and SCO OpenServer 5
bcanput(D3str)
bcanput --
test for flow control in a specified priority band
Synopsis
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/ddi.h>
int bcanput(queue_t *q, uchar_t pri);
Description
Like the
canput(D3str)
function,
bcanput searches through the stream
(starting at q)
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 of priority pri can be enqueued.
If the band is full, bcanput 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.
Arguments
q-
Pointer to the message queue.
pri-
Message priority.
If pri is 0,
the bcanput call is equivalent to
a call to canput.
Return values (DDI)
bcanput returns 1 if a message of priority pri
can be sent in the stream,
or 0 if the priority band is flow-controlled.
If bcanput reaches the end of the stream without finding a queue
with a service routine, then it returns 1.
Return values (ODDI)
bcanput( )
returns 1 if there is room
for the given priority message in the queue,
or 0 if the queue has no more room for messages
of the given priority.
Usage
The driver is responsible for both testing a queue with
bcanput and refraining from placing a message on the queue if
bcanput fails.
It is possible because of race conditions
to test for room using bcanput
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.
In multithreaded DDI drivers,
the q argument may not reference q_next
(for example, an argument of q->q_next
is erroneous in a multithreaded driver
and is disallowed by the DDI).
bcanputnext(q) is provided as
a multiprocessor-safe equivalent
to the common call bcanput(q->q_next),
which is no longer allowed (see
canputnext(D3str)).
Context
Base or Interrupt.
Synchronization constraints
Does not block.
Driver-defined basic locks, read/write locks, and sleep locks
may be held across calls to this function.
For DDI drivers,
the caller cannot have the stream frozen
(see
freezestr(D3str))
when calling this function.
Hardware applicability
All
Version applicability
ddi:
1, 2, 3, 4, 5, 5mp, 6, 6mp, 7, 7mp, 7.1, 7.1mp, 8, 8mp
oddi:
1, 2, 2mp, 3, 3mp, 4, 4mp, 5, 5mp, 6, 6mp
SCO OpenServer 5 ODDI compatibility
References
bcanputnext(D3str),
canput(D3str),
canputnext(D3str),
putbq(D3str),
putnext(D3str)
``Uniplexor (UNI multiplexor)'' in HDK Technical Reference
19 June 2005
© 2005 The SCO Group, Inc. All rights reserved.
OpenServer 6 and UnixWare (SVR5) HDK - June 2005