mariadb/innobase/sync/sync0ipm.c
unknown 2662b59306 Added Innobase to source distribution
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
2001-02-17 14:19:19 +02:00

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