<div dir="ltr"><div>Hello,</div><div><br></div><div>On Emiller's guide to Nginx [1] it's stated that the shared memory constructor would receive a previously allocated data pointer as a second parameter upon a restart, so the constructor could reuse this area and avoid losing the data. I've searched the forum archives using [2] and found the thread [3], that stated this behavior too.</div><div><br></div><div>I've written a module that creates a shared memory area on a command initialization (a location configuration) and the constructor is properly called when Nginx starts. The area is created and I can use it effectively. But when I issue a "nginx -s reload", the constructor is not called at all, and I loose the data that was previously on the shared memory.</div><div><br></div><div>I'm wondering what I'm doing wrong. Is it because I'm calling ngx_shared_memory_add on a location configuration?</div><div><br></div><div>This is what I'm doing:</div><div><br></div><div><font face="monospace, monospace">static ngx_command_t ngx_http_mod_tutorial_commands[] = {</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">  </span>{</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">           </span>ngx_string("tutorial"),</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">           </span>NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">                </span>ngx_http_mod_tutorial_enable,</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">               </span>0,</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">          </span>0,</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">          </span>NULL</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">        </span>},</font></div><div><font face="monospace, monospace">...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">static char *</font></div><div><font face="monospace, monospace">ngx_http_mod_tutorial_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *_)</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">...</font></div><div><font face="monospace, monospace">    conf->shm_zone = ngx_shared_memory_add(</font></div><div><font face="monospace, monospace">        cf, shm_name, 2 * ngx_pagesize, &ngx_http_mod_tutorial_module);</font></div><div><font face="monospace, monospace">    if (!conf->shm_zone) {</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">               </span>ngx_conf_log_error(NGX_LOG_ERR, cf, 0, "Could not create shm.");</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">          </span>return NGX_CONF_ERROR;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    conf->shm_zone->init = ngx_http_mod_tutorial_init_shm_zone;</font></div><div><font face="monospace, monospace">...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">static ngx_int_t</font></div><div><font face="monospace, monospace">ngx_http_mod_tutorial_init_shm_zone(ngx_shm_zone_t *shm_zone, void *data)</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">       </span>...</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre"> </span>fprintf(stderr, "SHM_ZONE %p\n", data);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">   </span>if (data) {</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">         </span>shm_zone->data = data;</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">           </span>return NGX_OK;</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">      </span>}</font></div><div><font face="monospace, monospace"><span class="" style="white-space:pre">   </span>...</font></div><div><br></div><div><br></div><div>The message to stderr is printed when Nginx starts, but not after a reload, that's why I know that the constructor is not being called again. Also, I have a counter on the shared area and it's value is reset after a reload.</div><div><br></div><div>Any thoughts?</div><div><br></div><div><br></div><div>[1] <a href="http://www.evanmiller.org/nginx-modules-guide-advanced.html#shm">http://www.evanmiller.org/nginx-modules-guide-advanced.html#shm</a></div><div>[2] <a href="http://forum.nginx.org/search.php?29,search=shared+memory,author=,page=1,match_type=ALL,match_dates=0,match_forum=29,match_threads=0">http://forum.nginx.org/search.php?29,search=shared+memory,author=,page=1,match_type=ALL,match_dates=0,match_forum=29,match_threads=0</a></div><div>[3] <a href="http://forum.nginx.org/read.php?29,229836,229836#msg-229836">http://forum.nginx.org/read.php?29,229836,229836#msg-229836</a></div><div><br></div><div>Best regards,</div><div><div class="gmail_signature"><div dir="ltr"><div><div><h1 style="font-family:Arial;font-size:14px;margin-bottom:10px;color:rgb(68,68,71)"><div style="color:rgb(0,0,0);font-size:medium;font-weight:normal;height:7px;width:0px;border-left-width:15px;border-left-style:solid;border-left-color:rgb(239,101,47);border-right-width:7px;border-right-style:solid;border-right-color:rgb(247,183,160);margin-bottom:15px"></div><div style="color:rgb(0,0,0);font-family:Arial,Helvetica,sans-serif">Acácio Centeno</div><div style="color:rgb(0,0,0);font-weight:normal;font-family:Arial,Helvetica,sans-serif;font-size:12px">Software Engineering</div><div style="font-weight:normal;margin:1em 0px 0px;font-family:Arial,Helvetica,sans-serif;font-size:13px;color:rgb(239,101,47)">Azion Technologies</div><div style="color:rgb(0,0,0);font-weight:normal;margin:0.25em 0px;font-family:Arial,Helvetica,sans-serif;font-size:11px">Porto Alegre, Brasil +55 51 3012 3005 | +55 51 8118 9947</div><div style="color:rgb(0,0,0);font-weight:normal;margin:0.25em 0px;font-family:Arial,Helvetica,sans-serif;font-size:11px">Miami, USA +1 305 704 8816</div><table style="max-width:500px" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><br><p style="font-size:10px"><span style="font-weight:normal">Quaisquer informações contidas neste e-mail e anexos podem ser confidenciais e privilegiadas, protegidas por sigilo legal. Qualquer forma de utilização deste documento depende de autorização do emissor, sujeito as penalidades cabíveis.</span></p><p style="font-size:10px;margin-top:10px"><span style="font-weight:normal">Any information in this e-mail and attachments may be confidential and privileged, protected by legal confidentiality. The use of this document require authorization by the issuer, subject to penalties.</span></p></td></tr></tbody></table><br style="color:rgb(0,0,0);font-size:medium;font-weight:normal"></h1></div></div></div></div></div>
</div>