<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 11 (filtered)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"\@Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {font-family:"Arial Unicode MS";
        color:windowtext;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
 /* Page Definitions */
 @page Section1
        {size:595.3pt 841.9pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;
        layout-grid:15.6pt;}
div.Section1
        {page:Section1;}
-->
</style>

</head>

<body lang=ZH-CN link=blue vlink=purple style='text-justify-trim:punctuation'>

<div class=Section1 style='layout-grid:15.6pt'>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>Hi, all,</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>I wrote a small program to
handle thousands of TCP connections and tens of segments each second on each
connection. To do this, I use rtsignal to notify application when socket is
ready for read. The basic idea of this program is like this:</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>After program start,
block the SIGRTMIN and SIGIO in the main thread by:</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigset_t sset;</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigemptyset(&sset);</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigaddset( &sset, SIGRTMIN );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigaddset( &sset, SIGIO );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
pthread_sigmask( SIG_BLOCK, &sset, NULL );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>In one thread, accept
the connection request and set signal on it:</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
…</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
Int fd = accept( ……);</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
flags = fcntl(sock, F_GETFL, 0);</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
fcntl(sock, F_SETFL, flags | O_NONBLOCK | O_ASYNC );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
fcntl(sock, F_SETSIG, SIGRTMIN );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
fcntl(sock, F_SETOWN, sigpid );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
</span></font><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>…</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>And in the work thread,
use sigwaitinfo to get the rtsignal from queue.</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigset_t sset;</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigemptyset( &sset );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
sigaddset( &sset, SIGIO );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
</span></font><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>sigaddset( &sset, </span></font><font
size=1 face="Arial Unicode MS"><span lang=DE style='font-size:9.0pt;font-family:
"Arial Unicode MS"'>SIGRTMIN</span></font><font size=1 face="Arial Unicode MS"><span
lang=EN-US style='font-size:9.0pt;font-family:"Arial Unicode MS"'> );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
while ( true ) {</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>               
int sig = sigwaitinfo( &sset, &siginfo );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>               
if ( sig == </span></font><font size=1 face="Arial Unicode MS"><span lang=DE
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>SIGRTMIN</span></font><font
size=1 face="Arial Unicode MS"><span lang=EN-US style='font-size:9.0pt;
font-family:"Arial Unicode MS"'> ) {</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
if ( siginfo.si_band & POLL_IN ) {</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                               
do_read_pack( siginfo.si_fd );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
}</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
else if ( siginfo.si_band & POLL_HUP ) {</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=PT-BR
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                               
do_disconn( siginfo.si_fd );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=PT-BR
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
</span></font><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>}</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
else if ( siginfo.si_band & POLL_ERR ) {</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=PT-BR
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                               
do_error( siginfo.si_fd );</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=PT-BR
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>                       
}</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=PT-BR
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>               
}</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>       
}</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>This program can work on
most of the platforms, but, in FC2, the work thread is blocked on sigwaitinfo
while the signal is queuing in the kernel. (I can see the number in /proc/sys/kernel/rtsig-nr
is increasing rapidly). At last, the queue overflow, and the sigwaitinfo returns
a SIGIO. </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>My environments is FC2 (2.6.6-1.435smp)
on an old dual P3 Xeon, glibc-2.3.3-27. This program can work in RHEL 3.0 AS (2.4.21-9.ELsmp,
glibc-2.3.2-95.6).</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>Has anybody ever meet
the same problem as me? Or anybody has any ideas?</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>Thank you in advance</span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'> </span></font></p>

<p class=MsoNormal><font size=1 face="Arial Unicode MS"><span lang=EN-US
style='font-size:9.0pt;font-family:"Arial Unicode MS"'>- Jin</span></font></p>

</div>

</body>

</html>