mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
Merge kindahl-laptop.dnsalias.net:/home/bk/b30992-mysql-5.0-rpl
into kindahl-laptop.dnsalias.net:/home/bk/b30992-mysql-5.0-runtime include/my_pthread.h: Auto merged
This commit is contained in:
commit
6a5c7fc3b8
3 changed files with 72 additions and 11 deletions
|
|
@ -40,6 +40,31 @@ void win_pthread_init(void)
|
|||
pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST);
|
||||
}
|
||||
|
||||
/**
|
||||
Adapter to @c pthread_mutex_trylock()
|
||||
|
||||
@retval 0 Mutex was acquired
|
||||
@retval EBUSY Mutex was already locked by a thread
|
||||
@retval EINVAL Mutex could not be acquired due to other error
|
||||
*/
|
||||
int
|
||||
win_pthread_mutex_trylock(pthread_mutex_t *mutex)
|
||||
{
|
||||
switch (WaitForSingleObject(mutex, 0)) {
|
||||
case WAIT_TIMEOUT:
|
||||
return EBUSY;
|
||||
|
||||
default:
|
||||
case WAIT_FAILURE:
|
||||
return EINVAL;
|
||||
|
||||
case WAIT_OBJECT_0:
|
||||
case WAIT_ABANDONED: /* The mutex was acquired because it was
|
||||
* abandoned */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** We have tried to use '_beginthreadex' instead of '_beginthread' here
|
||||
** but in this case the program leaks about 512 characters for each
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue