ALLOCB(9F)              Kernel Functions for Drivers              ALLOCB(9F)
NAME
       allocb - allocate a message block
SYNOPSIS
       #include <sys/stream.h>       
mblk_t *allocb(
size_t size, 
uint_t pri);
INTERFACE LEVEL
       Architecture independent level 1 (DDI/DKI).
DESCRIPTION
       The 
allocb() function tries to allocate a 
STREAMS message block.
       Buffer allocation fails only when the system is out of memory. If no
       buffer is available, the 
bufcall(9F) function can help a module
       recover from an allocation failure.
       A 
STREAMS message block is composed of three structures. The first
       structure is a message block (
mblk_t). See 
msgb(9S). The 
mblk_t       structure points to a data block structure (
dblk_t). See 
datab(9S).
       Together these two structures describe the message type (if
       applicable) and the size and location of the third structure, the
       data buffer.  The data buffer contains the data for this message
       block. The allocated data buffer is at least double-word aligned, so
       it can hold any C data structure.
       The fields in the 
mblk_t structure are initialized as follows:       
b_cont                  set to  
NULL       b_rptr                  points to the beginning of the data buffer       
b_wptr                  points to the beginning of the data buffer       
b_datap                  points to the 
dblk_t structure
       The fields in the 
dblk_t structure are initialized as follows:       
db_base                  points to the first byte of the data buffer       
db_lim                  points to the last byte + 1 of the buffer       
db_type                  set to 
M_DATA       The following figure identifies the data structure members that are
       affected when a message block is allocated.
       Printed copy or docs.sun.com shows a figure that identifies the data
       structure members that are affected when a message block is allocated
PARAMETERS
       size               The number of bytes in the message block.       
pri               Priority of the request (no longer used).
RETURN VALUES
       Upon success, 
allocb() returns a pointer to the allocated message
       block of type 
M_DATA. On failure, 
allocb() returns a 
NULL pointer.
CONTEXT
       The 
allocb() function can be called from user, interrupt, or kernel
       context.
EXAMPLES
       Example 1 allocb() Code Sample
       Given a pointer to a queue (
q) and an error number (
err), the       
send_error() routine sends an  
M_ERROR type message to the stream
       head.
       If a message cannot be allocated, 
NULL is returned, indicating an
       allocation failure (line 8). Otherwise, the message type is set to       
M_ERROR (line 10). Line 11 increments the write pointer (
bp->b_wptr)
       by the size (one byte) of the data in the message.
       A message must be sent up the read side of the stream to arrive at
       the stream head. To determine whether  
q points to a read queue or to
       a write queue, the 
q->q_flag member is tested to see if 
QREADR is set
       (line 13).  If it is not set, 
q points to a write queue, and in line
       14 the 
RD(9F) function is used to find the corresponding read queue.
       In line 15, the 
putnext(9F) function is used to send the message
       upstream, returning 
1 if successful.
         1  send_error(q,err)
         2    queue_t *q;
         3    unsigned char err;
         4  {
         5    mblk_t *bp;
         6
         7    if ((bp = allocb(1, BPRI_HI)) == NULL) /* allocate msg. block */
         8         return(0);
         9
         10    bp->b_datap->db_type = M_ERROR;    /* set msg type to M_ERROR */
         11    *bp->b_wptr++ = err;               /* increment write pointer */
         12
         13    if (!(q->q_flag & QREADR))         /* if not read queue     */
         14         q = RD(q);                    /*    get read queue     */
         15    putnext(q,bp);                     /* send message upstream */
         16    
return(1);
         17  }
SEE ALSO
       RD(9F), 
bufcall(9F), 
esballoc(9F), 
esbbcall(9F), 
putnext(9F),       
testb(9F), 
datab(9S), 
msgb(9S)       Writing Device Drivers       STREAMS Programming GuideNOTES
       The 
pri argument is no longer used, but is retained for compatibility
       with existing drivers.
                              January 16, 2006                    ALLOCB(9F)