Re: Clearsilver in a multi hreaded environment
Brandon Long <[email protected]> Sun, 28 Nov 2010 17:09:30 -0800
| Newsgroups | gmane.text.clearsilver.general |
|---|---|
| Message-ID | <[email protected]> |
--feq3sPuNZHAX6XSu2qChZRkEcCt78W4Xa5MBv95 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Most of ClearSilver is thread-compatible, assuming its compiled against threaded libraries and finds pthread during configure. Which is to say, that it is safe to create/manipulate clearsilver data structures from individual threads, and you only need to add locking if you intend to access the same data from multiple threads at the same time. Unfortunately, the initialization methods in cgi (cgi_init, cgi_parse) are not thread-compatible since they rely on the cgi_wrappers. CGI itself isn't thread-safe, since it relies on environment variables, and currently there's no concept of non-global access to the initial CGI state. Also, cgi_display isn't thread safe since it uses global output. The fix for that is to make every cgiwrap function take a CGIWRAPPER structure that's currently private to cgiwrap.c. That would mean changing the API, however, so I haven't gotten around to it. The change itself is pretty trivial to make, so it would be pretty easy to make the change for your own code. This also assumes there's some thread-safe mechanism for accessing FCGI as well. Alternatively, you can also have a thread safe dispatch which uses a lock to ensure only one thread is doing initialization at once, and only one thread is doing display at once, but it would probably be better just to patch the code. The Java wrapper is thread safe since it only uses the cgi helpers and not the CGI code. Most of the wrappers don't use the CGI code. The python wrapper is the exception, since it patches the CGI code into the python run-time to use the Python sys.stdin/stdout and os.environ. Brandon On Sun, Nov 28, 2010 at 1:47 PM, Ogla Sungutay <[email protected]> wro= te: > Hi Brandon, > > I will use the Clearsilver C API in several worker threads in my web appl= ication and wanted to get some tips (or dos and donts) from you. > > My setup is using nginx and FastCGI. After the request is accepted, it is= passed to one of the worker threads through a queue. I'm also planning to = use Clearsilver's CGI methods to acquire the query parameters as an HDF. > > Thanks! > > > > > ------------------------------------ > > Yahoo! Groups Links > > > > --feq3sPuNZHAX6XSu2qChZRkEcCt78W4Xa5MBv95 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm= l4/strict.dtd"> <html> <head> </head> <body style=3D"background-color: #fff;"> <span style=3D"display:none"> </span> <!--~-|**|PrettyHtmlStartT|**|-~--> <div id=3D"ygrp-mlmsg" style=3D"position:relative;"> <div id=3D"ygrp-msg" style=3D"z-index: 1;"> <!--~-|**|PrettyHtmlEndT|**|-~--> <div id=3D"ygrp-text" > =20=20=20=20=20=20 =20=20=20=20=20=20 <p>Most of ClearSilver is thread-compatible, assuming its compiled<br= > against threaded libraries and finds pthread during configure.<br> <br> Which is to say, that it is safe to create/manipulate clearsilver data<br> structures from individual threads, and you only need to add locking<br> if you intend to access the same data from multiple threads at the<br> same time.<br> <br> Unfortunately, the initialization methods in cgi (cgi_init, cgi_parse)<br> are not thread-compatible since they rely on the cgi_wrappers. CGI<br> itself isn't thread-safe, since it relies on environment variables,<br> and currently there's no concept of non-global access to the initial<br> CGI state. Also, cgi_display isn't thread safe since it uses global<br> output.<br> <br> The fix for that is to make every cgiwrap function take a CGIWRAPPER<br> structure that's currently private to cgiwrap.c. That would mean<br> changing the API, however, so I haven't gotten around to it. The<br> change itself is pretty trivial to make, so it would be pretty easy to<br> make the change for your own code. This also assumes there's some<br> thread-safe mechanism for accessing FCGI as well.<br> <br> Alternatively, you can also have a thread safe dispatch which uses a<br> lock to ensure only one thread is doing initialization at once, and<br> only one thread is doing display at once, but it would probably be<br> better just to patch the code.<br> <br> The Java wrapper is thread safe since it only uses the cgi helpers and<br> not the CGI code. Most of the wrappers don't use the CGI code. The<br> python wrapper is the exception, since it patches the CGI code into<br> the python run-time to use the Python sys.stdin/stdout and os.environ.<br> <br> Brandon<br> <br> On Sun, Nov 28, 2010 at 1:47 PM, Ogla Sungutay <<a href=3D"mailto:velisu= ngutay%40gmail.com">[email protected]</a>> wrote:<br> > Hi Brandon,<br> ><br> > I will use the Clearsilver C API in several worker threads in my web a= pplication and wanted to get some tips (or dos and donts) from you.<br> ><br> > My setup is using nginx and FastCGI. After the request is accepted, it= is passed to one of the worker threads through a queue. I'm also planning = to use Clearsilver's CGI methods to acquire the query parameters as an HDF.= <br> ><br> > Thanks!<br> ><br> ><br> ><br> ><br> > ------------------------------------<br> ><br> > Yahoo! Groups Links<br> ><br> ><br> ><br> ><br> </p> </div> =20=20=20=20=20 <!--~-|**|PrettyHtmlStart|**|-~--> <div style=3D"color: #fff; height: 0;">__._,_.___</div> =20=20=20=20=20=20=20=20 =20=20 =20=20=20 <div id=3D"ygrp-actbar" style=3D"clear: both; margin-bottom: 10px; whit= e-space: nowrap; color: #666; padding-top: 15px;"> <div> <a href=3D"mailto:[email protected]?subject=3DRe%3A%20Clearsilver%2= 0in%20a%20multi%20hreaded%20environment" style=3D"margin-right: 0; padding-= right: 0;"> Reply to <span style=3D"font-weight: 700;">sender</span></a> | <a href=3D"mailto:[email protected]?subject=3DRe%3A%20Cle= arsilver%20in%20a%20multi%20hreaded%20environment"> Reply to <span style=3D"font-weight: 700;">group</span></a> | <a href=3D"http://groups.yahoo.com/group/ClearSilver/post;_ylc= =3DX3oDMTJwZjl1bzZqBF9TAzk3MzU5NzE0BGdycElkAzM1NjQxMzcEZ3Jwc3BJZAMxNzA3Mjgx= OTQyBG1zZ0lkAzEzOTkEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxMjkwOTkyOTcz?act=3Drepl= y&messageNum=3D1399">Reply <span style=3D"font-weight: 700;">via web post</= span></a> | <a href=3D"http://groups.yahoo.com/group/ClearSilver/post;_ylc= =3DX3oDMTJlcjNydWxrBF9TAzk3MzU5NzE0BGdycElkAzM1NjQxMzcEZ3Jwc3BJZAMxNzA3Mjgx= OTQyBHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI5MDk5Mjk3Mw--" style=3D"font-weight:= 700;">Start a New Topic</a> </div> <a href=3D"http://groups.yahoo.com/group/ClearSilver/messag= e/1398;_ylc=3DX3oDMTM0OW5kdWttBF9TAzk3MzU5NzE0BGdycElkAzM1NjQxMzcEZ3Jwc3BJZ= AMxNzA3MjgxOTQyBG1zZ0lkAzEzOTkEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjkwOTkyOTcz= BHRwY0lkAzEzOTg-">Messages in this topic</a> (<span style=3D"font-weight: 700;">2</span>) </div>=20 <!------- Start Nav Bar ------> <!-- |**|begin egp html banner|**| --> <div id=3D"ygrp-vital" style=3D"background-color: #e0ecee; font-family: Ver= dana; font-size: 10px; margin-bottom: 10px; padding: 10px;"> <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-tran= sform: uppercase; ">Recent Activity:</span> <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: inl= ine;"> </ul> =20=20=20=20 <div style=3D"clear: both; padding-top: 2px; color: #1e66ae;"> <a href=3D"http://groups.yahoo.com/group/ClearSilver;_ylc=3DX3oDMTJldDA= 3cnJvBF9TAzk3MzU5NzE0BGdycElkAzM1NjQxMzcEZ3Jwc3BJZAMxNzA3MjgxOTQyBHNlYwN2dG= wEc2xrA3ZnaHAEc3RpbWUDMTI5MDk5Mjk3Mw--" style=3D"text-decoration: none;">Vi= sit Your Group</a> </div> </div> <div id=3D"ygrp-mkp" style=3D"border: 1px solid #d8d8d8; clea= r: both; float: left; font-family: Arial; margin: 5px 0 10px 0; padding: 0 = 10px;"> <div id=3D"hd" style=3D"color: #628c2a; font-size: 85%; font-weight: = 700; line-height: 122%; margin: 10px 0;">MARKETPLACE</div> <div id=3D"ads" style=3D"margin-bottom: 10px;"> <div class=3D"ad" style=3D"color: #628C2A; font-family: A= rial; font-weight: 700; padding: 0 0;"> <p><a href=3D"http://global.ard.yahoo.com/SIG=3D15ot9m1vr/M=3D4= 93064.13814537.14041040.10835568/D=3Dgroups/S=3D1707281942:MKP1/Y=3DYAHOO/E= XP=3D1291000173/L=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0/B=3DbArzCEoGYr0-/J= =3D1290992973940241/K=3DbMY_gwdFKW0XdJexffWc2Q/A=3D6260316/R=3D0/SIG=3D11bc= 8n8gt/*http://custom.yahoo.com/fibromyalgiazone/">Find useful articles and = helpful tips on living with Fibromyalgia. Visit the Fibromyalgia Zone today= !</a></p><script language=3Djavascript> if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object(); window.yzq_d['bArzCEoGYr0-']=3D'&U=3D13c2kj538%2fN%3dbArzCEoGYr0-%2fC%3d493= 064.13814537.14041040.10835568%2fD%3dMKP1%2fB%3d6260316%2fV%3d1'; </script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y= ahoo.com/b?P=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0&T=3D1d5o48pqi%2fX%3d129= 0992973%2fE%3d1707281942%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO= %2fF%3d4024257474%2fH%3dY29udGVudD0iR287UG9kY2FzdHM7V2lkZ2V0cztGbGlja3I7WWF= ob29fU2VhcmNoX01hcmtldGluZztGaW5hbmNlO0Jvb2ttYXJrO01lc3NhZ2VfQm9hcmRzO0NhbG= VuZGFyO0V2ZW50czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjUzYjIzYzdjLWZiN= TUtMTFkZi1hOTEyLTdmNGU2ODM2Y2NmMCIgc2l0ZUlkPSI0NDUyNTUxIiB0U3RtcD0iMTI5MDk5= Mjk3MzkzODg0MSIg%2fQ%3d-1%2fS%3d1%2fJ%3d28228962&U=3D13c2kj538%2fN%3dbArzCE= oGYr0-%2fC%3d493064.13814537.14041040.10835568%2fD%3dMKP1%2fB%3d6260316%2fV= %3d1"></noscript> </div> <div class=3D"ad" style=3D"color: #628C2A; font-f= amily: Arial; font-weight: 700; padding: 0 0;"> <hr style=3D"border: 1px solid #d8d8d8;"> <p><a href=3D"http://global.ard.yahoo.com/SIG=3D15o= kap6hv/M=3D763369.14458182.14302911.13298430/D=3Dgroups/S=3D1707281942:MKP1= /Y=3DYAHOO/EXP=3D1291000173/L=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0/B=3DbQ= rzCEoGYr0-/J=3D1290992973940241/K=3DbMY_gwdFKW0XdJexffWc2Q/A=3D6270512/R=3D= 0/SIG=3D11hhtt9bf/*http://yahoo.homepagesforhomerooms.com/projects">Be a ho= meroom hero =BF help Yahoo! donate up to $350K to classrooms!</a></p><scrip= t language=3Djavascript> if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object(); window.yzq_d['bQrzCEoGYr0-']=3D'&U=3D13cegdc0d%2fN%3dbQrzCEoGYr0-%2fC%3d763= 369.14458182.14302911.13298430%2fD%3dMKP1%2fB%3d6270512%2fV%3d1'; </script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y= ahoo.com/b?P=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0&T=3D1d4e1av2a%2fX%3d129= 0992973%2fE%3d1707281942%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO= %2fF%3d665620128%2fH%3dY29udGVudD0iR287UG9kY2FzdHM7V2lkZ2V0cztGbGlja3I7WWFo= b29fU2VhcmNoX01hcmtldGluZztGaW5hbmNlO0Jvb2ttYXJrO01lc3NhZ2VfQm9hcmRzO0NhbGV= uZGFyO0V2ZW50czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjUzYjIzYzdjLWZiNT= UtMTFkZi1hOTEyLTdmNGU2ODM2Y2NmMCIgc2l0ZUlkPSI0NDUyNTUxIiB0U3RtcD0iMTI5MDk5M= jk3MzkzODg0MSIg%2fQ%3d-1%2fS%3d1%2fJ%3d28228962&U=3D13cegdc0d%2fN%3dbQrzCEo= GYr0-%2fC%3d763369.14458182.14302911.13298430%2fD%3dMKP1%2fB%3d6270512%2fV%= 3d1"></noscript> </div> <div class=3D"ad" style=3D"color: #628C2A; font-f= amily: Arial; font-weight: 700; padding: 0 0;"> <hr style=3D"border: 1px solid #d8d8d8;"> <p><a href=3D"http://global.ard.yahoo.com/SIG=3D15o= l4h1b2/M=3D493064.13983314.14041046.13298430/D=3Dgroups/S=3D1707281942:MKP1= /Y=3DYAHOO/EXP=3D1291000173/L=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0/B=3Daw= rzCEoGYr0-/J=3D1290992973940241/K=3DbMY_gwdFKW0XdJexffWc2Q/A=3D6060255/R=3D= 0/SIG=3D1194m4keh/*http://us.toolbar.yahoo.com/?.cpdl=3Dgrpj">Stay on top o= f your group activity without leaving the page you're on - Get the Yahoo! T= oolbar now.</a></p> <script language=3Djavascript> if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object(); window.yzq_d['awrzCEoGYr0-']=3D'&U=3D13cibc1qs%2fN%3dawrzCEoGYr0-%2fC%3d493= 064.13983314.14041046.13298430%2fD%3dMKP1%2fB%3d6060255%2fV%3d1'; </script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y= ahoo.com/b?P=3D53b23c7c-fb55-11df-a912-7f4e6836ccf0&T=3D1d5osrb2j%2fX%3d129= 0992973%2fE%3d1707281942%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO= %2fF%3d3268521372%2fH%3dY29udGVudD0iR287UG9kY2FzdHM7V2lkZ2V0cztGbGlja3I7WWF= ob29fU2VhcmNoX01hcmtldGluZztGaW5hbmNlO0Jvb2ttYXJrO01lc3NhZ2VfQm9hcmRzO0NhbG= VuZGFyO0V2ZW50czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjUzYjIzYzdjLWZiN= TUtMTFkZi1hOTEyLTdmNGU2ODM2Y2NmMCIgc2l0ZUlkPSI0NDUyNTUxIiB0U3RtcD0iMTI5MDk5= Mjk3MzkzODg0MSIg%2fQ%3d-1%2fS%3d1%2fJ%3d28228962&U=3D13cibc1qs%2fN%3dawrzCE= oGYr0-%2fC%3d493064.13983314.14041046.13298430%2fD%3dMKP1%2fB%3d6060255%2fV= %3d1"></noscript> </div> </div> </div> =20=20 <div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p= x; padding: 0 2px 0 0; clear: both;"> <a href=3D"http://groups.yahoo.com/;_ylc=3DX3oDMTJkYWczbmFhBF9TAzk3MzU5Nz= E0BGdycElkAzM1NjQxMzcEZ3Jwc3BJZAMxNzA3MjgxOTQyBHNlYwNmdHIEc2xrA2dmcARzdGltZ= QMxMjkwOTkyOTcz" style=3D"float: left;"><img src=3D"http://l.yimg.com/a/i/u= s/yg/logo/us.gif" height=3D"15" width=3D"137" alt=3D"Yahoo! Groups" style= =3D"border: 0;"/></a> <div style=3D"color: #747575; float: right;">Switch to: <a href=3D"mailto= :[email protected]?subject=3DChange Delivery Format: = Traditional" style=3D"text-decoration: none;">Text-Only</a>, <a href=3D"mai= lto:[email protected]?subject=3DEmail Delivery: Digest" cl= ass=3D"margin-rt" style=3D"text-decoration: none;">Daily Digest</a> • = <a href=3D"mailto:[email protected]?subject=3DUnsubsc= ribe" style=3D"text-decoration: none;">Unsubscribe</a> • <a href=3D"ht= tp://docs.yahoo.com/info/terms/" style=3D"text-decoration: none;">Terms of = Use</a></div> </div> <!-- |**|end egp html banner|**| --> </div> <!-- ygrp-msg --> <!-- Sponsor --> <!-- |**|begin egp html banner|**| --> <div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m= argin:0 0 25px 0; background: #fff;"> <!-- Start Recommendations --> <div id=3D"ygrp-reco"> </div> <!-- End Recommendations --> </div> <!-- |**|end egp html banner|**| --> <div style=3D"clear:both; color: #FFF; font-size:1px;">.</div> </div> <img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D3564137/grpspI= d=3D1707281942/msgId=3D1399/stime=3D1290992973/nc1=3D5522131/nc2=3D3848642/= nc3=3D4507179" width=3D"1" height=3D"1"> <br> <div style=3D"color: #fff; height: 0;">__,_._,___</div> <!--~-|**|PrettyHtmlEnd|**|-~--> </body> <!--~-|**|PrettyHtmlStart|**|-~--> <head> <style type=3D"text/css"> <!-- #ygrp-mkp { border: 1px solid #d8d8d8; font-family: Arial; margin: 10px 0; padding: 0 10px; } #ygrp-mkp hr { border: 1px solid #d8d8d8; } #ygrp-mkp #hd { color: #628c2a; font-size: 85%; font-weight: 700; line-height: 122%; margin: 10px 0; } #ygrp-mkp #ads { margin-bottom: 10px; } #ygrp-mkp .ad { padding: 0 0; } #ygrp-mkp .ad p { margin: 0; } #ygrp-mkp .ad a { color: #0000ff; text-decoration: none; } #ygrp-sponsor #ygrp-lc { font-family: Arial; } #ygrp-sponsor #ygrp-lc #hd { margin: 10px 0px; font-weight: 700; font-size: 78%; line-height: 122%; } #ygrp-sponsor #ygrp-lc .ad { margin-bottom: 10px; padding: 0 0; } a { color: #1e66ae; } #actions { font-family: Verdana; font-size: 11px; padding: 10px 0; } #activity { background-color: #e0ecee; float: left; font-family: Verdana; font-size: 10px; padding: 10px; } #activity span { font-weight: 700; } #activity span:first-child { text-transform: uppercase; } #activity span a { color: #5085b6; text-decoration: none; } #activity span span { color: #ff7900; } #activity span .underline { text-decoration: underline; } .attach { clear: both; display: table; font-family: Arial; font-size: 12px; padding: 10px 0; width: 400px; } .attach div a { text-decoration: none; } .attach img { border: none; padding-right: 5px; } .attach label { display: block; margin-bottom: 5px; } .attach label a { text-decoration: none; } =20=20 blockquote { margin: 0 0 0 4px; } .bold { font-family: Arial; font-size: 13px; font-weight: 700; } .bold a { text-decoration: none; } dd.last p a { font-family: Verdana; font-weight: 700; } dd.last p span { margin-right: 10px; font-family: Verdana; font-weight: 700; } dd.last p span.yshortcuts { margin-right: 0; } div.attach-table div div a { text-decoration: none; } div.attach-table { width: 400px; } div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi= le-title a:visited { text-decoration: none; } div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div= .photo-title a:visited { text-decoration: none; } div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts { font-family: Verdana; font-size: 10px; font-weight: normal; } .green { color: #628c2a; } .MsoNormal { margin: 0 0 0 0; } o { font-size: 0; } #photos div { float: left; width: 72px; } #photos div div { border: 1px solid #666666; height: 62px; overflow: hidden; width: 62px; } #photos div label { color: #666666; font-size: 10px; overflow: hidden; text-align: center; white-space: nowrap; width: 64px; } #reco-category { font-size: 77%; } #reco-desc { font-size: 77%; } .replbq { margin: 4px; } #ygrp-actbar div a:first-child { /* border-right: 0px solid #000;*/ margin-right: 2px; padding-right: 5px; } #ygrp-mlmsg { font-size: 13px; font-family: Arial, helvetica,clean, sans-serif; *font-size: small; *font: x-small; } #ygrp-mlmsg table { font-size: inherit; font: 100%; } #ygrp-mlmsg select, input, textarea { font: 99% Arial, Helvetica, clean, sans-serif; } #ygrp-mlmsg pre, code { font:115% monospace; *font-size:100%; } #ygrp-mlmsg * { line-height: 1.22em; } #ygrp-mlmsg #logo { padding-bottom: 10px; } #ygrp-mlmsg a { color: #1E66AE; } #ygrp-msg p a { font-family: Verdana; } #ygrp-msg p#attach-count span { color: #1E66AE; font-weight: 700; } #ygrp-reco #reco-head { color: #ff7900; font-weight: 700; } #ygrp-reco { margin-bottom: 20px; padding: 0px; } #ygrp-sponsor #ov li a { font-size: 130%; text-decoration: none; } #ygrp-sponsor #ov li { font-size: 77%; list-style-type: square; padding: 6px 0; }=20 #ygrp-sponsor #ov ul { margin: 0; padding: 0 0 0 8px; } #ygrp-text { font-family: Georgia; } #ygrp-text p { margin: 0 0 1em 0; } #ygrp-text tt { font-size: 120%; } #ygrp-vital ul li:last-child { border-right: none !important;=20 }=20 --> </style> </head> <!--~-|**|PrettyHtmlEnd|**|-~--> </html> <!-- end group email --> --feq3sPuNZHAX6XSu2qChZRkEcCt78W4Xa5MBv95--