Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
84f733af
Commit
84f733af
authored
Nov 30, 2008
by
Vadim Tkachenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rw_locks applied
parent
d6c7789c
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
555 additions
and
93 deletions
+555
-93
include/sync0rw.h
include/sync0rw.h
+32
-13
include/sync0rw.ic
include/sync0rw.ic
+247
-24
sync/sync0arr.c
sync/sync0arr.c
+27
-21
sync/sync0rw.c
sync/sync0rw.c
+249
-35
No files found.
include/sync0rw.h
View file @
84f733af
...
...
@@ -328,7 +328,17 @@ rw_lock_get_x_lock_count(
Accessor functions for rw lock. */
UNIV_INLINE
ulint
rw_lock_get_waiters
(
rw_lock_get_s_waiters
(
/*==================*/
rw_lock_t
*
lock
);
UNIV_INLINE
ulint
rw_lock_get_x_waiters
(
/*==================*/
rw_lock_t
*
lock
);
UNIV_INLINE
ulint
rw_lock_get_wx_waiters
(
/*================*/
rw_lock_t
*
lock
);
UNIV_INLINE
...
...
@@ -412,6 +422,11 @@ rw_lock_debug_print(
rw_lock_debug_t
*
info
);
/* in: debug struct */
#endif
/* UNIV_SYNC_DEBUG */
#ifdef HAVE_GCC_ATOMIC_BUILTINS
/* This value means NOT_LOCKED */
#define RW_LOCK_BIAS 0x00100000
#endif
/* NOTE! The structure appears here only for the compiler to know its size.
Do not use its fields directly! The structure used in the spin lock
implementation of a read-write lock. Several threads may have a shared lock
...
...
@@ -421,9 +436,9 @@ blocked by readers, a writer may queue for the lock by setting the writer
field. Then no new readers are allowed in. */
struct
rw_lock_struct
{
os_event_t
event
;
/* Used by sync0arr.c for thread queueing */
#ifdef __WIN__
/* Used by sync0arr.c for thread queueing */
os_event_t
s_event
;
/* Used for s_lock */
os_event_t
x_event
;
/* Used for x_lock */
os_event_t
wait_ex_event
;
/* This windows specific event is
used by the thread which has set the
lock state to RW_LOCK_WAIT_EX. The
...
...
@@ -431,30 +446,34 @@ struct rw_lock_struct {
thread will be the next one to proceed
once the current the event gets
signalled. See LEMMA 2 in sync0sync.c */
#ifdef HAVE_GCC_ATOMIC_BUILTINS
volatile
lint
lock_word
;
/* Used by using atomic builtin */
#endif
ulint
reader_count
;
/* Number of readers who have locked this
volatile
ulint
reader_count
;
/* Number of readers who have locked this
lock in the shared mode */
ulint
writer
;
/* This field is set to RW_LOCK_EX if there
volatile
ulint
writer
;
/* This field is set to RW_LOCK_EX if there
is a writer owning the lock (in exclusive
mode), RW_LOCK_WAIT_EX if a writer is
queueing for the lock, and
RW_LOCK_NOT_LOCKED, otherwise. */
os_thread_id_t
writer_thread
;
volatile
os_thread_id_t
writer_thread
;
/* Thread id of a possible writer thread */
ulint
writer_count
;
/* Number of times the same thread has
volatile
ulint
writer_count
;
/* Number of times the same thread has
recursively locked the lock in the exclusive
mode */
#ifndef HAVE_GCC_ATOMIC_BUILTINS
mutex_t
mutex
;
/* The mutex protecting rw_lock_struct */
#endif
ulint
pass
;
/* Default value 0. This is set to some
value != 0 given by the caller of an x-lock
operation, if the x-lock is to be passed to
another thread to unlock (which happens in
asynchronous i/o). */
ulint
waiters
;
/* This ulint is set to 1 if there are
waiters (readers or writers) in the global
wait array, waiting for this rw_lock.
Otherwise, == 0. */
volatile
ulint
s_waiters
;
/* 1: there are waiters (s_lock) */
volatile
ulint
x_waiters
;
/* 1: there are waiters (x_lock) */
volatile
ulint
wait_ex_waiters
;
/* 1: there are waiters (wait_ex) */
UT_LIST_NODE_T
(
rw_lock_t
)
list
;
/* All allocated rw locks are put into a
list */
...
...
@@ -467,7 +486,7 @@ struct rw_lock_struct {
const
char
*
cfile_name
;
/* File name where lock created */
const
char
*
last_s_file_name
;
/* File name where last s-locked */
const
char
*
last_x_file_name
;
/* File name where last x-locked */
ibool
writer_is_wait_ex
;
volatile
ibool
writer_is_wait_ex
;
/* This is TRUE if the writer field is
RW_LOCK_WAIT_EX; this field is located far
from the memory update hotspot fields which
...
...
include/sync0rw.ic
View file @
84f733af
This diff is collapsed.
Click to expand it.
sync/sync0arr.c
View file @
84f733af
...
...
@@ -307,13 +307,13 @@ sync_cell_event_reset(
{
if
(
type
==
SYNC_MUTEX
)
{
return
(
os_event_reset
(((
mutex_t
*
)
object
)
->
event
));
#ifdef __WIN__
}
else
if
(
type
==
RW_LOCK_WAIT_EX
)
{
return
(
os_event_reset
(
((
rw_lock_t
*
)
object
)
->
wait_ex_event
));
#endif
}
else
{
return
(
os_event_reset
(((
rw_lock_t
*
)
object
)
->
event
));
}
else
if
(
type
==
RW_LOCK_SHARED
)
{
return
(
os_event_reset
(((
rw_lock_t
*
)
object
)
->
s_event
));
}
else
{
/* RW_LOCK_EX */
return
(
os_event_reset
(((
rw_lock_t
*
)
object
)
->
x_event
));
}
}
...
...
@@ -413,15 +413,12 @@ sync_array_wait_event(
if
(
cell
->
request_type
==
SYNC_MUTEX
)
{
event
=
((
mutex_t
*
)
cell
->
wait_object
)
->
event
;
#ifdef __WIN__
/* On windows if the thread about to wait is the one which
has set the state of the rw_lock to RW_LOCK_WAIT_EX, then
it waits on a special event i.e.: wait_ex_event. */
}
else
if
(
cell
->
request_type
==
RW_LOCK_WAIT_EX
)
{
event
=
((
rw_lock_t
*
)
cell
->
wait_object
)
->
wait_ex_event
;
#endif
}
else
if
(
cell
->
request_type
==
RW_LOCK_SHARED
)
{
event
=
((
rw_lock_t
*
)
cell
->
wait_object
)
->
s_event
;
}
else
{
event
=
((
rw_lock_t
*
)
cell
->
wait_object
)
->
event
;
event
=
((
rw_lock_t
*
)
cell
->
wait_object
)
->
x_
event
;
}
cell
->
waiting
=
TRUE
;
...
...
@@ -462,6 +459,7 @@ sync_array_cell_print(
mutex_t
*
mutex
;
rw_lock_t
*
rwlock
;
ulint
type
;
ulint
writer
;
type
=
cell
->
request_type
;
...
...
@@ -491,12 +489,10 @@ sync_array_cell_print(
(
ulong
)
mutex
->
waiters
);
}
else
if
(
type
==
RW_LOCK_EX
#ifdef __WIN__
||
type
==
RW_LOCK_WAIT_EX
#endif
||
type
==
RW_LOCK_SHARED
)
{
fputs
(
type
==
RW_LOCK_
EX
?
"X-lock on"
:
"S
-lock on"
,
file
);
fputs
(
type
==
RW_LOCK_
SHARED
?
"S-lock on"
:
"X
-lock on"
,
file
);
rwlock
=
cell
->
old_wait_rw_lock
;
...
...
@@ -504,22 +500,24 @@ sync_array_cell_print(
" RW-latch at %p created in file %s line %lu
\n
"
,
(
void
*
)
rwlock
,
rwlock
->
cfile_name
,
(
ulong
)
rwlock
->
cline
);
if
(
rwlock
->
writer
!=
RW_LOCK_NOT_LOCKED
)
{
writer
=
rw_lock_get_writer
(
rwlock
);
if
(
writer
!=
RW_LOCK_NOT_LOCKED
)
{
fprintf
(
file
,
"a writer (thread id %lu) has"
" reserved it in mode %s"
,
(
ulong
)
os_thread_pf
(
rwlock
->
writer_thread
),
rwlock
->
writer
==
RW_LOCK_EX
writer
==
RW_LOCK_EX
?
" exclusive
\n
"
:
" wait exclusive
\n
"
);
}
fprintf
(
file
,
"number of readers %lu, waiters flag %lu
\n
"
"number of readers %lu,
s_waiters flag %lu, x_
waiters flag %lu
\n
"
"Last time read locked in file %s line %lu
\n
"
"Last time write locked in file %s line %lu
\n
"
,
(
ulong
)
rwlock
->
reader_count
,
(
ulong
)
rwlock
->
waiters
,
(
ulong
)
rwlock
->
s_waiters
,
(
ulong
)
(
rwlock
->
x_waiters
||
rwlock
->
wait_ex_waiters
),
rwlock
->
last_s_file_name
,
(
ulong
)
rwlock
->
last_s_line
,
rwlock
->
last_x_file_name
,
...
...
@@ -844,11 +842,15 @@ sync_array_object_signalled(
/*========================*/
sync_array_t
*
arr
)
/* in: wait array */
{
#ifdef HAVE_GCC_ATOMIC_BUILTINS
__sync_fetch_and_add
(
&
(
arr
->
sg_count
),
1
);
#else
sync_array_enter
(
arr
);
arr
->
sg_count
++
;
sync_array_exit
(
arr
);
#endif
}
/**************************************************************************
...
...
@@ -889,19 +891,23 @@ sync_arr_wake_threads_if_sema_free(void)
mutex
=
cell
->
wait_object
;
os_event_set
(
mutex
->
event
);
#ifdef __WIN__
}
else
if
(
cell
->
request_type
==
RW_LOCK_WAIT_EX
)
{
rw_lock_t
*
lock
;
lock
=
cell
->
wait_object
;
os_event_set
(
lock
->
wait_ex_event
);
#endif
}
else
{
}
else
if
(
cell
->
request_type
==
RW_LOCK_SHARED
)
{
rw_lock_t
*
lock
;
lock
=
cell
->
wait_object
;
os_event_set
(
lock
->
event
);
os_event_set
(
lock
->
s_event
);
}
else
{
rw_lock_t
*
lock
;
lock
=
cell
->
wait_object
;
os_event_set
(
lock
->
x_event
);
}
}
}
...
...
sync/sync0rw.c
View file @
84f733af
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment