diff options
author | kroki/tomash@moonlight.home <> | 2007-01-25 20:10:40 +0300 |
---|---|---|
committer | kroki/tomash@moonlight.home <> | 2007-01-25 20:10:40 +0300 |
commit | f4f51a017aa5a7079cba65d3af311a160e4de876 (patch) | |
tree | 7ead803f3edeb715368444b9f5e0af8cc3809d62 | |
parent | 8b69d169d42615cde36815ffec32eb1af764ccb4 (diff) | |
parent | 68a3e96333fa5a37db6e8e4b6be9fc5fcc5308d4 (diff) | |
download | mariadb-git-f4f51a017aa5a7079cba65d3af311a160e4de876.tar.gz |
Merge moonlight.home:/home/tomash/src/mysql_ab/mysql-5.0
into moonlight.home:/home/tomash/src/mysql_ab/mysql-5.0-bug23527
-rw-r--r-- | sql/sql_cache.cc | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 8e6846fdcd2..d06ac7824fd 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1765,8 +1765,18 @@ void Query_cache::free_cache() { DBUG_ENTER("Query_cache::free_cache"); if (query_cache_size > 0) - { flush_cache(); + /* + There may be two free_cache() calls in progress, because we + release 'structure_guard_mutex' in flush_cache(). When the second + flush_cache() wakes up from the wait on 'COND_flush_finished', the + first call to free_cache() has done its job. So we have to test + 'query_cache_size > 0' the second time to see if the cache wasn't + reset by other thread, or if it was reset and was re-enabled then. + If the cache was reset, then we have nothing to do here. + */ + if (query_cache_size > 0) + { #ifndef DBUG_OFF if (bins[0].free_blocks == 0) { @@ -1808,6 +1818,12 @@ void Query_cache::free_cache() flush_in_progress flag and releases the lock, so other threads may proceed skipping the cache as if it is disabled. Concurrent flushes are performed in turn. + + After flush_cache() call, the cache is flushed, all the freed + memory is accumulated in bin[0], and the 'structure_guard_mutex' + is locked. However, since we could release the mutex during + execution, the rest of the cache state could have been changed, + and should not be relied on. */ void Query_cache::flush_cache() |