MyWebUniversity.com Home Page
 



OpenSolaris man pages main menu


Driver Entry Points                                       srv(9E)



NAME
     srv - service queued messages

SYNOPSIS
     #include 
     #include 
     #include 
     #include 
     #include 



     intprefixrsrv(queuet *q/* read side */


     intprefixwsrv(queuet *q/* write side */


INTERFACE LEVEL
     Architecture independent level 1 (DI/DKI). This entry point
     is required for STREAMS.

ARGUMENTS
     q    Pointer to the queue(9S) structure.


DESCRIPTION
     The optional service srv() routine  may  be  included  in  a
     STREAMS  module or driver for many possible reasons, includ-
     ing:

         o    to provide greater control over the  flow  of  mes-
              sages in a stream;

         o    to make it possible to defer the processing of some
              messages to avoid depleting system resources;

         o    to combine small  messages  into  larger  ones,  or
              break large messages into smaller ones;

         o    to recover  from  resource  allocation  failure.  A
              module's  or  driver's put(9E) routine can test for
              the availability of a resource, and if  it  is  not
              available, enqueue the message for later processing
              by the srv() routine.


     A message is first passed to a module's or driver's  put(9E)
     routine,  which  may  or may not do some processing. It must
     then either:

         o    Pass the message to the next stream component  with



SunOS 5.11          Last change: 12 Nov 1992                    1






Driver Entry Points                                       srv(9E)



              putnext(9F).


         o    If a srv() routine has been included, it  may  call
              putq(9F) to place the message on the queue.


     Once a message has been enqueued, the STREAMS scheduler con-
     trols  the service routine's invocation. The scheduler calls
     the service routines in FIFO  order.  The  scheduler  cannot
     guarantee  a maximum delay srv() routine to be called except
     that it will happen before any user level process are run.


     Every stream component (stream head, module or  driver)  has
     limit  values  it  uses to implement flow control. Each com-
     ponent should check the tunable high and low water marks  to
     stop  and  restart the flow of message processing. Flow con-
     trol limits apply only between two adjacent components  with
     srv() routines.


     STREAMS  messages can be defined to have up to 256 different
     priorities  to  support  requirements  for multiple bands of
     data flow. At a minimum, a stream must  distinguish  between
     normal  (priority  zero) messages and high priority messages
     (such as MIOCACK). High priority messages are always placed
     at  the  head  of the srv() routine's queue, after any other
     enqueued high priority messages. Next are messages from  all
     included  priority  bands,  which are enqueued in decreasing
     order of priority. Each priority band has its own flow  con-
     trol limits. If a flow controlled band is stopped, all lower
     priority bands are also stopped.


     Once the STREAMS scheduler calls a srv()  routine,  it  must
     process  all  messages on its queue. The following steps are
     general guidelines for processing  messages.  Keep  in  mind
     that  many  of  the details of how a srv() routine should be
     written depend of the implementation, the direction of  flow
     (upstream  or downstream), and whether it is for a module or
     a driver.

         1.   Use getq(9F) to get the next enqueued message.

         2.   If  the  message  is  high  priority,  process  (if
              appropriate)  and pass to the next stream component
              with putnext(9F).

         3.   If it is not a high priority message (and therefore
              subject to flow control), attempt to send it to the
              next stream component with  a  srv()  routine.  Use



SunOS 5.11          Last change: 12 Nov 1992                    2






Driver Entry Points                                       srv(9E)



              bcanputnext(9F) to determine if this can be done.

         4.   If the message cannot be passed, put it back on the
              queue  with putbq(9F). If it can be passed, process
              (if appropriate) and pass with putnext().

RETURN VALUES
     Ignored.

SEE ALSO
     put(9E),    bcanput(9F),    bcanputnext(9F),     canput(9F),
     canputnext(9F),     getq(9F),     nulldev(9F),    putbq(9F),
     putnext(9F), putq(9F), qinit(9S), queue(9S)


     Writing Device Drivers


     STREAMS Programming Guide

WARNINGS
     Each stream module must specify a read and a  write  service
     srv()  routine.  If a service routine is not needed (because
     the put() routine processes all messages),  a  NUL  pointer
     should be placed in module's qinit(9S) structure. Do not use
     nulldev(9F) instead of the NUL pointer. Use   ofnulldev(9F)
     for a srv() routine can result in flow control errors.




























SunOS 5.11          Last change: 12 Nov 1992                    3



OpenSolaris man pages main menu

Contact us      |       About us      |       Term of use      |       Copyright © 2000-2010 MyWebUniversity.com ™