12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
16
/* For use with thr_locks */
18
#ifndef DRIZZLED_THR_LOCK_H
19
#define DRIZZLED_THR_LOCK_H
21
#include <boost/thread/mutex.hpp>
22
#include <boost/thread/shared_mutex.hpp>
23
#include <boost/thread/condition_variable.hpp>
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
/* For use with thr_lock:s */
24
#include <mysys/my_pthread.h>
25
#include <mysys/my_list.h>
26
#include <mysys/definitions.h>
29
extern uint32_t locks_immediate,locks_waited ;
30
extern pthread_mutex_t THR_LOCK_lock;
28
33
extern uint64_t max_write_lock_count;
29
34
extern uint64_t table_lock_wait_timeout;
32
enum thr_lock_type { TL_IGNORE=-1,
37
TL_READ_WITH_SHARED_LOCKS,
38
/* READ, Don't allow concurrent insert */
41
Write lock, but allow other threads to read / write.
42
Used by BDB tables in MySQL to mark that someone is
43
reading/writing to the table.
47
Write lock, but allow other threads to read.
48
Used by ALTER TABLE in MySQL to allow readers
49
to use the table until ALTER TABLE is finished.
53
WRITE lock used by concurrent insert. Will allow
54
READ, if one could use concurrent insert on table.
56
TL_WRITE_CONCURRENT_INSERT,
58
parser only! Late bound low_priority flag.
59
At open_tables() becomes thd->update_lock_default.
62
/* Normal WRITE lock */
64
/* Abort new lock request with an error */
67
enum enum_thr_lock_result { THR_LOCK_SUCCESS= 0, THR_LOCK_ABORTED= 1,
68
THR_LOCK_WAIT_TIMEOUT= 2, THR_LOCK_DEADLOCK= 3 };
35
extern bool thr_lock_inited;
36
extern enum thr_lock_type thr_upgraded_concurrent_insert_lock;
70
39
A description of the thread which owns the lock. The address
71
40
of an instance of this structure is used to uniquely identify the thread.
43
typedef struct st_thr_lock_info
46
my_thread_id thread_id;
77
47
uint32_t n_cursors;
89
51
Lock owner identifier. Globally identifies the lock owner within the
91
53
structure is used as id.
56
typedef struct st_thr_lock_owner
96
58
THR_LOCK_INFO *info;
105
struct THR_LOCK_DATA;
107
struct THR_LOCK_DATA {
62
typedef struct st_thr_lock_data {
108
63
THR_LOCK_OWNER *owner;
109
struct THR_LOCK_DATA *next,**prev;
110
struct THR_LOCK *lock;
111
boost::condition_variable_any *cond;
64
struct st_thr_lock_data *next,**prev;
65
struct st_thr_lock *lock;
112
67
enum thr_lock_type type;
113
68
void *status_param; /* Param to status functions */
125
void init(THR_LOCK *lock,
126
void *status_param= NULL);
71
/* A helper type for transactional locking. */
72
struct st_table_lock_info
74
enum thr_lock_type lock_type;
76
bool lock_transactional;
129
79
struct st_lock_list {
130
80
THR_LOCK_DATA *data,**last;
83
typedef struct st_thr_lock {
85
pthread_mutex_t mutex;
142
86
struct st_lock_list read_wait;
143
87
struct st_lock_list read;
144
88
struct st_lock_list write_wait;
146
90
/* write_lock_count is incremented for write locks and reset on read locks */
147
91
uint32_t write_lock_count;
148
92
uint32_t read_no_write_count;
152
read_no_write_count(0)
159
bool abort_locks_for_thread(uint64_t thread);
179
boost::mutex *native_handle()
93
void (*get_status)(void*, int); /* When one gets a lock */
94
void (*copy_status)(void*,void*);
95
void (*update_status)(void*); /* Before release of write */
96
void (*restore_status)(void*); /* Before release of read */
97
bool (*check_status)(void *);
101
extern LIST *thr_lock_thread_list;
103
bool init_thr_lock(void); /* Must be called once/thread */
187
104
#define thr_lock_owner_init(owner, info_arg) (owner)->info= (info_arg)
105
void thr_lock_info_init(THR_LOCK_INFO *info);
188
106
void thr_lock_init(THR_LOCK *lock);
189
enum enum_thr_lock_result thr_multi_lock(Session &session, THR_LOCK_DATA **data,
107
void thr_lock_delete(THR_LOCK *lock);
108
void thr_lock_data_init(THR_LOCK *lock,THR_LOCK_DATA *data,
110
enum enum_thr_lock_result thr_lock(THR_LOCK_DATA *data,
111
THR_LOCK_OWNER *owner,
112
enum thr_lock_type lock_type);
113
void thr_unlock(THR_LOCK_DATA *data);
114
enum enum_thr_lock_result thr_multi_lock(THR_LOCK_DATA **data,
190
115
uint32_t count, THR_LOCK_OWNER *owner);
191
116
void thr_multi_unlock(THR_LOCK_DATA **data,uint32_t count);
193
} /* namespace drizzled */
195
#endif /* DRIZZLED_THR_LOCK_H */
117
void thr_abort_locks(THR_LOCK *lock, bool upgrade_lock);
118
bool thr_abort_locks_for_thread(THR_LOCK *lock, my_thread_id thread);
119
bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data);
120
void thr_downgrade_write_lock(THR_LOCK_DATA *data,
121
enum thr_lock_type new_lock_type);
122
bool thr_reschedule_write_lock(THR_LOCK_DATA *data);
126
#endif /* _thr_lock_h */