extern (C) void* rt_stackBottom();
extern (C) void* rt_stackTop();
- extern (C) void* rt_staticDataBottom();
- extern (C) void* rt_staticDataTop();
extern (C) void rt_finalize( void* p, bool det = true );
- alias void delegate( void*, void* ) scanFn;
-
- extern (C) void rt_scanStaticData( scanFn scan );
-
version (MULTI_THREADED)
{
extern (C) bool thread_needLock();
extern (C) void thread_suspendAll();
extern (C) void thread_resumeAll();
+ alias void delegate( void*, void* ) scanFn;
extern (C) void thread_scanAll( scanFn fn, void* curStackTop = null );
}
}
- static void scanStaticData(gc_t g)
- {
- //debug(PRINTF) printf("+GC.scanStaticData()\n");
- auto pbot = rt_staticDataBottom();
- auto ptop = rt_staticDataTop();
- g.addRange(pbot, ptop - pbot);
- //debug(PRINTF) printf("-GC.scanStaticData()\n");
- }
-
- static void unscanStaticData(gc_t g)
- {
- auto pbot = rt_staticDataBottom();
- g.removeRange(pbot);
- }
-
/**
* add p to list of roots
*/
}
+ /**
+ *
+ */
+ int delegate(int delegate(inout void*)) rootIter()
+ {
+ if (!thread_needLock())
+ {
+ return &gcx.rootIter;
+ }
+ else synchronized (gcLock)
+ {
+ return &gcx.rootIter;
+ }
+ }
+
+
/**
* add range to scan for roots
*/
}
+ /**
+ *
+ */
+ int delegate(int delegate(inout Range)) rangeIter()
+ {
+ if (!thread_needLock())
+ {
+ return &gcx.rangeIter;
+ }
+ else synchronized (gcLock)
+ {
+ return &gcx.rangeIter;
+ }
+ }
+
+
/**
* do full garbage collection
*/
void initialize()
{ int dummy;
- (cast(byte*)this)[0 .. Gcx.sizeof] = 0;
+ (cast(byte*)&this)[0 .. Gcx.sizeof] = 0;
stackBottom = cast(char*)&dummy;
log_init();
debug (THREADINVARIANT)
}
+ /**
+ *
+ */
+ int rootIter(int delegate(inout void*) dg)
+ {
+ int result = 0;
+ for( size_t i = 0; i < nroots; ++i )
+ {
+ result = dg(roots[i]);
+ if (result)
+ break;
+ }
+ return result;
+ }
+
+
/**
*
*/
}
+ /**
+ *
+ */
+ int rangeIter(int delegate(inout Range) dg)
+ {
+ int result = 0;
+ for( size_t i = 0; i < nranges; ++i )
+ {
+ result = dg(ranges[i]);
+ if (result)
+ break;
+ }
+ return result;
+ }
+
+
/**
* Find Pool that pointer is in.
* Return null if not in a Pool.
pool.mark.copy(&pool.freebits);
}
- rt_scanStaticData( &mark );
-
version (MULTI_THREADED)
{
if (!noStack)