From: Vladimir T. <vtz...@gm...> - 2010-10-31 14:51:37
|
On 10/31/10, Don Cohen <don...@is...> wrote: > BTW, I'm guessing that gensym and gentemp are not protected in any way, > so that two different threads could end up using the same names, > and in the case of gentemp, returning the same symbols? gensym is not guarded in any way and it's possible to get same name in different treads (by default every thread binds *gensym-counter* via *default-special-bindings*). In presence of possible conflicts - may be use unique thread prefix? gentemp is more problematic (have not looked on it till now). Again - per thread prefix usage is fine but the internal counter is shared among all threads. Another option is to use a form of atomic increment of counters (but how exactly to do is problematic - cpu supported atomic increment does not fit well clisp arithmetic, may be use mutex?). How other lisps deal with this? |
From: <don...@is...> - 2010-10-31 15:53:32
|
Vladimir Tzankov writes: > gensym is not guarded in any way and it's possible to get same name in > different treads (by default every thread binds *gensym-counter* via > *default-special-bindings*). In presence of possible conflicts - may What's the advantage of binding it per thread? This seems even worse than sharing it. It seems in that case you're actually making it very likely to use the same names in different contexts. > be use unique thread prefix? This doesn't seem all that useful since it's common (at least for me) to pass a string argument to gensym. It seems to me that the ideal behavior would be to make it work as if protected by a mutex. > gentemp is more problematic (have not looked on it till now). Again - > per thread prefix usage is fine but the internal counter is shared > among all threads. This seems similar, only even more important to return different results. That is, after all, what the spec says. |
From: Sam S. <sd...@gn...> - 2010-11-01 03:35:52
|
> * Vladimir Tzankov <igmnaxbi@tznvy.pbz> [2010-10-31 16:51:29 +0200]: > > On 10/31/10, Don Cohen <don...@is...> wrote: >> BTW, I'm guessing that gensym and gentemp are not protected in any way, >> so that two different threads could end up using the same names, >> and in the case of gentemp, returning the same symbols? > > gensym is not guarded in any way and it's possible to get same name in > different treads (by default every thread binds *gensym-counter* via > *default-special-bindings*). In presence of possible conflicts - may > be use unique thread prefix? > > gentemp is more problematic (have not looked on it till now). Again - > per thread prefix usage is fine but the internal counter is shared > among all threads. > > Another option is to use a form of atomic increment of counters (but > how exactly to do is problematic - cpu supported atomic increment does > not fit well clisp arithmetic, may be use mutex?). I think using a mutex in getsym & gentems (and not binding *gensym-counter* in every thread) is a good idea. these functions are usually called in macroexpansion, so they are not too speed-critical and not particularly prone to deadlocks. -- Sam Steingold (http://sds.podval.org/) on Ubuntu 10.04 (lucid) http://thereligionofpeace.com http://www.memritv.org http://pmw.org.il http://camera.org http://mideasttruth.com http://palestinefacts.org I'm out of my mind, but feel free to leave a message... |
From: Vladimir T. <vtz...@gm...> - 2010-11-14 16:05:55
|
On 11/1/10, Sam Steingold <sd...@gn...> wrote: > I think using a mutex in getsym & gentems (and not binding > *gensym-counter* in every thread) is a good idea. > these functions are usually called in macroexpansion, so they are not > too speed-critical and not particularly prone to deadlocks. I've re-implemented and committed gensym and gentemp. Please review them. Vladimir |
From: <don...@is...> - 2010-11-15 18:31:07
|
I've not tried to test the recent changes specifically, but at least I can report that my nightly ap5 builds seem unaffected. They use gentemp and gensym a lot. But they don't use more than one thread. The do run in both #+MT and #-MT versions though. Vladimir Tzankov writes: > On 11/1/10, Sam Steingold <sd...@gn...> wrote: > > I think using a mutex in getsym & gentems (and not binding > > *gensym-counter* in every thread) is a good idea. > > these functions are usually called in macroexpansion, so they are not > > too speed-critical and not particularly prone to deadlocks. > > I've re-implemented and committed gensym and gentemp. Please review them. |