diff options
author | unknown <davi@moksha.local> | 2007-10-09 09:48:49 -0300 |
---|---|---|
committer | unknown <davi@moksha.local> | 2007-10-09 09:48:49 -0300 |
commit | 6769a80dfc2d7173f5cfee5809bc66816d6bf2a5 (patch) | |
tree | 1fc4435560ae8e05682ba6111247ef37f61fbc66 /mysys/thr_mutex.c | |
parent | 701ea230add519831031a27c18f2ad665b45d16c (diff) | |
parent | 662fb20f1e03a5d4146a67b5e73c828f5ab476e4 (diff) | |
download | mariadb-git-6769a80dfc2d7173f5cfee5809bc66816d6bf2a5.tar.gz |
Merge moksha.local:/Users/davi/mysql/push/mysql-5.0-runtime
into moksha.local:/Users/davi/mysql/push/mysql-5.1-runtime
include/config-win.h:
Auto merged
include/my_pthread.h:
Auto merged
mysys/thr_mutex.c:
Auto merged
Diffstat (limited to 'mysys/thr_mutex.c')
-rw-r--r-- | mysys/thr_mutex.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/mysys/thr_mutex.c b/mysys/thr_mutex.c index e7a927e562a..49003553f0b 100644 --- a/mysys/thr_mutex.c +++ b/mysys/thr_mutex.c @@ -91,7 +91,7 @@ int safe_mutex_init(safe_mutex_t *mp, } -int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) +int safe_mutex_lock(safe_mutex_t *mp, my_bool try_lock, const char *file, uint line) { int error; if (!mp->file) @@ -104,15 +104,50 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) } pthread_mutex_lock(&mp->global); - if (mp->count > 0 && pthread_equal(pthread_self(),mp->thread)) + if (mp->count > 0) { - fprintf(stderr,"safe_mutex: Trying to lock mutex at %s, line %d, when the mutex was already locked at %s, line %d in thread %s\n", - file,line,mp->file, mp->line, my_thread_name()); - fflush(stderr); - abort(); + if (try_lock) + { + pthread_mutex_unlock(&mp->global); + return EBUSY; + } + else if (pthread_equal(pthread_self(),mp->thread)) + { + fprintf(stderr, + "safe_mutex: Trying to lock mutex at %s, line %d, when the" + " mutex was already locked at %s, line %d in thread %s\n", + file,line,mp->file, mp->line, my_thread_name()); + fflush(stderr); + abort(); + } } pthread_mutex_unlock(&mp->global); - error=pthread_mutex_lock(&mp->mutex); + + /* + If we are imitating trylock(), we need to take special + precautions. + + - We cannot use pthread_mutex_lock() only since another thread can + overtake this thread and take the lock before this thread + causing pthread_mutex_trylock() to hang. In this case, we should + just return EBUSY. Hence, we use pthread_mutex_trylock() to be + able to return immediately. + + - We cannot just use trylock() and continue execution below, since + this would generate an error and abort execution if the thread + was overtaken and trylock() returned EBUSY . In this case, we + instead just return EBUSY, since this is the expected behaviour + of trylock(). + */ + if (try_lock) + { + error= pthread_mutex_trylock(&mp->mutex); + if (error == EBUSY) + return error; + } + else + error= pthread_mutex_lock(&mp->mutex); + if (error || (error=pthread_mutex_lock(&mp->global))) { fprintf(stderr,"Got error %d when trying to lock mutex at %s, line %d\n", |