rwlock(9F)




NAME

     rwlock, rw_init, rw_destroy, rw_enter, rw_exit, rw_tryenter,
     rw_downgrade, rw_tryupgrade, rw_read_locked - readers/writer
     lock functions


SYNOPSIS

     #include <sys/ksynch.h>

     void rw_init(krwlock_t *rwlp, char *name,  krw_type_t  type,
     void *arg);

     void rw_destroy(krwlock_t *rwlp);

     void rw_enter(krwlock_t *rwlp, krw_t enter_type);

     void rw_exit(krwlock_t *rwlp);

     int rw_tryenter(krwlock_t *rwlp, krw_t enter_type);

     void rw_downgrade(krwlock_t *rwlp);

     int rw_tryupgrade(krwlock_t *rwlp);

     int rw_read_locked(krwlock_t *rwlp);


INTERFACE LEVEL

     Solaris DDI specific (Solaris DDI).


PARAMETERS

     rwlp  Pointer to a krwlock_t readers/writer lock.

     name  Descriptive string. This is  obsolete  and  should  be
           NULL. (Non-null strings are legal, but they're a waste
           of kernel memory.)

     type  Type of readers/writer lock.

     arg   Type-specific argument for initialization function.

     enter_type
           One of the values RW_READER or  RW_WRITER,  indicating
           whether  the  lock  is  to be acquired non-exclusively
           (RW_READER) or exclusively (RW_WRITER).


DESCRIPTION

     A multiple-readers, single-writer lock is represented by the
     krwlock_t  data  type.  This  type  of  lock will allow many
     threads to have simultaneous read-only access to an  object.
     Only  one  thread  may have write access at any one time. An
     object which is searched more frequently than it is  changed
     is a good candidate for a readers/writer lock.

     Readers/writer locks are slightly more expensive than  mutex
     locks,  and  the  advantage  of multiple read access may not
     occur if the lock will only be held for a short time.

     rw_init() initializes a readers/writer lock. It is an  error
     to  initialize  a  lock  more  than  once. The type argument
     should be set to RW_DRIVER. If  the  lock  is  used  by  the
     interrupt  handler,  the type-specific argument, arg, should
     be      the      ddi_iblock_cookie       returned       from
     ddi_get_iblock_cookie(9F) or ddi_get_soft_iblock_cookie(9F).
     If the lock is not used by any interrupt handler, the  argu-
     ment should be NULL.

     rw_destroy() releases any resources  that  might  have  been
     allocated  by  rw_init(). It should be called before freeing
     the memory containing the lock. The lock must not be held by
     any thread when it is destroyed.

     rw_enter() acquires the lock, and blocks  if  necessary.  If
     enter_type  is  RW_READER,  the  caller blocks if there is a
     writer or a thread  attempting  to  enter  for  writing.  If
     enter_type  is  RW_WRITER,  the  caller blocks if any thread
     holds the lock.

     NOTE: It is a programming error for any thread to acquire an
     rwlock  it  already  holds,  even  as a reader. Doing so can
     deadlock the system: if thread R  acquires  the  lock  as  a
     reader, then thread W tries to acquire the lock as a writer,
     W will set write-wanted and block. When R tries to  get  its
     second read hold on the lock, it will honor the write-wanted
     bit and block waiting for W; but W cannot run until R  drops
     the lock. Thus threads R and W deadlock.

     rw_exit() releases the lock and may  wake  up  one  or  more
     threads waiting on the lock.

     rw_tryenter() attempts to enter the lock,  like  rw_enter(),
     but  never  blocks.  It returns a non-zero value if the lock
     was successfully entered, and zero otherwise.

     A thread which holds  the  lock  exclusively  (entered  with
     RW_WRITER),  may  call  rw_downgrade() to convert to holding
     the lock non-exclusively (as if entered with RW_READER). One
     or more waiting readers may be unblocked.

     rw_tryupgrade() can be called by a thread  which  holds  the
     lock  for  reading  to  attempt to convert to holding it for
     writing. This upgrade can only succeed if no other thread is
     holding  the  lock and no other thread is blocked waiting to
     acquire the lock for writing.

     rw_read_locked() returns  non-zero  if  the  calling  thread
     holds  the  lock  for read, and zero if the caller holds the
     lock for write. The caller must hold the  lock.  The  system
     may  panic  if  rw_read_locked()  is  called for a lock that
     isn't held by the caller.


RETURN VALUES

     0     rw_tryenter() could not obtain the lock without block-
           ing.

     0     rw_tryupgrade() was  unable  to  perform  the  upgrade
           because  of  other  threads holding or waiting to hold
           the lock.

     0     rw_read_locked() returns 0 if the lock is held by  the
           caller for write.

     non-zero
           from rw_read_locked() if  the  lock  is  held  by  the
           caller for read.

     non-zero
           successful    return     from     rw_tryenter()     or
           rw_tryupgrade().


CONTEXT

     These functions can be called from user  or  interrupt  con-
     text,  except  for  rw_init() and rw_destroy(), which can be
     called from user context only.


SEE ALSO

     condvar(9F),  ddi_add_intr(9F),   ddi_get_iblock_cookie(9F),
     ddi_get_soft_iblock_cookie(9F), mutex(9F), semaphore(9F)

     Writing Device Drivers


NOTES

     Compiling with _LOCKTEST or _MPSTATS defined no  longer  has
     any effect. To gather lock statistics, see lockstat(1M).


Man(1) output converted with man2html