www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - detecting or preventing re-entrant functions

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