Jay Hoover wrote:

I'm currently investigating a deadlock we're experiencing under high load in Asterisk and I have a question about hup_handler. I don't yet have enough information on this or a good enough repro to write up a report, but it appears to be a deadlock caused by hup_handler calling into ast_module_reload from a thread that is currently inside a system call.

Can anyone enlighten me about why ast_module_reload needs to be called from the SIGHUP handler? I see that this was added quite a few years ago (may '01), but I can't find anything in the code that explains the reasoning behind it.

Hmm. Ignoring the SIGHUP vs. asterisk -rx 'reload' issue for now, looking at hup_handler, it appears to be doing things in exactly the wrong way - ie. actually calling the reload function from within the signal handler itself.

The proper way to do this is to use deferred execution - the SIGHUP handler simply sets a flag, and another thread periodically checks that flag, and runs ast_module_reload(NULL) if the flag is set.

That way, the complicated code gets run in a known thread/mutex/etc. context, and deadlocks should be able to be completely avoided.

Considering Asterisk is a multithreaded program, it should probably be using sigwait(3) instead of signal(2) anyway...

No patch at the moment, sorry ;-)

Cheers,
   Nic.

--
Nic Bellamy,
Head Of Engineering, Vadacom Ltd - http://www.vadacom.co.nz/

_______________________________________________
--Bandwidth and Colocation provided by Easynews.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
  http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to