summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasil Dimov <vasil.dimov@oracle.com>2011-02-10 17:16:32 +0200
committerVasil Dimov <vasil.dimov@oracle.com>2011-02-10 17:16:32 +0200
commitb5c61ed1f25001e6a967bc2e70273d61bd22bab6 (patch)
tree59fff0437397de4f94a5b75719910df60782f898
parent8aa7e213dc7127bc334087eed5dbcd17e2865a47 (diff)
downloadmariadb-git-b5c61ed1f25001e6a967bc2e70273d61bd22bab6.tar.gz
Fix Bug#59307 Valgrind: uninitialized value in rw_lock_set_writer_id_and_recursion_flag()
by silencing a bogus Valgrind warning: ==4392== Conditional jump or move depends on uninitialised value(s) ==4392== at 0x5A18416: rw_lock_set_writer_id_and_recursion_flag (sync0rw.ic:283) ==4392== by 0x5A1865C: rw_lock_x_lock_low (sync0rw.c:558) ==4392== by 0x5A18481: rw_lock_x_lock_func (sync0rw.c:617) ==4392== by 0x597EEE6: mtr_x_lock_func (mtr0mtr.ic:271) ==4392== by 0x597EBBD: fsp_header_init (fsp0fsp.c:970) ==4392== by 0x5A15E78: innobase_start_or_create_for_mysql (srv0start.c:1508) ==4392== by 0x598B789: innobase_init(void*) (ha_innodb.cc:2282) os_compare_and_swap_thread_id() is defined as __sync_bool_compare_and_swap(). From the GCC doc: `bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...)' ... The "bool" version returns true if the comparison is successful and NEWVAL was written. So it is not possible that the return value is uninitialized, no matter what the arguments to os_compare_and_swap_thread_id() are. Probably Valgrind gets confused by the implementation of the GCC internal function __sync_bool_compare_and_swap().
-rw-r--r--storage/innodb_plugin/include/sync0rw.ic1
1 files changed, 1 insertions, 0 deletions
diff --git a/storage/innodb_plugin/include/sync0rw.ic b/storage/innodb_plugin/include/sync0rw.ic
index 7116f1b7c9b..4110a0a7e0c 100644
--- a/storage/innodb_plugin/include/sync0rw.ic
+++ b/storage/innodb_plugin/include/sync0rw.ic
@@ -280,6 +280,7 @@ rw_lock_set_writer_id_and_recursion_flag(
local_thread = lock->writer_thread;
success = os_compare_and_swap_thread_id(
&lock->writer_thread, local_thread, curr_thread);
+ UNIV_MEM_VALID(&success, sizeof(success));
ut_a(success);
lock->recursive = recursive;