I experience some infrequent crashes at stopping an Axis server using
Now it looks to me as if
- axis2_http_server_stop() just closes the listening socket of the
listener thread and sets "stopped" to true
- then, the listener thread (in axis2_http_svr_thread_run) returns
and checks the worker:
if (!svr_thread->worker) ...
- axis2_transport_receiver_free() indirectly calls
axis2_http_server_free() which in turn destroys and frees
I'm not sure yet whether I understand this completely, but it looks as
if then (depending on which thread is faster) the listener accessed
memory now already freed.
In a first approach I moved in my own server prog the
axis2_transport_receiver_free() after starting the HTTP server, i.e.:
if(axis2_transport_receiver_start(srv, env) == AXIS2_FAILURE)
This changes things a bit, now the crash comes later in
But the question is: Is it right that the listener continues at all
after the accept() returns a failure?
I have inserted another test for "stopped" and, if so, break the
listener loop and, so far, it seems to be ok.
socket = (int)axutil_network_handler_svr_socket_accept(env,
Does that ring any bells? Could somebody more experienced please think
about that scenario (while having a look into the code)?
I'll do more testing and, hoping that all keeps working, create a defect