On 25/10/15 09:28, Bix wrote:
Hi, just two quick question:
- Is it possible to disable the threading model and have multiple thread
to eval the code or have one ECL per thread?
Not, yes, probably not. Check: https://common-lisp.net/project/ecl/manual/ch33.html reading cl_boot should be instructive.
Being able to have several ECL instances per process could be interesting: you would have multiple heaps, managed in different threads, and some lisp data could be shared from one instance to another (with some interesting consequences on teh garbage collection occuring in each instance). There would also be some fun with signals, if having to deal with them between ecl and the host program wasn't enough fun already.
Or alternatively, if you manage a single heap, why would you want to have several instances?
- Can the garbage collector be disabled at all and have the memory
managed in a reference counting fashion?
Ecl uses Boehm GC, so it's rather modular, and I guess you could link in a stub library. You could add a dealloc function, and manage the memory manually. Good luck.
I like to embed the ECL in my multithread application but I've got very restrictive constrain about thread and memory:
- I can not spawn new thread but I've got concurrent thread to execute
ecl call.
Ecl doesn't create any thread on its own. Only lisp programs may do so. Do not use libraries that create threads and you'll be ok.
- A component that bring GC would probably not be accepted
Then I would suggest to resign and find a better job. Because, yes, you can disable the garbage collector, but I wouldn't wish that on my worst enemy.
and I'm wondering if there is an alternative to that in ECL, or at least have more control how/when GC will be run.
BoehmGC doesn't seem to offer a lot of options there. It has the option to use a generational garbage collector.
Can you point me out where to look in the source code to understand those aspect of ECL?
src/bdwgc contains a copy of the Boehm-Demers-Weiser Garbage Collector src/bdwgc/include/gc.h shows the API you could implement or stub to disable it from the point of view of ecl. Notice that it's mostly GC_MALLOC, and there's a GC_FREE (never used in ecl, you you would have to provide a lisp function calling it to free the lisp objects).
(And don't count on reference counting, most lisp data structures are circular).