mariadb/innobase/include/sync0ipm.ic
heikki@donna.mysql.fi 1d7747aa25 ut0mem.c Merge changes in InnoDB-3.23.43b
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
2001-10-10 22:47:08 +03:00

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);
}
}