mt-streams(9F)




NAME

     mt-streams - STREAMS multithreading


SYNOPSIS

     #include <sys/conf.h>


INTERFACE LEVEL

     Solaris DDI specific (Solaris DDI).


DESCRIPTION

     STREAMS drivers configures the degree of  concurrency  using
     the  cb_flag field in the cb_ops structure (see cb_ops(9S)).
     The corresponding field for STREAMS modules is the f_flag in
     the fmodsw structure.

     For the purpose of  restricting  and  controlling  the  con-
     currency in drivers/modules, we define the concepts of inner
     and outer perimeters.  A  driver/module  can  be  configured
     either  to  have  no perimeters, to have only an inner or an
     outer perimeter, or to have both an inner and an outer  per-
     imeter.  Each perimeter acts as a readers-writers lock, that
     is, there can be multiple concurrent  readers  or  a  single
     writer.  Thus,  each  perimeter can be entered in two modes:
     shared (reader) or exclusive (writer). The mode  depends  on
     the  perimeter  configuration  and  can be different for the
     different  STREAMS  entry  points  (  open(9E),   close(9E),
     put(9E), or srv(9E)).

     The concurrency for the different entry  points  is  (unless
     specified  otherwise)  to enter with exclusive access at the
     inner perimeter (if present) and shared access at the  outer
     perimeter (if present).

     The perimeter configuration consists of  flags  that  define
     the  presence and scope of the inner perimeter, the presence
     of the outer perimeter (which can only have one scope),  and
     flags  that modify the default concurrency for the different
     entry points.

     All MT safe modules/drivers specify the D_MP flag.

  Inner Perimeter Flags
     The inner perimeter presence and scope are controlled by the
     mutually exclusive flags:

     D_MTPERQ
           The module/driver has an inner perimeter  around  each
           queue.

     D_MTQPAIR
           The module/driver has an inner perimeter  around  each
           read/write pair of queues.

     D_MTPERMOD
           The module/driver has an inner perimeter that encloses
           all the module's/driver's queues.

     None of the above
           The module/driver has no inner perimeter.

  Outer Perimeter Flags
     The outer perimeter presence is configured using:

     D_MTOUTPERIM
           In addition to any inner perimeter, the  module/driver
           has   an   outer   perimeter  that  encloses  all  the
           module's/driver's queues. This can  be  combined  with
           all the inner perimeter options except D_MTPERMOD.

     Note that acquiring exclusive access at the outer  perimeter
     (that  is,  using qwriter(9F) with the PERIM_OUTER flag) can
     incur significant performance penalties, which grow linearly
     with the number of open instances of the module or driver in
     the system.

     The default concurrency can be modified using:

     D_MTPUTSHARED
           This flag modifies the default behavior  when  put(9E)
           procedure  are  invoked so that the inner perimeter is
           entered shared instead of exclusively.

     D_MTOCEXCL
           This flag modifies the default behavior when  open(9E)
           and  close(9E) procedures are invoked so the the outer
           perimeter is entered exclusively instead of shared.

           Note that drivers and  modules  using  this  flag  can
           cause  significant system performance degradation dur-
           ing stream open or close when many  instances  of  the
           driver  or  module are in use simultaneously. For this
           reason, use of  this  flag  is  discouraged.  Instead,
           since  open(9E)  and  close(9E) both execute with user
           context, developers are encouraged to use  traditional
           synchronization  routines  such  as cv_wait_sig(9F) to
           coordinate with other open instances of the module  or
           driver.

     The module/driver can use qwait(9F) or  qwait_sig()  in  the
     open(9E)  and close(9E) procedures if it needs to wait "out-
     side" the perimeters.

     The module/driver can use qwriter(9F) to upgrade the  access
     at the inner or outer perimeter from shared to exclusive.

     The use and semantics of  qprocson()  and  qprocsoff(9F)  is
     independent of the inner and outer perimeters.


SEE ALSO

     close(9E),  open(9E),   put(9E),   srv(9E),   qprocsoff(9F),
     qprocson(9F), qwait(9F), qwriter(9F), cb_ops(9S)

     STREAMS Programming Guide

     Writing Device Drivers


Man(1) output converted with man2html