On Sat, Jan 9, 2010 at 1:24 AM, Blake McBride blake@mcbride.name wrote:
Greetings, I am considering using ABCL as an extension language to a Web server app I have. I know the answer to many of the questions I have in choosing the correct extension language and ABCL seems to fit the bill well. I do have some questions, however.
- Can ABCL run concurrently in multiple threads without any problems (I
understand the ramifications in terms of my application code)?
It can, and to my knowledge, there are no known multithreading-related bugs.
- I would like to have some utility code which is loaded once and shared
by all the ABCL threads. Each thread can then run code that is independent (i.e. they can have the same function names with different definitions). (Perhaps I'd have to use packages for this.)
Packages are probably the best choice. ABCL as a system is a singleton: all the code is shared across all threads. You can't have two copies of ABCL in the same JVM, or better - you can't have two copies loaded by the same classloader.
- If I am running a lot of different threads will ABCL allow code to be
GC'd when the thread ends (presuming no other thread is using that code)?
In principle, yes: code, i.e. functions, are Java objects. However, if in one thread you evaluate, say, (defun f () 42), the function won't go away when the thread ends, because a reference to it is kept through the symbol F. In other words, packages and symbols are global, not per-thread, and so is everything that is reachable from a symbol. However, you can use a per-thread package and delete-package it when the thread terminates, for example; in such a scenario, all code installed by that thread will be garbage collected, as long as it's not referenced by someone else.
- ABCL seems to have a somewhat heavy startup time. This is okay for the
first time, but I need the threads to start much faster (much less than half a second).
You can start ABCL only once; you don't have to launch it for each thread, and actually you can't do that at all unless you use a fresh ClassLoader for each thread. Just reuse the same ABCL instance: it will automatically detect that it's being called from multiple threads and have its own per-thread state.
I hope I have answered your questions.
Bye, Alessio