Coen Schalkwijk wrote:
Ok. Could you (or anyone else?) tell me more about this, so I can take this into account?
Picture this:
[...]
Not quite, the problem is more likely to be something like this, which Marcus Agehall also has mentioned:
roxen_module.pike:
object B; f() { references B; }
void start() { Thread.thread_create(f); }
When Roxen loads the module, it will in essence do something like:
modules += ({ (program)"roxen_module.pike"() }); modules->start();
When time comes to shutdown Roxen will do something like:
modules->stop(); map(modules, destruct); // Other stuff... exit(0);
The problem here is that the thread started in start() will continue to run although its object has been destructed.
The fix is to implement a stop() in the module that makes sure that all threads belonging to the module have terminated before returning.
From the backtraces that you get, you should be able to identify from
where the problematic thread originated.
This has little to do with the garbage collector, but more with when what variables are destroyed (explicitly) in stop() functions of e.g. class A.
True.
Stephen.