diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_base.cc | 14 | ||||
-rw-r--r-- | sql/sql_lex.cc | 7 |
2 files changed, 11 insertions, 10 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 3ac6b6ed635..657688499db 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -686,7 +686,6 @@ static TABLE_SHARE void release_table_share(TABLE_SHARE *share) { - bool to_be_deleted= 0; DBUG_ENTER("release_table_share"); DBUG_PRINT("enter", ("share: 0x%lx table: %s.%s ref_count: %u version: %lu", @@ -700,7 +699,7 @@ void release_table_share(TABLE_SHARE *share) { if (share->version != refresh_version || table_def_shutdown_in_progress) - to_be_deleted=1; + my_hash_delete(&table_def_cache, (uchar*) share); else { /* Link share last in used_table_share list */ @@ -712,15 +711,14 @@ void release_table_share(TABLE_SHARE *share) end_of_unused_share.prev= &share->next; share->next= &end_of_unused_share; - to_be_deleted= (table_def_cache.records > table_def_size); + if (table_def_cache.records > table_def_size) + { + /* Delete the least used share to preserve LRU order. */ + my_hash_delete(&table_def_cache, (uchar*) oldest_unused_share); + } } } - if (to_be_deleted) - { - DBUG_PRINT("info", ("Deleting share")); - my_hash_delete(&table_def_cache, (uchar*) share); - } DBUG_VOID_RETURN; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index e87204ffd40..3f3c650d1e8 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -435,8 +435,11 @@ void lex_end(LEX *lex) DBUG_PRINT("enter", ("lex: 0x%lx", (long) lex)); /* release used plugins */ - plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer, - lex->plugins.elements); + if (lex->plugins.elements) /* No function call and no mutex if no plugins. */ + { + plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer, + lex->plugins.elements); + } reset_dynamic(&lex->plugins); DBUG_VOID_RETURN; |