<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>
      <blockquote type="cite">
        <div>I was thinking to a way for the transition: we could:<br>
        </div>
        <div>- change the t_pdinstance pd_s_* fields to pointers (and
          adapt the s_* replacement  macros accordingly), <br>
        </div>
        <div>- export "hidden" globals s_*</div>
        <div>- initialize pd_maininstance pd_s_* fields to the global
          versions.</div>
      </blockquote>
      Yes, this would work. Of course, it would be an ABI break for
      multi-instance libpd, but I think it would be justified. I guess
      libpd users rarely rely on pre-build externals, and even if they
      do, I think it's ok to ask them to recompile.<br>
    </p>
    <p>We should probably also put the global s_* symbols in a
      deprecation macro that tells external authors to use gensym()
      instead.<br>
    </p>
    <p>Christof<br>
    </p>
    <div class="moz-cite-prefix">On 04.04.2022 13:55, Antoine Rousseau
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAOCG5Hw-TAsX9_dYmaQ+z8VhgxwWBARXHdVxhPhW_CvFVVzm=Q@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div>I very much agree that in the future Pd (and externals)
          could be always compiled with PDINSTANCE.</div>
        <div><br>
        </div>
        <div>I was thinking to a way for the transition: we could:<br>
        </div>
        <div>- change the t_pdinstance pd_s_* fields to pointers (and
          adapt the s_* replacement  macros accordingly), <br>
        </div>
        <div>- export "hidden" globals s_*</div>
        <div>- initialize pd_maininstance pd_s_* fields to the global
          versions.</div>
        <div><br>
        </div>
        <div><span style="font-family:monospace">CURRENT:</span></div>
        <div><span style="font-family:monospace">/* m_pd.h */<br>
          </span></div>
        <div><span style="font-family:monospace">struct _pdinstance<br>
            {</span></div>
        <div><span style="font-family:monospace">    t_symbol 
            pd_s_float;</span></div>
        <div><span style="font-family:monospace">}<br>
          </span></div>
        <div><span style="font-family:monospace">#define s_float    
            (pd_this->pd_s_float)</span></div>
        <div><span style="font-family:monospace"><br>
          </span></div>
        <div><span style="font-family:monospace">/* m_class.c */</span></div>
        <div><span style="font-family:monospace">t_pdinstance
            *pdinstance_init(t_pdinstance *x) <br>
          </span></div>
        <div><span style="font-family:monospace">{</span></div>
        <div><span style="font-family:monospace">    dogensym("float",  
              &x->pd_s_float,    x);</span></div>
        <div><span style="font-family:monospace">}</span></div>
        <div><span style="font-family:monospace"><br>
          </span></div>
        <div><span style="font-family:monospace">PROPOSAL:</span></div>
        <div>
          <div><span style="font-family:monospace">/* m_pd.h */<br>
            </span></div>
          <div><span style="font-family:monospace">struct _pdinstance<br>
              {</span></div>
          <div><span style="font-family:monospace">    t_symbol
               *pd_s_float;</span></div>
          <div><span style="font-family:monospace">}<br>
            </span></div>
          <div><span style="font-family:monospace">#define s_float    
              (*(pd_this->pd_s_float))</span></div>
          <div><span style="font-family:monospace"><br>
            </span></div>
          <div><span style="font-family:monospace">/* m_class.c */</span></div>
          <div><span style="font-family:monospace">#undef s_float<br>
              t_symbol s_float;<br>
            </span></div>
          <div><span style="font-family:monospace">t_pdinstance
              *pdinstance_init(t_pdinstance *x) <br>
            </span></div>
          <div><span style="font-family:monospace">{</span></div>
          <div><span style="font-family:monospace">    if(x !=
              &pd_maininstance) x->pd_s_float = gensym("float");</span></div>
          <div><span style="font-family:monospace">    else {</span></div>
          <div><span style="font-family:monospace">       
              dogensym("float",     &s_float,    x);</span></div>
          <div><span style="font-family:monospace">       
              x->pd_s_float = &s_float;<br>
            </span></div>
          <div><span style="font-family:monospace">}</span></div>
          <div><span style="font-family:monospace"><br>
            </span></div>
          <div><span style="font-family:monospace"><font
                face="arial,sans-serif">What do you think?</font></span></div>
          <div><span style="font-family:monospace"><font
                face="arial,sans-serif"><br>
              </font></span></div>
          I've tried this (in libpd context) almost successfully, but
          I've encountered a problem: the s_float as seen from an app
          linked to libpd seems to be uninitialized.</div>
        <div>I've tried something simpler:</div>
        <div><span style="font-family:monospace">/* m_class.c */</span></div>
        <div><span style="font-family:monospace">float myfloat = 10.0;</span></div>
        <div>
          <div><span style="font-family:monospace">t_pdinstance
              *pdinstance_init(t_pdinstance *x)<br>
            </span></div>
          <div><span style="font-family:monospace">{</span></div>
          <div><span style="font-family:monospace">    <span
                style="font-family:monospace">myfloat = 20.0;</span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace">    <span
                  style="font-family:monospace"><span
                    style="font-family:monospace"><span
                      style="font-family:monospace">printf("<span
                        style="font-family:monospace"><span
                          style="font-family:monospace"><span
                            style="font-family:monospace"><span
                              style="font-family:monospace"><span
                                style="font-family:monospace"><span
                                  style="font-family:monospace">pdinstance_init::</span></span></span></span></span></span>myfloat:
                      %f\n", myfloat);</span></span></span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace">}</span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><br>
              </span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace">/* pdtest.c */</span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">extern float myfloat;</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">int main()</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">{</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">    libpd_init();</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">    printf("myfloat:
                  %f\n", myfloat);</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">}</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace"><br>
                </span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">cc
                  -I../../../libpd_wrapper -I../../../pure-data/src -O3
                    -c -o pdtest.o pdtest.c<br>
                  gcc -o pdtest pdtest.o ../../../libs/libpd.so</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace"><br>
                </span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">$ pdtest<br>
                </span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace"><span
                    style="font-family:monospace"><span
                      style="font-family:monospace"><span
                        style="font-family:monospace"><span
                          style="font-family:monospace"><span
                            style="font-family:monospace"><span
                              style="font-family:monospace"><span
                                style="font-family:monospace"><span
                                  style="font-family:monospace"><span
                                    style="font-family:monospace"><span
                                      style="font-family:monospace"><span
                                        style="font-family:monospace"><span
                                          style="font-family:monospace"><span
style="font-family:monospace"><span style="font-family:monospace">pdinstance_init::</span></span></span></span></span></span></span></span></span></span></span>myfloat:
                        20.00000</span></span></span></span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace">myfloat: 10.00000</span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace"><br>
                </span></span></span></div>
          <div><span style="font-family:monospace"><span
                style="font-family:monospace"><span
                  style="font-family:monospace"><font
                    face="arial,sans-serif">Do you know why pdtest
                    doesn't see the updated value?</font><br>
                </span></span></span></div>
          <span style="font-family:monospace"></span></div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">Le mer. 30 mars 2022 à 23:51,
          Christof Ressi <<a href="mailto:info@christofressi.com"
            moz-do-not-send="true" class="moz-txt-link-freetext">info@christofressi.com</a>>
          a écrit :<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px
          0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">AFAICT,
          the main issue is that multi-instance Pd misses symbols for <br>
          certain global variables, most notably  s_float, s_symbol,
          s_bang, etc.<br>
          <br>
          The problem is that these are really exported global structs.
          If they <br>
          were *pointers*, we could simply make them point to the
          corresponding <br>
          field in the main Pd instance. But in this case I don't really
          see a <br>
          solution...<br>
          <br>
          On 30.03.2022 18:07, IOhannes m zmoelnig wrote:<br>
          ><br>
          > On 3/30/22 17:45, Dan Wilcox wrote:<br>
          >> I lean much more on the side that PDINSTANCE is a
          low-level, per <br>
          >> project compile option and not general-purpose. If
          you are using <br>
          >> libpd, then your environment is a bit more custom
          anyway.<br>
          ><br>
          > i wonder what the penalty would be to turn on PDINSTANCE
          on Pd?<br>
          ><br>
          ><br>
          > obviously a problem with externals, but maybe we can come
          up with some <br>
          > clever hack (under the assumption, that Pd (the app) only
          runs a <br>
          > single instance, even if compiled with multi-instance
          support) to use <br>
          > legacy externals - if that is even possible.<br>
          ><br>
          > apart from that?<br>
          ><br>
          > fgadrms<br>
          > IOhannes<br>
          ><br>
          > _______________________________________________<br>
          > Pd-dev mailing list<br>
          > <a href="mailto:Pd-dev@lists.iem.at" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">Pd-dev@lists.iem.at</a><br>
          > <a href="https://lists.puredata.info/listinfo/pd-dev"
            rel="noreferrer" target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">https://lists.puredata.info/listinfo/pd-dev</a><br>
          <br>
          <br>
          <br>
          _______________________________________________<br>
          Pd-dev mailing list<br>
          <a href="mailto:Pd-dev@lists.iem.at" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">Pd-dev@lists.iem.at</a><br>
          <a href="https://lists.puredata.info/listinfo/pd-dev"
            rel="noreferrer" target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">https://lists.puredata.info/listinfo/pd-dev</a><br>
        </blockquote>
      </div>
      <br>
      <fieldset class="moz-mime-attachment-header"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
Pd-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Pd-dev@lists.iem.at">Pd-dev@lists.iem.at</a>
<a class="moz-txt-link-freetext" href="https://lists.puredata.info/listinfo/pd-dev">https://lists.puredata.info/listinfo/pd-dev</a>
</pre>
    </blockquote>
  </body>
</html>