GC_dlopen (const char * path, int mode)
{
  void * D.7064;
  void * result;

  disable_gc_for_dlopen ();
  result = dlopen (path, mode);
  GC_enable ();
  D.7064 = result;
  return D.7064;
}


disable_gc_for_dlopen ()
{
  int D.7066;
  int GC_incremental.0;
  int D.7071;
  int GC_dont_gc.1;
  int GC_dont_gc.2;
  extern int GC_collection_in_progress ();

  D.7066 = GC_test_and_set (&GC_allocate_lock);
  if (D.7066 != 0) goto <D.7067>; else goto <D.7068>;
  <D.7067>:
  GC_lock ();
  <D.7068>:
  goto <D.6990>;
  <D.6989>:
  GC_collect_a_little_inner (1000);
  <D.6990>:
  GC_incremental.0 = GC_incremental;
  if (GC_incremental.0 != 0) goto <D.7070>; else goto <D.6991>;
  <D.7070>:
  D.7071 = GC_collection_in_progress ();
  if (D.7071 != 0) goto <D.6989>; else goto <D.6991>;
  <D.6991>:
  GC_dont_gc.1 = GC_dont_gc;
  GC_dont_gc.2 = GC_dont_gc.1 + 1;
  GC_dont_gc = GC_dont_gc.2;
  GC_clear (&GC_allocate_lock);
}


GC_test_and_set (volatile unsigned int * addr)
{
  int D.7074;
  unsigned int D.7075;

  D.7075 = __sync_lock_test_and_set_4 (addr, 1);
  D.7074 = (int) D.7075;
  return D.7074;
}


GC_clear (volatile unsigned int * addr)
{
  __sync_synchronize ();
  *addr = 0;
}


