[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [Libevent-users] multithreading problem



This is the valgrind --tool=helgrind output. The first part appears
for every connection to the server:

==5477== Possible data race during write of size 4 at 0x602707c by thread #1
==5477==    at 0x412DFC: bufferevent_incref_and_lock_ (bufferevent.c:653)
==5477==    by 0x412E4F: bufferevent_enable (bufferevent.c:465)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477==  This conflicts with a previous write of size 4 by thread #4
==5477==    at 0x412BCC: bufferevent_decref_and_unlock_ (bufferevent.c:683)
==5477==    by 0x413068: bufferevent_free (bufferevent.c:752)
==5477==    by 0x4042FC: eventcb (in /home/login/test/simple)
==5477==    by 0x4135D3: bufferevent_run_deferred_callbacks_locked
(bufferevent.c:161)
==5477==    by 0x41B818: event_process_active_single_queue (event.c:1476)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x40468A: worker_function (in /home/login/test/simple)
==5477==    by 0x4C29747: mythread_wrapper (hg_intercepts.c:221)
==5477==
==5477== Possible data race during write of size 1 at 0x6027030 by thread #1
==5477==    at 0x412E74: bufferevent_enable (bufferevent.c:471)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477==  This conflicts with a previous read of size 1 by thread #4
==5477==    at 0x40C639: consider_reading (bufferevent_openssl.c:835)
==5477==    by 0x40C6A8: be_openssl_readeventcb (bufferevent_openssl.c:941)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x40468A: worker_function (in /home/login/test/simple)
==5477==    by 0x4C29747: mythread_wrapper (hg_intercepts.c:221)
==5477==    by 0x54288C9: start_thread (pthread_create.c:300)
==5477==
[warn] Epoll ADD(1) on fd 30 failed.  Old events were 0; read change
was 1 (add); write change was 0 (none): Bad file descriptor
==5477== Thread #1's call to pthread_mutex_lock failed
==5477==    with error code 22 (EINVAL: Invalid argument)
==5477==    at 0x4C25CA8: pthread_mutex_lock (hg_intercepts.c:499)
==5477==    by 0x4127E4: bufferevent_get_underlying (bufferevent.c:855)
==5477==    by 0x412BFC: bufferevent_decref_and_unlock_ (bufferevent.c:688)
==5477==    by 0x412E8A: bufferevent_enable (bufferevent.c:476)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477==
==5477== Thread #1 unlocked an invalid lock at 0x60057B0
==5477==    at 0x4C26044: pthread_mutex_unlock (hg_intercepts.c:610)
==5477==    by 0x412819: bufferevent_get_underlying (bufferevent.c:858)
==5477==    by 0x412BFC: bufferevent_decref_and_unlock_ (bufferevent.c:688)
==5477==    by 0x412E8A: bufferevent_enable (bufferevent.c:476)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477==
==5477== Thread #1's call to pthread_mutex_unlock failed
==5477==    with error code 22 (EINVAL: Invalid argument)
==5477==    at 0x4C26139: pthread_mutex_unlock (hg_intercepts.c:619)
==5477==    by 0x412819: bufferevent_get_underlying (bufferevent.c:858)
==5477==    by 0x412BFC: bufferevent_decref_and_unlock_ (bufferevent.c:688)
==5477==    by 0x412E8A: bufferevent_enable (bufferevent.c:476)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477==
==5477==
==5477== Process terminating with default action of signal 11 (SIGSEGV)
==5477==  General Protection Fault
==5477==    at 0x515AC29: sk_free (in /usr/lib/libcrypto.so.0.9.8)
==5477==    by 0x50FE508: ??? (in /usr/lib/libcrypto.so.0.9.8)
==5477==    by 0x4E6719B: SSL_SESSION_free (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E650CC: SSL_free (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x412C11: bufferevent_decref_and_unlock_ (bufferevent.c:692)
==5477==    by 0x412E8A: bufferevent_enable (bufferevent.c:476)
==5477==    by 0x4044A0: acceptcb (in /home/login/test/simple)
==5477==    by 0x421DAD: listener_read_cb (listener.c:412)
==5477==    by 0x41B635: event_process_active_single_queue (event.c:1471)
==5477==    by 0x41BDD6: event_base_loop (event.c:1538)
==5477==    by 0x4049D7: main (in /home/login/test/simple)
==5477== Thread #3: Exiting thread still holds 1 lock
==5477==    at 0x543014D: ??? (syscall-template.S:82)
==5477==    by 0x5153100: ??? (in /usr/lib/libcrypto.so.0.9.8)
==5477==    by 0x51513A8: BIO_read (in /usr/lib/libcrypto.so.0.9.8)
==5477==    by 0x4E5304C: ssl3_read_n (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E53492: ssl3_read_bytes (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E54561: ssl3_get_message (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E5470F: ssl3_get_finished (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E4B0F8: ssl3_accept (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E55074: ssl23_get_client_hello (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x4E55834: ssl23_accept (in /usr/lib/libssl.so.0.9.8)
==5477==    by 0x40AD1B: do_handshake (bufferevent_openssl.c:1006)
==5477==    by 0x40B057: be_openssl_handshakeeventcb
(bufferevent_openssl.c:1059)



2013/1/8 Mark Ellzey <mthomas@xxxxxxxxxx>:
> On Mon, Jan 07, 2013 at 11:55:04PM +0100, Bj?rn K. wrote:
>> That piece of code should distribute the incoming connections over the
>> threads (I want to change that code later to select the thread with
>> the lowest number of handled connections). If I don't use this code
>> and use instead
>> bev = bufferevent_openssl_socket_new(thread_base[0], sock, client_ctx, ...
>> the problem remains.
>>
>> Furthermore I don't think it's a problem of running out of memory. The
>> segmentation fault even occurs when there are just a few connections
>> to the server (once the third connection produced the crash).
>> I tried to get a segmentation fault during a run in valgrind. One time
>> I succeeded and got this:
>>
>> ==310== Invalid read of size 8
>> ==310==    at 0x41327D: bufferevent_incref_and_lock_ (bufferevent.c:626)
>> ==310==    by 0x41403F: bufferevent_enable (bufferevent.c:448)
>> ==310==    by 0x4044A9: acceptcb (in /home/login/test/simple)
>> ==310==    by 0x424325: listener_read_cb (listener.c:412)
>> ==310==    by 0x41D889: event_process_active_single_queue (event.c:1471)
>> ==310==    by 0x41E0E6: event_base_loop (event.c:1538)
>> ==310==    by 0x4049E0: main (in /home/login/test/simple)
>> ==310==  Address 0x62531a0 is 464 bytes inside a block of size 560 free'd
>> ==310==    at 0x4C240FD: free (vg_replace_malloc.c:366)
>> ==310==    by 0x413E2A: bufferevent_decref_and_unlock_ (bufferevent.c:703)
>> ==310==    by 0x41DAD4: event_process_active_single_queue (event.c:1476)
>> ==310==    by 0x41E0E6: event_base_loop (event.c:1538)
>> ==310==    by 0x404693: worker_function (in /home/login/test/simple)
>> ==310==    by 0x54258C9: start_thread (pthread_create.c:300)
>> ==310==
>>
>
> Please try: valgrind --tool=helgrind <your program>
> ***********************************************************************
> To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
> unsubscribe libevent-users    in the body.
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.