home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / thr_rwlock.c < prev    next >
C/C++ Source or Header  |  2000-09-08  |  4KB  |  136 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* Synchronization - readers / writer thread locks */
  19.  
  20. #include "mysys_priv.h"
  21. #include <my_pthread.h>
  22. #if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT)
  23.  
  24. /*
  25.  * Source base from Sun Microsystems SPILT, simplified
  26.  * for MySQL use -- Joshua Chamas
  27.  */
  28.  
  29. /*
  30. *  Multithreaded Demo Source
  31. *
  32. *  Copyright (C) 1995 by Sun Microsystems, Inc.
  33. *  All rights reserved.
  34. *
  35. *  This file is a product of SunSoft, Inc. and is provided for
  36. *  unrestricted use provided that this legend is included on all
  37. *  media and as a part of the software program in whole or part.
  38. *  Users may copy, modify or distribute this file at will.
  39. *
  40. *  THIS FILE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
  41. *  THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  42. *  PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  43. *
  44. *  This file is provided with no support and without any obligation on the
  45. *  part of SunSoft, Inc. to assist in its use, correction, modification or
  46. *  enhancement.
  47. *
  48. *  SUNSOFT AND SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT
  49. *  TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS
  50. *  FILE OR ANY PART THEREOF.
  51. *
  52. *  IN NO EVENT WILL SUNSOFT OR SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY
  53. *  LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL
  54. *  DAMAGES, EVEN IF THEY HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
  55. *  DAMAGES.
  56. *
  57. *  SunSoft, Inc.
  58. *  2550 Garcia Avenue
  59. *  Mountain View, California  94043
  60. */
  61.  
  62. int my_rwlock_init( rw_lock_t *rwp, void *arg __attribute__((unused)))
  63. {
  64.   pthread_condattr_t    cond_attr;
  65.  
  66.   pthread_mutex_init( &rwp->lock, NULL );
  67.   pthread_condattr_init( &cond_attr );
  68.   pthread_cond_init( &rwp->readers, &cond_attr );
  69.   pthread_cond_init( &rwp->writers, &cond_attr );
  70.   pthread_condattr_destroy(&cond_attr);
  71.  
  72.   rwp->state    = 0;
  73.   rwp->waiters    = 0;
  74.  
  75.   return( 0 );
  76. }
  77.  
  78. int my_rwlock_destroy( rw_lock_t *rwp ) {
  79.   pthread_mutex_destroy( &rwp->lock );
  80.   pthread_cond_destroy( &rwp->readers );
  81.   pthread_cond_destroy( &rwp->writers );
  82.  
  83.   return( 0 );
  84. }
  85.  
  86. int my_rw_rdlock( rw_lock_t *rwp ) {
  87.   pthread_mutex_lock(&rwp->lock);
  88.  
  89.   /* active or queued writers        */
  90.   while ( ( rwp->state < 0 ) || rwp->waiters )
  91.     pthread_cond_wait( &rwp->readers, &rwp->lock);
  92.  
  93.   rwp->state++;
  94.   pthread_mutex_unlock(&rwp->lock);
  95.  
  96.   return( 0 );
  97. }
  98.  
  99. int my_rw_wrlock( rw_lock_t *rwp ) {
  100.  
  101.   pthread_mutex_lock(&rwp->lock);
  102.   rwp->waiters++; /* another writer queued        */
  103.  
  104.   while ( rwp->state )
  105.     pthread_cond_wait( &rwp->writers, &rwp->lock);
  106.   rwp->state    = -1;
  107.   --rwp->waiters;
  108.   pthread_mutex_unlock( &rwp->lock );
  109.  
  110.   return( 0 );
  111. }
  112.  
  113. int my_rw_unlock( rw_lock_t *rwp ) {
  114.   DBUG_PRINT("rw_unlock",
  115.          ("state: %d waiters: %d", rwp->state, rwp->waiters));
  116.   pthread_mutex_lock(&rwp->lock);
  117.  
  118.   if ( rwp->state == -1 ) {    /* writer releasing    */
  119.     rwp->state    = 0;        /* mark as available    */
  120.  
  121.     if ( rwp->waiters )        /* writers queued    */
  122.       pthread_cond_signal( &rwp->writers );
  123.     else
  124.       pthread_cond_broadcast( &rwp->readers );
  125.   } else {
  126.     if ( --rwp->state == 0 )    /* no more readers    */
  127.       pthread_cond_signal( &rwp->writers );
  128.   }
  129.  
  130.   pthread_mutex_unlock( &rwp->lock );
  131.  
  132.   return( 0 );
  133. }
  134.  
  135. #endif
  136.