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

     allocb() 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 struc-
     tures 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  fol-
     lows:

     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  fol-
     lows:

     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.

          Please see the the online man page on docs.sun.com or a
          print copy for the diagram.


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

     allocb() can be called from user or interrupt 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, indicat-
     ing  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)  func-
     tion  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 Guide


NOTES

     The pri argument is no longer used, but is retained for com-
     patibility with existing drivers.


Man(1) output converted with man2html