mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
2662b59306
Docs/manual.texi: Added Innobase documentation configure.in: Incremented version include/my_base.h: Added option for Innobase myisam/mi_check.c: cleanup mysql-test/t/bdb.test: cleanup mysql-test/t/innobase.test: Extended with new tests from bdb.test mysql-test/t/merge.test: Added test of SHOW create mysys/my_init.c: Fix for UNIXWARE 7 scripts/mysql_install_db.sh: Always write how to start mysqld scripts/safe_mysqld.sh: Fixed type sql/ha_innobase.cc: Update to new version sql/ha_innobase.h: Update to new version sql/handler.h: Added 'update_table_comment()' and 'append_create_info()' sql/sql_delete.cc: Fixes for Innobase sql/sql_select.cc: Fixes for Innobase sql/sql_show.cc: Append create information (for MERGE tables) sql/sql_update.cc: Fixes for Innobase
170 lines
3.9 KiB
C
170 lines
3.9 KiB
C
/******************************************************
|
|
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
|
|
*******************************************************/
|
|
#include "sync0ipm.h"
|
|
#ifdef UNIV_NONINL
|
|
#include "sync0ipm.ic"
|
|
#endif
|
|
|
|
#include "mem0mem.h"
|
|
|
|
/* The performance of the ip mutex in NT depends on how often
|
|
a thread has to suspend itself waiting for the ip mutex
|
|
to become free. The following variable counts system calls
|
|
involved. */
|
|
|
|
ulint ip_mutex_system_call_count = 0;
|
|
|
|
/**********************************************************************
|
|
Creates, or rather, initializes
|
|
an ip mutex object in a specified shared memory location (which must be
|
|
appropriately aligned). The ip mutex is initialized in the reset state.
|
|
NOTE! Explicit destroying of the ip mutex with ip_mutex_free
|
|
is not recommended
|
|
as the mutex resides in shared memory and we cannot make sure that
|
|
no process is currently accessing it. Therefore just use
|
|
ip_mutex_close to free the operating system event and mutex. */
|
|
|
|
ulint
|
|
ip_mutex_create(
|
|
/*============*/
|
|
/* out: 0 if succeed */
|
|
ip_mutex_t* ip_mutex, /* in: pointer to shared memory */
|
|
char* name, /* in: name of the ip mutex */
|
|
ip_mutex_hdl_t** handle) /* out, own: handle to the
|
|
created mutex; handle exists
|
|
in the private address space of
|
|
the calling process */
|
|
{
|
|
mutex_t* mutex;
|
|
char* buf;
|
|
os_event_t released;
|
|
os_mutex_t exclude;
|
|
|
|
ip_mutex_set_waiters(ip_mutex, 0);
|
|
|
|
buf = mem_alloc(strlen(name) + 20);
|
|
|
|
strcpy(buf, name);
|
|
strcpy(buf + strlen(name), "_IB_RELS");
|
|
|
|
released = os_event_create(buf);
|
|
|
|
if (released == NULL) {
|
|
mem_free(buf);
|
|
return(1);
|
|
}
|
|
|
|
strcpy(buf + strlen(name), "_IB_EXCL");
|
|
|
|
exclude = os_mutex_create(buf);
|
|
|
|
if (exclude == NULL) {
|
|
os_event_free(released);
|
|
mem_free(buf);
|
|
return(1);
|
|
}
|
|
|
|
mutex = ip_mutex_get_mutex(ip_mutex);
|
|
|
|
mutex_create(mutex);
|
|
mutex_set_level(mutex, SYNC_NO_ORDER_CHECK);
|
|
|
|
*handle = mem_alloc(sizeof(ip_mutex_hdl_t));
|
|
|
|
(*handle)->ip_mutex = ip_mutex;
|
|
(*handle)->released = released;
|
|
(*handle)->exclude = exclude;
|
|
|
|
mem_free(buf);
|
|
|
|
return(0);
|
|
}
|
|
|
|
/**********************************************************************
|
|
NOTE! Using this function is not recommended. See the note
|
|
on ip_mutex_create. Destroys an ip mutex */
|
|
|
|
void
|
|
ip_mutex_free(
|
|
/*==========*/
|
|
ip_mutex_hdl_t* handle) /* in, own: ip mutex handle */
|
|
{
|
|
mutex_free(ip_mutex_get_mutex(handle->ip_mutex));
|
|
|
|
os_event_free(handle->released);
|
|
os_mutex_free(handle->exclude);
|
|
|
|
mem_free(handle);
|
|
}
|
|
|
|
/**********************************************************************
|
|
Opens an ip mutex object in a specified shared memory location.
|
|
Explicit closing of the ip mutex with ip_mutex_close is necessary to
|
|
free the operating system event and mutex created, and the handle. */
|
|
|
|
ulint
|
|
ip_mutex_open(
|
|
/*==========*/
|
|
/* out: 0 if succeed */
|
|
ip_mutex_t* ip_mutex, /* in: pointer to shared memory */
|
|
char* name, /* in: name of the ip mutex */
|
|
ip_mutex_hdl_t** handle) /* out, own: handle to the
|
|
opened mutex */
|
|
{
|
|
char* buf;
|
|
os_event_t released;
|
|
os_mutex_t exclude;
|
|
|
|
buf = mem_alloc(strlen(name) + 20);
|
|
|
|
strcpy(buf, name);
|
|
strcpy(buf + strlen(name), "_IB_RELS");
|
|
|
|
released = os_event_create(buf);
|
|
|
|
if (released == NULL) {
|
|
mem_free(buf);
|
|
return(1);
|
|
}
|
|
|
|
strcpy(buf + strlen(name), "_IB_EXCL");
|
|
|
|
exclude = os_mutex_create(buf);
|
|
|
|
if (exclude == NULL) {
|
|
os_event_free(released);
|
|
mem_free(buf);
|
|
return(1);
|
|
}
|
|
|
|
*handle = mem_alloc(sizeof(ip_mutex_hdl_t));
|
|
|
|
(*handle)->ip_mutex = ip_mutex;
|
|
(*handle)->released = released;
|
|
(*handle)->exclude = exclude;
|
|
|
|
mem_free(buf);
|
|
|
|
return(0);
|
|
}
|
|
|
|
/**********************************************************************
|
|
Closes an ip mutex. */
|
|
|
|
void
|
|
ip_mutex_close(
|
|
/*===========*/
|
|
ip_mutex_hdl_t* handle) /* in, own: ip mutex handle */
|
|
{
|
|
os_event_free(handle->released);
|
|
os_mutex_free(handle->exclude);
|
|
|
|
mem_free(handle);
|
|
}
|