PUTNEXTCTL(9F) Kernel Functions for Drivers PUTNEXTCTL(9F)
NAME
putnextctl - send a control message to a queue
SYNOPSIS
#include <sys/stream.h>
int putnextctl(
queue_t *q,
int type);
INTERFACE LEVEL
Architecture independent level 1 (DDI/DKI).
PARAMETERS
q Queue to which the message is to be sent.
type Message type (must be control, not data type).
DESCRIPTION
The
putnextctl() function tests the
type argument to make sure a data
type has not been specified, and then attempts to allocate a message
block.
putnextctl() fails if
type is
M_DATA,
M_PROTO, or
M_PCPROTO,
or if a message block cannot be allocated. If successful,
putnextctl() calls the
put(9E) routine of the queue pointed to by
q with the newly allocated and initialized messages.
A call to
putnextctl(q,type) is an atomic equivalent of
putctl(q->q_next,
type). The STREAMS framework provides whatever
mutual exclusion is necessary to insure that dereferencing
q through
its
q_next field and then invoking
putctl(9F) proceeds without
interference from other threads.
The
putnextctl() function should always be used in preference to
putctl(9F)RETURN VALUES
On success,
1 is returned. If
type is a data type, or if a message
block cannot be allocated,
0 is returned.
CONTEXT
The
putnextctl() function can be user, interrupt, or kernel context.
EXAMPLES
The
send_ctl routine is used to pass control messages downstream.
M_BREAK messages are handled with
putnextctl() (line 8).
putnextctl1(9F) (line 13) is used for
M_DELAY messages, so that
parm can be used to specify the length of the delay. In either case, if a
message block cannot be allocated a variable recording the number
of allocation failures is incremented (lines 9, 14). If an invalid
message type is detected,
cmn_err(9F) panics the system (line 18).
1 void
2 send_ctl(queue_t *wrq, uchar_t type, uchar_t parm)
3 {
4 extern int num_alloc_fail;
5
6 switch (type) {
7 case M_BREAK:
8 if (!putnextctl(wrq, M_BREAK))
9 num_alloc_fail++;
10 break;
11
12 case M_DELAY:
13 if (!putnextctl1(wrq, M_DELAY, parm))
14 num_alloc_fail++;
15 break;
16
17 default:
18 cmn_err(CE_PANIC, "send_ctl: bad message type passed");
19 break;
20 }
21 }
SEE ALSO
put(9E),
cmn_err(9F),
datamsg(9F),
putctl(9F),
putnextctl1(9F) Writing Device Drivers STREAMS Programming Guide January 16, 2006 PUTNEXTCTL(9F)