thr_rwlock.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

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