digitalmars.D - detecting or preventing re-entrant functions
- Timothee Cour via Digitalmars-d (38/38) Jan 02 2016 some weird bugs can occur when, for example, an error or signal handler ...
some weird bugs can occur when, for example, an error or signal handler is re-entrant. Is there a way to detect this? this works but is cumbersome to use [see below], is there a simpler way to detect in calling code (i want to simplify SNIPPET in calling code) --- module util.reentrance_check; import std.stdio; void reentrance_check(ref int depth, string file=__FILE__, int line=__LINE__){ depth++; if(depth>1){ // make sure code here is not reentrant writeln(file, ":", line, " reentrant ", depth, " "); // print stack trace... import core.stdc.stdlib: exit; exit(1);// because assert(0) could in turn call a handler which could re-enter here return; } } unittest{ example_reentrance_check; example_reentrance_check; } // USAGE example void example_reentrance_check(){ // NOTE: can't use RAII because $depth a static var // TODO: how can we simplify this, to a 1-liner? // insert this block in your non-re-entrant function import util.reentrance_check; static int depth=0; reentrance_check(depth); scope(success) depth--; /// code after version(bad) example_reentrance_check;// should crash with -version=bad } ---
Jan 02 2016