summaryrefslogtreecommitdiff
path: root/mysys/mf_iocache.c
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2003-01-26 12:27:29 +0100
committerunknown <serg@serg.mysql.com>2003-01-26 12:27:29 +0100
commit0412d6522df46e6ad357723d262b2b87130fba2f (patch)
tree1b2083af0f16430866670a21030213a922634adc /mysys/mf_iocache.c
parent3229ddaaac84edf1706fda8cc3c35a4071aa51eb (diff)
downloadmariadb-git-0412d6522df46e6ad357723d262b2b87130fba2f.tar.gz
fixed bug in parallel repair
Diffstat (limited to 'mysys/mf_iocache.c')
-rw-r--r--mysys/mf_iocache.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c
index e9c35175bf9..12e1894eb1a 100644
--- a/mysys/mf_iocache.c
+++ b/mysys/mf_iocache.c
@@ -441,7 +441,7 @@ void init_io_cache_share(IO_CACHE *info, IO_CACHE_SHARE *s, uint num_threads)
DBUG_ASSERT(info->type == READ_CACHE);
pthread_mutex_init(&s->mutex, MY_MUTEX_INIT_FAST);
pthread_cond_init (&s->cond, 0);
- s->count=num_threads-1;
+ s->total=s->count=num_threads-1;
s->active=0; /* to catch errors */
info->share=s;
info->read_function=_my_b_read_r;
@@ -456,32 +456,36 @@ void init_io_cache_share(IO_CACHE *info, IO_CACHE_SHARE *s, uint num_threads)
*/
void remove_io_thread(IO_CACHE *info)
{
- pthread_mutex_lock(&info->share->mutex);
- if (! info->share->count--)
- pthread_cond_signal(&info->share->cond);
- pthread_mutex_unlock(&info->share->mutex);
+ IO_CACHE_SHARE *s=info->share;
+
+ pthread_mutex_lock(&s->mutex);
+ s->total--;
+ if (! s->count--)
+ pthread_cond_signal(&s->cond);
+ pthread_mutex_unlock(&s->mutex);
}
static int lock_io_cache(IO_CACHE *info)
{
- pthread_mutex_lock(&info->share->mutex);
- if (!info->share->count)
- return 1;
+ int total;
+ IO_CACHE_SHARE *s=info->share;
- --(info->share->count);
- pthread_cond_wait(&info->share->cond, &info->share->mutex);
- /*
- count can be -1 here, if one thread was removed (remove_io_thread)
- while all others were locked (lock_io_cache).
- If this is the case, this thread behaves as if count was 0 from the
- very beginning, that is returns 1 and does not unlock the mutex.
- */
- if (++(info->share->count))
+ pthread_mutex_lock(&s->mutex);
+ if (!s->count)
{
- pthread_mutex_unlock(&info->share->mutex);
- return 0;
+ s->count=s->total;
+ return 1;
}
- return 1;
+
+ total=s->total;
+ s->count--;
+ pthread_cond_wait(&s->cond, &s->mutex);
+
+ if (s->total < total)
+ return 1;
+
+ pthread_mutex_unlock(&s->mutex);
+ return 0;
}
static void unlock_io_cache(IO_CACHE *info)
@@ -1132,19 +1136,15 @@ int end_io_cache(IO_CACHE *info)
DBUG_ENTER("end_io_cache");
#ifdef THREAD
+ /*
+ if IO_CACHE is shared between several threads, only one
+ thread needs to call end_io_cache() - just as init_io_cache()
+ should be called only once and then memcopy'ed
+ */
if (info->share)
{
-#ifdef SAFE_MUTEX
- /* simple protection against multi-close: destroying share first */
- if (pthread_cond_destroy (&info->share->cond) |
- pthread_mutex_destroy(&info->share->mutex))
- {
- DBUG_RETURN(1);
- }
-#else
pthread_cond_destroy (&info->share->cond);
pthread_mutex_destroy(&info->share->mutex);
-#endif
info->share=0;
}
#endif