<div dir="ltr"><div>(sorry, too long mail polling, your answer came after my previous one)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>cases where an external might want to behave
differently depending on whether PDINSTANCE is defined or not</div></blockquote><div><br></div><div>yes you're right... I remember I helped to fix readsf~/writesf~ for multi-instance / multi-thread context, by adding <i>pd_setinstance() </i>in the helper threads.<i><br></i></div><div>so I agree with your conclusion. Things will have to be prepared carefully...<i><br></i></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le lun. 4 avr. 2022 à 15:49, Antoine Rousseau <<a href="mailto:antoine@metalu.net">antoine@metalu.net</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"><div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>ABI break for
multi-instance libpd</div></blockquote><div><br></div><div>only externals already compiled for multi-instance would have to be recompiled, I think.</div><div>And it wouldn't allow current externals to be used in a multi-instance context.</div><div><br></div><div>But it would allow a Pd compiled with PDINSTANCE, or a single-instance libpd app compiled with PDINSTANCE to load current externals (compiled without PDINSTANCE).</div><div><br></div><div><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><font face="arial, helvetica, sans-serif"> Antoine<br><br></font></div></div></div></div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le lun. 4 avr. 2022 à 15:00, Christof Ressi <<a href="mailto:info@christofressi.com" target="_blank">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">
<div>
<p>
</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>
<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>On 04.04.2022 13:55, Antoine Rousseau
wrote:<br>
</div>
<blockquote type="cite">
<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" target="_blank">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">Pd-dev@lists.iem.at</a><br>
> <a href="https://lists.puredata.info/listinfo/pd-dev" rel="noreferrer" target="_blank">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">Pd-dev@lists.iem.at</a><br>
<a href="https://lists.puredata.info/listinfo/pd-dev" rel="noreferrer" target="_blank">https://lists.puredata.info/listinfo/pd-dev</a><br>
</blockquote>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
Pd-dev mailing list
<a href="mailto:Pd-dev@lists.iem.at" target="_blank">Pd-dev@lists.iem.at</a>
<a href="https://lists.puredata.info/listinfo/pd-dev" target="_blank">https://lists.puredata.info/listinfo/pd-dev</a>
</pre>
</blockquote>
</div>
_______________________________________________<br>
Pd-dev mailing list<br>
<a href="mailto:Pd-dev@lists.iem.at" target="_blank">Pd-dev@lists.iem.at</a><br>
<a href="https://lists.puredata.info/listinfo/pd-dev" rel="noreferrer" target="_blank">https://lists.puredata.info/listinfo/pd-dev</a><br>
</blockquote></div>
</blockquote></div>