summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <gkodinov/kgeorge@magare.gmz>2007-08-24 18:06:44 +0300
committerunknown <gkodinov/kgeorge@magare.gmz>2007-08-24 18:06:44 +0300
commit06d80f111958ff9bebc9ccb4c58b9ba362484c00 (patch)
tree0138f5d935b18977e1a6b7773e36a4ccfda7cf3a
parent0aefd73b3dda1705270fb756329c32e10e1cc476 (diff)
downloadmariadb-git-06d80f111958ff9bebc9ccb4c58b9ba362484c00.tar.gz
Bug #28284: Test "mysqlslap" reports "out of memory"
When locking a "fast" mutex a static variable cpu_count was used as a flag to initialize itself on the first usage by calling sysconf() and setting non-zero value. This is not thread and optimization safe on some platforms. That's why the global initialization needs to be done once in a designated function. This will also speed up the usage (by a small bit) because it won't have to check if it's initialized on every call. Fixed by moving the fast mutexes initialization out of my_pthread_fastmutex_lock() to fastmutex_global_init() and call it from my_init() include/my_pthread.h: Bug #28284: move the fast mutexes initialization out of my_pthread_fastmutex_lock() to fastmutex_global_init() and call it from my_init() mysys/my_init.c: Bug #28284: move the fast mutexes initialization out of my_pthread_fastmutex_lock() to fastmutex_global_init() and call it from my_init() mysys/thr_mutex.c: Bug #28284: move the fast mutexes initialization out of my_pthread_fastmutex_lock() to fastmutex_global_init() and call it from my_init()
-rw-r--r--include/my_pthread.h1
-rw-r--r--mysys/my_init.c3
-rw-r--r--mysys/thr_mutex.c17
3 files changed, 15 insertions, 6 deletions
diff --git a/include/my_pthread.h b/include/my_pthread.h
index 27b621de925..fad324cb9a7 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -538,6 +538,7 @@ typedef struct st_my_pthread_fastmutex_t
pthread_mutex_t mutex;
uint spins;
} my_pthread_fastmutex_t;
+void fastmutex_global_init(void);
int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp,
const pthread_mutexattr_t *attr);
diff --git a/mysys/my_init.c b/mysys/my_init.c
index 257edb351b4..b2eefe97ee8 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -79,6 +79,9 @@ my_bool my_init(void)
#if defined(THREAD) && defined(SAFE_MUTEX)
safe_mutex_global_init(); /* Must be called early */
#endif
+#if defined(THREAD) && defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX)
+ fastmutex_global_init(); /* Must be called early */
+#endif
netware_init();
#ifdef THREAD
#if defined(HAVE_PTHREAD_INIT)
diff --git a/mysys/thr_mutex.c b/mysys/thr_mutex.c
index 007bae2accf..e7a927e562a 100644
--- a/mysys/thr_mutex.c
+++ b/mysys/thr_mutex.c
@@ -394,15 +394,11 @@ ulong mutex_delay(ulong delayloops)
#define MY_PTHREAD_FASTMUTEX_SPINS 8
#define MY_PTHREAD_FASTMUTEX_DELAY 4
+static int cpu_count= 0;
+
int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp,
const pthread_mutexattr_t *attr)
{
- static int cpu_count= 0;
-#ifdef _SC_NPROCESSORS_CONF
- if (!cpu_count && (attr == MY_MUTEX_INIT_FAST))
- cpu_count= sysconf(_SC_NPROCESSORS_CONF);
-#endif
-
if ((cpu_count > 1) && (attr == MY_MUTEX_INIT_FAST))
mp->spins= MY_PTHREAD_FASTMUTEX_SPINS;
else
@@ -432,4 +428,13 @@ int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp)
}
return pthread_mutex_lock(&mp->mutex);
}
+
+
+void fastmutex_global_init(void)
+{
+#ifdef _SC_NPROCESSORS_CONF
+ cpu_count= sysconf(_SC_NPROCESSORS_CONF);
+#endif
+}
+
#endif /* defined(THREAD) && defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */