WinAPI callbacks and GC

evilrat evilrat666 at gmail.com
Tue Apr 23 20:26:09 PDT 2013


On Tuesday, 23 April 2013 at 21:21:28 UTC, Jack Applegame wrote:
> I'm writing Ctrl-C handler for console application for Windows:
>
> extern(Windows) {
>   int CtrlHandler(uint flag) nothrow {
>     auto tmp = new SomeClass; // is it safe?
>     ...
>     return true;
>   }
> }
>
> ...
>
> SetConsoleCtrlHandler(&CtrlHandler, true);
>
> ...
>
> According WinAPI documentation, CtrlHandler will be called in 
> new additional thread. Is it safe to allocate GC memory in NOT 
> Phobos threads?
> If not, how to make it safe? I'm trying call 
> thread_attachThis() at the beginning of CtrlHandler fucntion, 
> but it doesn't compile because thread_attachThis() is not 
> nothrow.

i guess it call ur callback(enters D code, so GC is in), alloc 
new instance, and after callback return it should collect it, but 
there is no such thing like guessing, just try it and see if it 
works correctly.

also there is an option without using GC at all, use struct 
instead of class if you don't need polymorphism(for most tasks 
structs is really enough, they are as powerful as c++ class just 
without polymorphism and other nasties)

also if you really need class or whole program lifetime memory, 
you may declare instance in module level with 
__gshared("__gshared SomeClass tmp;", don't forget to alloc if is 
class) so gc won't touch it.

also it may be better to read related docs in language reference 
on this site for more info, since i'm somehow bad with 
remembering all the details.


More information about the Digitalmars-d-learn mailing list