Skip Menu |
 

This queue is for tickets about the DBD-mysql CPAN distribution.

Report information
The Basics
Id: 104343
Status: resolved
Priority: 0/
Queue: DBD-mysql

People
Owner: Nobody in particular
Requestors: ppisar [...] redhat.com
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: 4.031
Fixed in: (no value)



Subject: DBD::MySQL does seem to be thread-safe
Download (untitled) / with headers
text/plain 2.1k
Current DBD::MySQL documentation reads: The multithreading capabilities of DBD::mysql depend completely on the underlying C libraries. The modules are working with handle data only, no global variables are accessed or (to the best of my knowledge) thread unsafe functions are called. Thus DBD::mysql is believed to be completely thread safe, if the C libraries are thread safe and you don't share handles among threads. However, MySQL documentation has stronger requirements <https://dev.mysql.com/doc/refman/5.1/en/c-api-threaded-clients.html>: When you call mysql_init(), MySQL creates a thread-specific variable for the thread that is used by the debug library (among other things). If you call a MySQL function before the thread has called mysql_init(), the thread does not have the necessary thread-specific variables in place and you are likely to end up with a core dump sooner or later. To avoid problems, you must do the following: (1) Call mysql_library_init() before any other MySQL functions. It is not thread-safe, so call it before threads are created, or protect the call with a mutex. (2) Arrange for mysql_thread_init() to be called early in the thread handler before calling any MySQL function. If you call mysql_init(), it will call mysql_thread_init() for you. (3) In the thread, call mysql_thread_end() before calling pthread_exit(). This frees the memory used by MySQL thread-specific variables. The preceding notes regarding mysql_init() also apply to mysql_connect(), which calls mysql_init(). Current DBD::MySQL source does not call mysql_library_init() at all. Also it does not call mysql_thread_end() before exiting a thread. (Actually there is no Perl thread-specific code like START_MY_CXT.) Finally, some MySQL distributions provide thread-safe MySQL client in standalone libmysqlclient_r.so library and DBD::MySQL still prefers the non-threaded libmysqlclient.so version (Makefile.PL should use mysql_config -libs_r). It would be great to make the DBD::MySQL thread safe by following the MySQL requirements or drop the misleading text from the documentation.


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.