mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 21:42:35 +01:00
1d7747aa25
ut0ut.c Merge changes in InnoDB-3.23.43b trx0purge.c Merge changes in InnoDB-3.23.43b trx0rec.c Merge changes in InnoDB-3.23.43b trx0trx.c Merge changes in InnoDB-3.23.43b trx0undo.c Merge changes in InnoDB-3.23.43b thr0loc.c Merge changes in InnoDB-3.23.43b sync0arr.c Merge changes in InnoDB-3.23.43b sync0rw.c Merge changes in InnoDB-3.23.43b sync0sync.c Merge changes in InnoDB-3.23.43b srv0srv.c Merge changes in InnoDB-3.23.43b srv0start.c Merge changes in InnoDB-3.23.43b row0ins.c Merge changes in InnoDB-3.23.43b row0mysql.c Merge changes in InnoDB-3.23.43b row0purge.c Merge changes in InnoDB-3.23.43b row0sel.c Merge changes in InnoDB-3.23.43b row0umod.c Merge changes in InnoDB-3.23.43b row0upd.c Merge changes in InnoDB-3.23.43b row0vers.c Merge changes in InnoDB-3.23.43b rem0cmp.c Merge changes in InnoDB-3.23.43b que0que.c Merge changes in InnoDB-3.23.43b pars0opt.c Merge changes in InnoDB-3.23.43b pars0pars.c Merge changes in InnoDB-3.23.43b lexyy.c Merge changes in InnoDB-3.23.43b pars0grm.c Merge changes in InnoDB-3.23.43b page0page.c Merge changes in InnoDB-3.23.43b os0file.c Merge changes in InnoDB-3.23.43b mtr0log.c Merge changes in InnoDB-3.23.43b mem0pool.c Merge changes in InnoDB-3.23.43b log0log.c Merge changes in InnoDB-3.23.43b log0recv.c Merge changes in InnoDB-3.23.43b lock0lock.c Merge changes in InnoDB-3.23.43b ibuf0ibuf.c Merge changes in InnoDB-3.23.43b fil0fil.c Merge changes in InnoDB-3.23.43b dict0crea.c Merge changes in InnoDB-3.23.43b dict0dict.c Merge changes in InnoDB-3.23.43b dict0load.c Merge changes in InnoDB-3.23.43b dict0mem.c Merge changes in InnoDB-3.23.43b data0data.c Merge changes in InnoDB-3.23.43b data0type.c Merge changes in InnoDB-3.23.43b buf0buf.c Merge changes in InnoDB-3.23.43b buf0lru.c Merge changes in InnoDB-3.23.43b btr0btr.c Merge changes in InnoDB-3.23.43b btr0cur.c Merge changes in InnoDB-3.23.43b btr0pcur.c Merge changes in InnoDB-3.23.43b btr0sea.c Merge changes in InnoDB-3.23.43b data0type.ic Merge changes in InnoDB-3.23.43b dict0dict.ic Merge changes in InnoDB-3.23.43b mtr0mtr.ic Merge changes in InnoDB-3.23.43b row0upd.ic Merge changes in InnoDB-3.23.43b sync0ipm.ic Merge changes in InnoDB-3.23.43b sync0rw.ic Merge changes in InnoDB-3.23.43b sync0sync.ic Merge changes in InnoDB-3.23.43b trx0rseg.ic Merge changes in InnoDB-3.23.43b btr0pcur.ic Merge changes in InnoDB-3.23.43b buf0buf.ic Merge changes in InnoDB-3.23.43b data0data.ic Merge changes in InnoDB-3.23.43b row0upd.h Merge changes in InnoDB-3.23.43b srv0srv.h Merge changes in InnoDB-3.23.43b sync0arr.h Merge changes in InnoDB-3.23.43b sync0rw.h Merge changes in InnoDB-3.23.43b sync0sync.h Merge changes in InnoDB-3.23.43b trx0trx.h Merge changes in InnoDB-3.23.43b ut0mem.h Merge changes in InnoDB-3.23.43b data0data.h Merge changes in InnoDB-3.23.43b data0type.h Merge changes in InnoDB-3.23.43b db0err.h Merge changes in InnoDB-3.23.43b dict0crea.h Merge changes in InnoDB-3.23.43b dict0dict.h Merge changes in InnoDB-3.23.43b dict0load.h Merge changes in InnoDB-3.23.43b dict0mem.h Merge changes in InnoDB-3.23.43b dict0types.h Merge changes in InnoDB-3.23.43b fil0fil.h Merge changes in InnoDB-3.23.43b ibuf0ibuf.h Merge changes in InnoDB-3.23.43b lock0lock.h Merge changes in InnoDB-3.23.43b log0log.h Merge changes in InnoDB-3.23.43b mtr0mtr.h Merge changes in InnoDB-3.23.43b rem0cmp.h Merge changes in InnoDB-3.23.43b row0ins.h Merge changes in InnoDB-3.23.43b row0mysql.h Merge changes in InnoDB-3.23.43b btr0cur.h Merge changes in InnoDB-3.23.43b btr0pcur.h Merge changes in InnoDB-3.23.43b btr0sea.h Merge changes in InnoDB-3.23.43b buf0buf.h Merge changes in InnoDB-3.23.43b sql_table.cc Merge changes in InnoDB-3.23.43b sql_db.cc Merge changes in InnoDB-3.23.43b ha_innobase.cc Merge changes in InnoDB-3.23.43b handler.cc Merge changes in InnoDB-3.23.43b ha_innobase.h Merge changes in InnoDB-3.23.43b handler.h Merge changes in InnoDB-3.23.43b
182 lines
3.6 KiB
Text
182 lines
3.6 KiB
Text
/******************************************************
|
|
A fast mutex for interprocess synchronization.
|
|
mutex_t can be used only within single process,
|
|
but ip_mutex_t also between processes.
|
|
|
|
(c) 1995 Innobase Oy
|
|
|
|
Created 9/30/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
/* An extra structure created in the private address space of each process
|
|
which creates or opens the ip mutex. */
|
|
|
|
struct ip_mutex_hdl_struct {
|
|
ip_mutex_t* ip_mutex; /* pointer to ip mutex */
|
|
os_event_t released; /* event which signals that the mutex
|
|
is released; this is obtained from
|
|
create or open of an ip mutex */
|
|
os_mutex_t exclude; /* os mutex obtained when ip mutex is
|
|
created or opened */
|
|
};
|
|
|
|
|
|
UNIV_INLINE
|
|
ulint
|
|
ip_mutex_get_waiters(
|
|
volatile ip_mutex_t* ipm);
|
|
UNIV_INLINE
|
|
void
|
|
ip_mutex_set_waiters(
|
|
volatile ip_mutex_t* ipm,
|
|
ulint flag);
|
|
UNIV_INLINE
|
|
mutex_t*
|
|
ip_mutex_get_mutex(
|
|
ip_mutex_t* ipm);
|
|
|
|
|
|
/******************************************************************
|
|
Accessor functions for ip mutex. */
|
|
UNIV_INLINE
|
|
ulint
|
|
ip_mutex_get_waiters(
|
|
volatile ip_mutex_t* ipm)
|
|
{
|
|
return(ipm->waiters);
|
|
}
|
|
UNIV_INLINE
|
|
void
|
|
ip_mutex_set_waiters(
|
|
volatile ip_mutex_t* ipm,
|
|
ulint flag)
|
|
{
|
|
ipm->waiters = flag;
|
|
}
|
|
UNIV_INLINE
|
|
mutex_t*
|
|
ip_mutex_get_mutex(
|
|
ip_mutex_t* ipm)
|
|
{
|
|
return(&(ipm->mutex));
|
|
}
|
|
|
|
/******************************************************************
|
|
Reserves an ip mutex. */
|
|
UNIV_INLINE
|
|
ulint
|
|
ip_mutex_enter(
|
|
/*===========*/
|
|
/* out: 0 if success,
|
|
SYNC_TIME_EXCEEDED if timeout */
|
|
ip_mutex_hdl_t* ip_mutex_hdl, /* in: pointer to ip mutex handle */
|
|
ulint time) /* in: maximum time to wait, in
|
|
microseconds, or
|
|
SYNC_INFINITE_TIME */
|
|
{
|
|
mutex_t* mutex;
|
|
os_event_t released;
|
|
os_mutex_t exclude;
|
|
ip_mutex_t* ip_mutex;
|
|
ulint loop_count;
|
|
ulint ret;
|
|
|
|
ip_mutex = ip_mutex_hdl->ip_mutex;
|
|
released = ip_mutex_hdl->released;
|
|
exclude = ip_mutex_hdl->exclude;
|
|
|
|
mutex = ip_mutex_get_mutex(ip_mutex);
|
|
|
|
loop_count = 0;
|
|
loop:
|
|
loop_count++;
|
|
ut_ad(loop_count < 15);
|
|
|
|
if (mutex_enter_nowait(mutex, IB__FILE__, __LINE__) == 0) {
|
|
/* Succeeded! */
|
|
|
|
return(0);
|
|
}
|
|
|
|
ip_mutex_system_call_count++;
|
|
|
|
os_event_reset(released);
|
|
|
|
/* Order is important here: FIRST reset event, then set waiters */
|
|
ip_mutex_set_waiters(ip_mutex, 1);
|
|
|
|
if (mutex_enter_nowait(mutex, IB__FILE__, __LINE__) == 0) {
|
|
/* Succeeded! */
|
|
|
|
return(0);
|
|
}
|
|
|
|
if (time == SYNC_INFINITE_TIME) {
|
|
time = OS_SYNC_INFINITE_TIME;
|
|
}
|
|
|
|
/* Suspend to wait for release */
|
|
|
|
ip_mutex_system_call_count++;
|
|
|
|
ret = os_event_wait_time(released, time);
|
|
|
|
ip_mutex_system_call_count++;
|
|
|
|
os_mutex_enter(exclude);
|
|
ip_mutex_system_call_count++;
|
|
os_mutex_exit(exclude);
|
|
|
|
if (ret != 0) {
|
|
ut_a(ret == OS_SYNC_TIME_EXCEEDED);
|
|
|
|
return(SYNC_TIME_EXCEEDED);
|
|
}
|
|
|
|
goto loop;
|
|
}
|
|
|
|
/******************************************************************
|
|
Releases an ip mutex. */
|
|
UNIV_INLINE
|
|
void
|
|
ip_mutex_exit(
|
|
/*==========*/
|
|
ip_mutex_hdl_t* ip_mutex_hdl) /* in: pointer to ip mutex handle */
|
|
{
|
|
mutex_t* mutex;
|
|
os_event_t released;
|
|
os_mutex_t exclude;
|
|
ip_mutex_t* ip_mutex;
|
|
|
|
ip_mutex = ip_mutex_hdl->ip_mutex;
|
|
released = ip_mutex_hdl->released;
|
|
exclude = ip_mutex_hdl->exclude;
|
|
|
|
mutex = ip_mutex_get_mutex(ip_mutex);
|
|
|
|
mutex_exit(mutex);
|
|
|
|
if (ip_mutex_get_waiters(ip_mutex) != 0) {
|
|
|
|
ip_mutex_set_waiters(ip_mutex, 0);
|
|
|
|
/* Order is important here: FIRST reset waiters,
|
|
then set event */
|
|
|
|
ip_mutex_system_call_count++;
|
|
os_mutex_enter(exclude);
|
|
|
|
/* The use of the exclude mutex seems to prevent some
|
|
kind of a convoy problem in the test tsproc.c. We do
|
|
not know why. */
|
|
|
|
ip_mutex_system_call_count++;
|
|
|
|
os_event_set(released);
|
|
|
|
ip_mutex_system_call_count++;
|
|
|
|
os_mutex_exit(exclude);
|
|
}
|
|
}
|