D1 garbage collector + threads + malloc = garbage?
Bane
branimir.milosavljevic at gmail.com
Fri Dec 11 03:00:13 PST 2009
Bug with GC fullCollect() in multithreaded environment. Grauzone explained it here http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=99610
Test case that freezes app (tested on 1.053):
import std.c.stdlib;
import std.stdio;
import std.gc;
import std.thread;
import std.c.time;
class Foo {
void* p;
this(){
synchronized(this.classinfo) {
writefln("malloc begin");
p = std.c.stdlib.malloc(1024*1024);
writefln("malloc finished");
}
}
~this(){
synchronized(this.classinfo){
writefln("free begin");
std.c.stdlib.free(p);
writefln("free finished");
}
}
}
class MyThread : Thread {
int run(){
while(true){
new Foo;
msleep(1);
}
return 0;
}
}
void main(){
for(int i=0; i<10; i++){
(new MyThread).start;
}
while(true){
writefln("collect begin");
std.gc.fullCollect;
writefln("collect finished");
msleep(1000);
}
}
Can it be fixed or adleast mentioned somewhere in docs as known limitation of D1 GC? It would save a lot of time to some people (too late for me :).
More information about the Digitalmars-d
mailing list