thr_lock.h
上传用户: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. /* For use with thr_lock:s */
  14. #ifndef _thr_lock_h
  15. #define _thr_lock_h
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. #include <my_pthread.h>
  20. #include <my_list.h>
  21. struct st_thr_lock;
  22. extern ulong locks_immediate,locks_waited ;
  23. enum thr_lock_type { TL_IGNORE=-1,
  24.      TL_UNLOCK, /* UNLOCK ANY LOCK */
  25.      TL_READ, /* Read lock */
  26.      TL_READ_WITH_SHARED_LOCKS,
  27.      /* High prior. than TL_WRITE. Allow concurrent insert */
  28.      TL_READ_HIGH_PRIORITY,
  29.      /* READ, Don't allow concurrent insert */
  30.      TL_READ_NO_INSERT,
  31.      /* 
  32. Write lock, but allow other threads to read / write.
  33. Used by BDB tables in MySQL to mark that someone is
  34. reading/writing to the table.
  35.       */
  36.      TL_WRITE_ALLOW_WRITE,
  37.      /*
  38. Write lock, but allow other threads to read.
  39. Used by ALTER TABLE in MySQL to allow readers
  40. to use the table until ALTER TABLE is finished.
  41.      */
  42.      TL_WRITE_ALLOW_READ,
  43.      /*
  44.        WRITE lock used by concurrent insert. Will allow
  45.        READ, if one could use concurrent insert on table.
  46.      */
  47.      TL_WRITE_CONCURRENT_INSERT,
  48.      /* Write used by INSERT DELAYED.  Allows READ locks */
  49.      TL_WRITE_DELAYED,
  50.      /* WRITE lock that has lower priority than TL_READ */
  51.      TL_WRITE_LOW_PRIORITY,
  52.      /* Normal WRITE lock */
  53.      TL_WRITE,
  54.      /* Abort new lock request with an error */
  55.      TL_WRITE_ONLY};
  56. extern ulong max_write_lock_count;
  57. extern my_bool thr_lock_inited;
  58. extern enum thr_lock_type thr_upgraded_concurrent_insert_lock;
  59. typedef struct st_thr_lock_data {
  60.   pthread_t thread;
  61.   struct st_thr_lock_data *next,**prev;
  62.   struct st_thr_lock *lock;
  63.   pthread_cond_t *cond;
  64.   enum thr_lock_type type;
  65.   ulong thread_id;
  66.   void *status_param; /* Param to status functions */
  67.   void *debug_print_param;
  68. } THR_LOCK_DATA;
  69. struct st_lock_list {
  70.   THR_LOCK_DATA *data,**last;
  71. };
  72. typedef struct st_thr_lock {
  73.   LIST list;
  74.   pthread_mutex_t mutex;
  75.   struct st_lock_list read_wait;
  76.   struct st_lock_list read;
  77.   struct st_lock_list write_wait;
  78.   struct st_lock_list write;
  79. /* write_lock_count is incremented for write locks and reset on read locks */
  80.   ulong write_lock_count;
  81.   uint read_no_write_count;
  82.   void (*get_status)(void*); /* When one gets a lock */
  83.   void (*copy_status)(void*,void*);
  84.   void (*update_status)(void*); /* Before release of write */
  85.   my_bool (*check_status)(void *);
  86. } THR_LOCK;
  87. extern LIST *thr_lock_thread_list;
  88. extern pthread_mutex_t THR_LOCK_lock;
  89. my_bool init_thr_lock(void); /* Must be called once/thread */
  90. void thr_lock_init(THR_LOCK *lock);
  91. void thr_lock_delete(THR_LOCK *lock);
  92. void thr_lock_data_init(THR_LOCK *lock,THR_LOCK_DATA *data,
  93. void *status_param);
  94. int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type);
  95. void thr_unlock(THR_LOCK_DATA *data);
  96. int thr_multi_lock(THR_LOCK_DATA **data,uint count);
  97. void thr_multi_unlock(THR_LOCK_DATA **data,uint count);
  98. void thr_abort_locks(THR_LOCK *lock);
  99. my_bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread);
  100. void thr_print_locks(void); /* For debugging */
  101. my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data);
  102. my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data);
  103. #ifdef __cplusplus
  104. }
  105. #endif
  106. #endif /* _thr_lock_h */