<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Arial, sans-serif" size="2">
<div>Hello, all:</div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">I have a problem want to discus with you<font face="Arial, sans-serif">, Chris someone should be the right person</font>.</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">In llvm-3.1.src/lib/support/unix/Signals.inc, in SignalHandler, we have:</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">static RETSIGTYPE SignalHandler(int Sig) {</font></div>
<div style="padding-left: 18pt; ">  …</div>
<div style="padding-left: 18pt; ">  SignalsMutex.acquire();</div>
<div style="padding-left: 18pt; ">  RemoveFilesToRemove();</div>
<div style="padding-left: 18pt; ">  …</div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">}</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">We can also find following code snippet in the same file:</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">void llvm::sys::RunInterruptHandlers() {</font></div>
<div style="padding-left: 18pt; ">  SignalsMutex.acquire();</div>
<div style="padding-left: 18pt; ">  RemoveFilesToRemove();</div>
<div style="padding-left: 18pt; ">  SignalsMutex.release();</div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">}</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">Similarly, there are SetInterruptFunction, RemoveFileOnSignal, DontRemoveFileOnSignal</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">I am afraid there is deadlock risk if llvm running in multithread mode, the case it is designed to safeguard.</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">Suppose, say when some thread runs into RunInterruptHandlers and acquire the Mutex, then it is preemptied by scheduler, and before it is reselected by scheduler, one signal is dispatched to it.
Then just before the thread resuming at the end of schdeuling, the kernel will invoke SignalHandler to handle the signal, but may deadlock at mutex acquire (as kernel now is conditionally preemptied).</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">Maybe we can trylock (instead of lock) at the beginning of SignalHandler (the locking period should not be a concern as we running in the kernel now), if try fails, redispatch the signal and exits
(try again in next time enter in); otherwise go ahead as usual.</font></div>
<div style="padding-left: 18pt; "> </div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">Best Regards</font></div>
<div style="padding-left: 18pt; "><font face="Arial, sans-serif">Hui Wu</font></div>
<div><font face="Arial, sans-serif"> </font></div>
<div><font face="Arial, sans-serif"> </font></div>
<div> </div>
</font>
</body>
</html>