diff options
author | unknown <monty@mashka.mysql.fi> | 2003-02-04 21:52:14 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2003-02-04 21:52:14 +0200 |
commit | 2ff82a7b152181a49814f5ea125ca8dc6551fbdd (patch) | |
tree | bad5f8dd7f020cc76a4c5e0f19bd130e3fb4a735 /mysys/mf_iocache.c | |
parent | 5a7189cf8c238c991e2b590ee3bb968d13fed63c (diff) | |
parent | dfbd628cd7ec0d3dbe86ee8e4f820d78f10b8ad0 (diff) | |
download | mariadb-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.c | 66 |
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 |