Core/DB Layer: Fix helgrind errors on some concurrent access to resultset auto pointers.

Example:
==8753== Possible data race during read of size 8 at 0x2e803e60 by thread #8
==8753==    at 0xDD0FFC: PreparedResultSet::operator[](unsigned int) const (QueryResult.h:83)
==8753==    by 0x131D82D: WorldSession::HandleCharEnum(Trinity::AutoPtr<PreparedResultSet, ACE_Null_Mutex>) (CharacterHandler.cpp:217)
==8753==    by 0x118F8C3: WorldSession::ProcessQueryCallbacks() (WorldSession.cpp:1087)
{..}
==8753==  Address 0x2e803e60 is 0 bytes inside a block of size 16 alloc'd
==8753==    at 0x4C28B75: operator new(unsigned long) (vg_replace_malloc.c:261)
==8753==    by 0x137D515: __gnu_cxx::new_allocator<Field*>::allocate(unsigned long, void const*) (new_allocator.h:92)
==8753==    by 0x137D378: std::_Vector_base<Field*, std::allocator<Field*> >::_M_allocate(unsigned long) (in /home/aokromes/bin/bin/worldserver)
==8753==    by 0x137CEC6: std::vector<Field*, std::allocator<Field*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<Field**, std::vector<Field*, std::allocator<Field*> > >, unsigned long, Field* const&) (vector.tcc:416)
==8753==    by 0x137CB27: std::vector<Field*, std::allocator<Field*> >::insert(__gnu_cxx::__normal_iterator<Field**, std::vector<Field*, std::allocator<Field*> > >, unsigned long, Field* const&) (stl_vector.h:944)
==8753==    by 0x137C964: std::vector<Field*, std::allocator<Field*> >::resize(unsigned long, Field*) (stl_vector.h:632)
==8753==    by 0x137BFCA: PreparedResultSet::PreparedResultSet(st_mysql_stmt*, st_mysql_res*, unsigned long, unsigned int) (QueryResult.cpp:98)
==8753==    by 0x137A12B: MySQLConnection::Query(PreparedStatement*) (MySQLConnection.cpp:493)
==8753==    by 0x137F663: PreparedStatementTask::Execute() (PreparedStatement.cpp:412)

Have a feeling this is a false positive, though. Nevertheless good to get rid of.
This commit is contained in:
Machiavelli
2012-03-27 13:33:02 +03:00
parent 88d81d27cf
commit 1ee7196ec0

View File

@@ -58,7 +58,7 @@ class ResultSet
MYSQL_FIELD* _fields;
};
typedef Trinity::AutoPtr<ResultSet, ACE_Null_Mutex> QueryResult;
typedef Trinity::AutoPtr<ResultSet, ACE_Thread_Mutex> QueryResult;
class PreparedResultSet
{
@@ -103,7 +103,7 @@ class PreparedResultSet
};
typedef Trinity::AutoPtr<PreparedResultSet, ACE_Null_Mutex> PreparedQueryResult;
typedef Trinity::AutoPtr<PreparedResultSet, ACE_Thread_Mutex> PreparedQueryResult;
#endif