summaryrefslogtreecommitdiff
path: root/mysys/mf_iocache.c
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-02-04 21:52:14 +0200
committerunknown <monty@mashka.mysql.fi>2003-02-04 21:52:14 +0200
commit2ff82a7b152181a49814f5ea125ca8dc6551fbdd (patch)
treebad5f8dd7f020cc76a4c5e0f19bd130e3fb4a735 /mysys/mf_iocache.c
parent5a7189cf8c238c991e2b590ee3bb968d13fed63c (diff)
parentdfbd628cd7ec0d3dbe86ee8e4f820d78f10b8ad0 (diff)
downloadmariadb-git-2ff82a7b152181a49814f5ea125ca8dc6551fbdd.tar.gz
Merge with 4.0.11
BitKeeper/etc/gone: auto-union BitKeeper/etc/logging_ok: auto-union Makefile.am: Auto merged bdb/os/os_handle.c: Auto merged client/mysqladmin.c: Auto merged client/mysqlcheck.c: Auto merged client/mysqldump.c: Auto merged client/mysqltest.c: Auto merged extra/resolveip.c: Auto merged include/Makefile.am: Auto merged include/config-win.h: Auto merged include/my_base.h: Auto merged include/my_global.h: Auto merged include/my_pthread.h: Auto merged include/my_sys.h: Auto merged include/mysql.h: Auto merged innobase/btr/btr0cur.c: Auto merged innobase/os/os0file.c: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/srv/srv0start.c: Auto merged libmysql/Makefile.am: Auto merged libmysql/Makefile.shared: Auto merged libmysql/manager.c: Auto merged libmysqld/libmysqld.c: Auto merged myisam/ft_static.c: Auto merged myisam/mi_check.c: Auto merged myisam/mi_open.c: Auto merged myisam/mi_test3.c: Auto merged myisam/myisamdef.h: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/func_group.result: Auto merged mysql-test/r/func_math.result: Auto merged mysql-test/r/handler.result: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/r/select_found.result: Auto merged mysql-test/r/union.result: Auto merged mysql-test/t/backup.test: Auto merged mysql-test/t/bigint.test: Auto merged mysql-test/t/binary.test: Auto merged mysql-test/t/count_distinct.test: Auto merged mysql-test/t/func_crypt.test: Auto merged mysql-test/t/func_group.test: Auto merged mysql-test/t/grant_cache.test: Auto merged mysql-test/t/handler.test: Auto merged mysql-test/t/query_cache.test: Auto merged mysql-test/t/rpl000015.test: Auto merged mysql-test/t/rpl000017.test: Auto merged mysys/default.c: Auto merged mysys/my_getwd.c: Auto merged mysys/my_init.c: Auto merged sql/Makefile.am: Auto merged sql/des_key_file.cc: Auto merged sql/ha_innodb.cc: Auto merged sql/ha_myisam.cc: Auto merged sql/ha_myisammrg.cc: Auto merged sql/handler.cc: Auto merged sql/hostname.cc: Auto merged sql/item.cc: Auto merged sql/item_create.h: Auto merged sql/item_func.h: Auto merged sql/item_strfunc.cc: Auto merged sql/item_sum.cc: Auto merged sql/item_sum.h: Auto merged sql/lex.h: Auto merged sql/net_serv.cc: Auto merged sql/opt_sum.cc: Auto merged sql/repl_failsafe.cc: Auto merged sql/set_var.cc: Auto merged sql/slave.h: Auto merged sql/sql_acl.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_class.cc: Auto merged sql/sql_insert.cc: Auto merged sql/sql_repl.cc: Auto merged sql/sql_select.h: Auto merged sql/sql_show.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_udf.cc: Auto merged sql-bench/crash-me.sh: Auto merged sql-bench/server-cfg.sh: Auto merged sql-bench/test-insert.sh: Auto merged sql/share/english/errmsg.txt: Auto merged sql/table.cc: Auto merged Docs/manual.texi: Use remote version client/mysql.cc: Merge configure.in: Merge libmysql/libmysql.c: Merge libmysqld/lib_sql.cc: Merge myisam/ft_stopwords.c: Merge myisam/myisamchk.c: Merge mysql-test/r/bigint.result: Merge mysql-test/r/group_by.result: Merge mysql-test/r/rpl000009.result: Merge mysql-test/t/group_by.test: Merge mysql-test/t/rpl000009.test: Merge mysql-test/t/rpl_rotate_logs.test: Merge mysys/Makefile.am: Merge mysys/charset.c: Merge sql/item.h: Merge sql/item_cmpfunc.cc: Merge sql/item_cmpfunc.h: Merge sql/item_create.cc: Merge sql/item_func.cc: Merge sql/item_strfunc.h: Merge sql/log.cc: Merge sql/mysql_priv.h: Merge sql/mysqld.cc: Merge sql/protocol.cc: Merge sql/slave.cc: Merge sql/sql_class.h: Merge sql/sql_db.cc: Merge sql/sql_handler.cc: Merge sql/sql_parse.cc: Merge sql/sql_select.cc: Merge sql/sql_yacc.yy: Merge
Diffstat (limited to 'mysys/mf_iocache.c')
-rw-r--r--mysys/mf_iocache.c66
1 files changed, 33 insertions, 33 deletions
diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c
index e9c35175bf9..0f35ee048bb 100644
--- a/mysys/mf_iocache.c
+++ b/mysys/mf_iocache.c
@@ -441,11 +441,10 @@ 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->active=0; /* to catch errors */
+ s->total=s->count=num_threads-1;
+ s->active=0;
info->share=s;
info->read_function=_my_b_read_r;
- /* Ensure that the code doesn't use pointer to the IO_CACHE object */
info->current_pos= info->current_end= 0;
}
@@ -456,32 +455,37 @@ 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)
+static int lock_io_cache(IO_CACHE *info, my_off_t pos)
{
- 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--;
+ while (!s->active || s->active->pos_in_file < pos)
+ 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)
@@ -532,7 +536,7 @@ int _my_b_read_r(register IO_CACHE *info, byte *Buffer, uint Count)
info->error=(int) read_len;
DBUG_RETURN(1);
}
- if (lock_io_cache(info))
+ if (lock_io_cache(info, pos_in_file))
{
info->share->active=info;
if (info->seek_not_done) /* File touched, do seek */
@@ -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