summaryrefslogtreecommitdiff
path: root/innobase/os
diff options
context:
space:
mode:
authorunknown <monty@donna.mysql.com>2001-02-21 01:11:32 +0200
committerunknown <monty@donna.mysql.com>2001-02-21 01:11:32 +0200
commitc749668eb7147356614f29ad9ce9e7781b23b0bc (patch)
tree38658cc2814def641b51eadf71b72e44ebd61e31 /innobase/os
parenteedae8056df97110bda3d56fe30fa17120e34504 (diff)
downloadmariadb-git-c749668eb7147356614f29ad9ce9e7781b23b0bc.tar.gz
Added max_user_connections
BUILD/compile-pentium-debug: Added --with-innobase Docs/manual.texi: Added documentation for -O max_user_connections innobase/os/os0sync.c: Fix for Heikki
Diffstat (limited to 'innobase/os')
-rw-r--r--innobase/os/os0sync.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/innobase/os/os0sync.c b/innobase/os/os0sync.c
index 1647dd982f3..9f9b2605884 100644
--- a/innobase/os/os0sync.c
+++ b/innobase/os/os0sync.c
@@ -19,14 +19,14 @@ Created 9/6/1995 Heikki Tuuri
#include "ut0mem.h"
/* Type definition for an operating system mutex struct */
-struct os_mutex_struct{
+struct os_mutex_struct{
void* handle; /* OS handle to mutex */
ulint count; /* we use this counter to check
that the same thread does not
recursively lock the mutex: we
do not assume that the OS mutex
supports recursive locking, though
- NT seems to do that */
+ NT seems to do that */
};
/*************************************************************
@@ -44,7 +44,7 @@ os_event_create(
{
#ifdef __WIN__
HANDLE event;
-
+
event = CreateEvent(NULL, /* No security attributes */
TRUE, /* Manual reset */
FALSE, /* Initial state nonsignaled */
@@ -60,9 +60,9 @@ os_event_create(
event = ut_malloc(sizeof(struct os_event_struct));
os_fast_mutex_init(&(event->os_mutex));
- os_fast_mutex_init(&(event->wait_mutex));
+ pthread_cond_init(&(event->cond_var), NULL);
- event->is_set = TRUE;
+ event->is_set = FALSE;
return(event);
#endif
@@ -108,7 +108,7 @@ os_event_set(
/*=========*/
os_event_t event) /* in: event to set */
{
-#ifdef __WIN__
+#ifdef __WIN__
ut_a(event);
ut_a(SetEvent(event));
#else
@@ -119,12 +119,12 @@ os_event_set(
if (event->is_set) {
/* Do nothing */
} else {
- os_fast_mutex_unlock(&(event->wait_mutex));
event->is_set = TRUE;
+ pthread_cond_broadcast(&(event->cond_var));
}
os_fast_mutex_unlock(&(event->os_mutex));
-#endif
+#endif
}
/**************************************************************
@@ -148,7 +148,6 @@ os_event_reset(
if (!event->is_set) {
/* Do nothing */
} else {
- os_fast_mutex_lock(&(event->wait_mutex));
event->is_set = FALSE;
}
@@ -163,7 +162,7 @@ void
os_event_free(
/*==========*/
os_event_t event) /* in: event to free */
-
+
{
#ifdef __WIN__
ut_a(event);
@@ -173,7 +172,7 @@ os_event_free(
ut_a(event);
os_fast_mutex_free(&(event->os_mutex));
- os_fast_mutex_free(&(event->wait_mutex));
+ pthread_cond_destroy(&(event->cond_var));
ut_free(event);
#endif
@@ -197,8 +196,22 @@ os_event_wait(
ut_a(err == WAIT_OBJECT_0);
#else
- os_fast_mutex_lock(&(event->wait_mutex));
- os_fast_mutex_unlock(&(event->wait_mutex));
+ os_fast_mutex_lock(&(event->os_mutex));
+loop:
+ if (event->is_set == TRUE) {
+ os_fast_mutex_unlock(&(event->os_mutex));
+
+ /* Ok, we may return */
+
+ return;
+ }
+
+ pthread_cond_wait(&(event->cond_var), &(event->os_mutex));
+
+ /* Solaris manual said that spurious wakeups may occur: we have
+ to check the 'is_set' variable again */
+
+ goto loop;
#endif
}
@@ -225,7 +238,7 @@ os_event_wait_time(
} else {
err = WaitForSingleObject(event, INFINITE);
}
-
+
if (err == WAIT_OBJECT_0) {
return(0);
@@ -237,7 +250,7 @@ os_event_wait_time(
}
#else
UT_NOT_USED(time);
-
+
/* In Posix this is just an ordinary, infinite wait */
os_event_wait(event);
@@ -277,7 +290,7 @@ os_event_wait_multiple(
return(index - WAIT_OBJECT_0);
#else
ut_a(n == 0);
-
+
/* In Posix we can only wait for a single event */
os_event_wait(*event_array);
@@ -318,7 +331,7 @@ os_mutex_create(
os_mutex_t mutex_str;
UT_NOT_USED(name);
-
+
os_mutex = ut_malloc(sizeof(os_fast_mutex_t));
os_fast_mutex_init(os_mutex);
@@ -329,7 +342,7 @@ os_mutex_create(
mutex_str->count = 0;
return(mutex_str);
-#endif
+#endif
}
/**************************************************************
@@ -385,7 +398,7 @@ os_mutex_exit(
(mutex->count)--;
os_fast_mutex_unlock(mutex->handle);
-#endif
+#endif
}
/**************************************************************
@@ -419,7 +432,7 @@ os_fast_mutex_init(
{
#ifdef __WIN__
ut_a(fast_mutex);
-
+
InitializeCriticalSection((LPCRITICAL_SECTION) fast_mutex);
#else
pthread_mutex_init(fast_mutex, NULL);