sgen_resume_thread (struct SgenThreadInfo * info)
{
  gboolean D.17211;
  int restart_signal_num.0;
  int D.17213;
  _Bool D.17214;

  restart_signal_num.0 = 30;
  D.17213 = mono_threads_pthread_kill (info, restart_signal_num.0);
  D.17214 = D.17213 == 0;
  D.17211 = (gboolean) D.17214;
  return D.17211;
}


sgen_suspend_thread (struct SgenThreadInfo * info)
{
  gboolean D.17216;
  int suspend_signal_num.1;
  int D.17218;
  _Bool D.17219;

  suspend_signal_num.1 = 19;
  D.17218 = mono_threads_pthread_kill (info, suspend_signal_num.1);
  D.17219 = D.17218 == 0;
  D.17216 = (gboolean) D.17219;
  return D.17216;
}


sgen_wait_for_suspend_ack (int count)
{
  int * D.17221;
  int D.17222;
  char * D.17225;
  union MonoSemType * suspend_ack_semaphore_ptr.2;
  int i;
  int result;

  i = 0;
  goto <D.17184>;
  <D.17183>:
  goto <D.17181>;
  <D.17180>:
  D.17221 = __errno_location ();
  D.17222 = *D.17221;
  if (D.17222 != 4) goto <D.17223>; else goto <D.17224>;
  <D.17223>:
  D.17221 = __errno_location ();
  D.17222 = *D.17221;
  D.17221 = __errno_location ();
  D.17222 = *D.17221;
  D.17225 = strerror (D.17222);
  monoeg_g_log (0B, 4, "MONO_SEM_WAIT FAILED with %d errno %d (%s)", result, D.17222, D.17225);
  <D.17179>:
  goto <D.17179>;
  <D.17224>:
  <D.17181>:
  suspend_ack_semaphore_ptr.2 = suspend_ack_semaphore_ptr;
  result = mono_sem_wait (suspend_ack_semaphore_ptr.2, 0);
  if (result != 0) goto <D.17180>; else goto <D.17182>;
  <D.17182>:
  i = i + 1;
  <D.17184>:
  if (i < count) goto <D.17183>; else goto <D.17185>;
  <D.17185>:
}


sgen_thread_handshake (BOOL suspend)
{
  const int iftmp.3;
  struct MonoLinkedListSet * D.17231;
  struct MonoLinkedListSetNode * * D.17232;
  void * D.17233;
  struct MonoLinkedListSetNode * * D.17234;
  unsigned int D.17235;
  unsigned int D.17238;
  int D.17239;
  int D.17242;
  struct FILE * gc_debug_file.4;
  const char * iftmp.5;
  int D.17259;
  int count;
  int result;
  struct SgenThreadInfo * info;
  int signum;
  MonoNativeThreadId me;

  if (suspend != 0) goto <D.17228>; else goto <D.17229>;
  <D.17228>:
  iftmp.3 = 19;
  goto <D.17230>;
  <D.17229>:
  iftmp.3 = 30;
  <D.17230>:
  signum = iftmp.3;
  me = mono_native_thread_id_get ();
  count = 0;
  {
    struct MonoThreadHazardPointers * __hp;
    struct MonoLinkedListSetNode * __cur;
    struct MonoLinkedListSetNode * __next;

    __hp = mono_hazard_pointer_get ();
    D.17231 = mono_thread_info_list_head ();
    D.17232 = &D.17231->head;
    D.17233 = get_hazardous_pointer (D.17232, __hp, 1);
    __cur = mono_lls_pointer_unmask (D.17233);
    goto <D.17199>;
    <D.17198>:
    D.17234 = &__cur->next;
    __next = get_hazardous_pointer_with_mask (D.17234, __hp, 0);
    D.17235 = mono_lls_pointer_get_mark (__next);
    if (D.17235 == 0) goto <D.17236>; else goto <D.17237>;
    <D.17236>:
    info = __cur;
    D.17238 = MEM[(struct MonoThreadInfo *)info].node.key;
    D.17239 = mono_native_thread_id_equals (D.17238, me);
    if (D.17239 != 0) goto <D.17240>; else goto <D.17241>;
    <D.17240>:
    // predicted unlikely by continue predictor.
    goto <D.17197>;
    <D.17241>:
    D.17242 = info->gc_disabled;
    if (D.17242 != 0) goto <D.17243>; else goto <D.17244>;
    <D.17243>:
    // predicted unlikely by continue predictor.
    goto <D.17197>;
    <D.17244>:
    result = mono_threads_pthread_kill (info, signum);
    if (result == 0) goto <D.17245>; else goto <D.17246>;
    <D.17245>:
    count = count + 1;
    goto <D.17247>;
    <D.17246>:
    info->skip = 1;
    <D.17247>:
    <D.17237>:
    <D.17197>:
    __cur = mono_lls_info_step (__next, __hp);
    <D.17199>:
    if (__cur != 0B) goto <D.17198>; else goto <D.17200>;
    <D.17200>:
    if (0 != 0) goto <D.17248>; else goto <D.17249>;
    <D.17248>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-os-posix.c", 197, "(0) >= 0 && (0) < HAZARD_POINTER_COUNT");
    <D.17249>:
    __hp->hazard_pointers[0] = 0B;
    if (0 != 0) goto <D.17250>; else goto <D.17251>;
    <D.17250>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-os-posix.c", 197, "(1) >= 0 && (1) < HAZARD_POINTER_COUNT");
    <D.17251>:
    __hp->hazard_pointers[1] = 0B;
  }
  sgen_wait_for_suspend_ack (count);
  if (0 != 0) goto <D.17252>; else goto <D.17253>;
  <D.17252>:
  gc_debug_file.4 = gc_debug_file;
  if (suspend != 0) goto <D.17256>; else goto <D.17257>;
  <D.17256>:
  iftmp.5 = "suspend";
  goto <D.17258>;
  <D.17257>:
  iftmp.5 = "resume";
  <D.17258>:
  fprintf (gc_debug_file.4, "%s handshake for %d threads\n\n", iftmp.5, count);
  gc_debug_file.4 = gc_debug_file;
  fflush (gc_debug_file.4);
  <D.17253>:
  D.17259 = count;
  return D.17259;
}


mono_lls_pointer_unmask (void * p)
{
  void * D.17261;
  unsigned int p.6;
  unsigned int D.17263;

  p.6 = (unsigned int) p;
  D.17263 = p.6 & 4294967292;
  D.17261 = (void *) D.17263;
  return D.17261;
}


mono_lls_pointer_get_mark (void * n)
{
  uintptr_t D.17265;
  unsigned int n.7;

  n.7 = (unsigned int) n;
  D.17265 = n.7 & 1;
  return D.17265;
}


mono_lls_info_step (struct MonoLinkedListSetNode * val, struct MonoThreadHazardPointers * hp)
{
  struct MonoLinkedListSetNode * D.17270;

  val = mono_lls_pointer_unmask (val);
  if (0 != 0) goto <D.17268>; else goto <D.17269>;
  <D.17268>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/utils/mono-linked-list-set.h", 77, "(1) >= 0 && (1) < HAZARD_POINTER_COUNT");
  <D.17269>:
  hp->hazard_pointers[1] = val;
  mono_memory_write_barrier ();
  D.17270 = val;
  return D.17270;
}


mono_memory_write_barrier ()
{
  mono_memory_barrier ();
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


sgen_os_init ()
{
  int suspend_signal_num.8;
  int D.17273;
  int restart_signal_num.9;
  int D.17277;
  struct sigaction sinfo;

  try
    {
      suspend_ack_semaphore_ptr = &suspend_ack_semaphore;
      sem_init (&suspend_ack_semaphore, 0, 0);
      sigfillset (&sinfo.sa_mask);
      sinfo.sa_flags = 268435464;
      sinfo.__sigaction_handler.sa_sigaction = suspend_handler;
      suspend_signal_num.8 = 19;
      D.17273 = sigaction (suspend_signal_num.8, &sinfo, 0B);
      if (D.17273 != 0) goto <D.17274>; else goto <D.17275>;
      <D.17274>:
      monoeg_g_log (0B, 4, "failed sigaction");
      <D.17205>:
      goto <D.17205>;
      <D.17275>:
      sinfo.__sigaction_handler.sa_handler = restart_handler;
      restart_signal_num.9 = 30;
      D.17277 = sigaction (restart_signal_num.9, &sinfo, 0B);
      if (D.17277 != 0) goto <D.17278>; else goto <D.17279>;
      <D.17278>:
      monoeg_g_log (0B, 4, "failed sigaction");
      <D.17206>:
      goto <D.17206>;
      <D.17279>:
      sigfillset (&suspend_signal_mask);
      restart_signal_num.9 = 30;
      sigdelset (&suspend_signal_mask, restart_signal_num.9);
      sigemptyset (&suspend_ack_signal_mask);
      restart_signal_num.9 = 30;
      sigaddset (&suspend_ack_signal_mask, restart_signal_num.9);
    }
  finally
    {
      sinfo = {CLOBBER};
    }
}


restart_handler (int sig)
{
  int * D.17280;
  struct FILE * gc_debug_file.10;
  long unsigned int D.17284;
  void * D.17285;
  struct SgenThreadInfo * info;
  int old_errno;

  D.17280 = __errno_location ();
  old_errno = *D.17280;
  info = mono_thread_info_current ();
  info->signal = 30;
  if (0 != 0) goto <D.17281>; else goto <D.17282>;
  <D.17281>:
  gc_debug_file.10 = gc_debug_file;
  D.17284 = mono_native_thread_id_get ();
  D.17285 = (void *) D.17284;
  fprintf (gc_debug_file.10, "Restart handler in %p %p\n", info, D.17285);
  gc_debug_file.10 = gc_debug_file;
  fflush (gc_debug_file.10);
  <D.17282>:
  D.17280 = __errno_location ();
  *D.17280 = old_errno;
}


suspend_handler (int sig, struct siginfo_t * siginfo, void * context)
{
  int * D.17286;
  struct SgenThreadInfo * info;
  int old_errno;

  D.17286 = __errno_location ();
  old_errno = *D.17286;
  info = mono_thread_info_current ();
  suspend_thread (info, context);
  D.17286 = __errno_location ();
  *D.17286 = old_errno;
}


suspend_thread (struct SgenThreadInfo * info, void * context)
{
  struct MonoDomain * D.17287;
  void * iftmp.11;
  long long unsigned int D.17291;
  unsigned int D.17292;
  unsigned int sgen_global_stop_count.12;
  void * iftmp.13;
  long long unsigned int D.17300;
  unsigned int D.17301;
  void * D.17305;
  void * D.17307;
  void * D.17308;
  struct MonoContext * D.17312;
  _Bool D.17314;
  long int D.17315;
  long int D.17316;
  struct MonoGCCallbacks * D.17319;
  void (*<T29ff>) (void *, void *, struct MonoContext *) D.17320;
  struct MonoGCCallbacks * D.17323;
  void (*<T29ff>) (void *, void *, struct MonoContext *) D.17324;
  void * D.17325;
  struct FILE * gc_debug_file.14;
  long unsigned int D.17329;
  void * D.17330;
  union MonoSemType * suspend_ack_semaphore_ptr.15;
  unsigned int stop_count.16;
  int D.17333;
  long unsigned int D.17336;
  void * D.17337;
  int stop_count;
  void * stack_start;

  D.17287 = mono_domain_get ();
  info->stopped_domain = D.17287;
  if (context != 0B) goto <D.17289>; else goto <D.17290>;
  <D.17289>:
  D.17291 = MEM[(struct ucontext_t *)context].uc_mcontext.pc;
  D.17292 = (unsigned int) D.17291;
  iftmp.11 = (void *) D.17292;
  goto <D.17293>;
  <D.17290>:
  iftmp.11 = 0B;
  <D.17293>:
  info->stopped_ip = iftmp.11;
  info->signal = 0;
  sgen_global_stop_count.12 = sgen_global_stop_count;
  stop_count = (int) sgen_global_stop_count.12;
  if (0 != 0) goto <D.17295>; else goto <D.17296>;
  <D.17295>:
  return;
  <D.17296>:
  if (context != 0B) goto <D.17298>; else goto <D.17299>;
  <D.17298>:
  D.17300 = MEM[(struct ucontext_t *)context].uc_mcontext.gregs[29];
  D.17301 = (unsigned int) D.17300;
  iftmp.13 = (void *) D.17301;
  goto <D.17302>;
  <D.17299>:
  iftmp.13 = 0B;
  <D.17302>:
  stack_start = iftmp.13;
  D.17305 = info->stack_start_limit;
  if (D.17305 <= stack_start) goto <D.17306>; else goto <D.17303>;
  <D.17306>:
  D.17307 = info->stack_start;
  D.17308 = info->stack_end;
  if (D.17307 <= D.17308) goto <D.17309>; else goto <D.17303>;
  <D.17309>:
  info->stack_start = stack_start;
  if (context != 0B) goto <D.17310>; else goto <D.17311>;
  <D.17310>:
  D.17312 = &info->ctx;
  mono_sigctx_to_monoctx (context, D.17312);
  goto <D.17313>;
  <D.17311>:
  D.17312 = &info->ctx;
  memset (D.17312, 0, 260);
  <D.17313>:
  goto <D.17304>;
  <D.17303>:
  D.17307 = info->stack_start;
  D.17314 = D.17307 != 0B;
  D.17315 = (long int) D.17314;
  D.17316 = __builtin_expect (D.17315, 0);
  if (D.17316 != 0) goto <D.17317>; else goto <D.17318>;
  <D.17317>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-os-posix.c", 90, "!info->stack_start");
  <D.17318>:
  <D.17304>:
  D.17319 = mono_gc_get_gc_callbacks ();
  D.17320 = D.17319->thread_suspend_func;
  if (D.17320 != 0B) goto <D.17321>; else goto <D.17322>;
  <D.17321>:
  D.17323 = mono_gc_get_gc_callbacks ();
  D.17324 = D.17323->thread_suspend_func;
  D.17325 = info->runtime_data;
  D.17324 (D.17325, context, 0B);
  <D.17322>:
  if (0 != 0) goto <D.17326>; else goto <D.17327>;
  <D.17326>:
  gc_debug_file.14 = gc_debug_file;
  D.17329 = mono_native_thread_id_get ();
  D.17330 = (void *) D.17329;
  fprintf (gc_debug_file.14, "Posting suspend_ack_semaphore for suspend from %p %p\n", info, D.17330);
  gc_debug_file.14 = gc_debug_file;
  fflush (gc_debug_file.14);
  <D.17327>:
  pthread_sigmask (1, &suspend_ack_signal_mask, 0B);
  suspend_ack_semaphore_ptr.15 = suspend_ack_semaphore_ptr;
  mono_sem_post (suspend_ack_semaphore_ptr.15);
  stop_count.16 = (unsigned int) stop_count;
  info->stop_count = stop_count.16;
  <D.17154>:
  info->signal = 0;
  sigsuspend (&suspend_signal_mask);
  D.17333 = info->signal;
  if (D.17333 != 30) goto <D.17154>; else goto <D.17155>;
  <D.17155>:
  pthread_sigmask (2, &suspend_ack_signal_mask, 0B);
  if (0 != 0) goto <D.17334>; else goto <D.17335>;
  <D.17334>:
  gc_debug_file.14 = gc_debug_file;
  D.17336 = mono_native_thread_id_get ();
  D.17337 = (void *) D.17336;
  fprintf (gc_debug_file.14, "Posting suspend_ack_semaphore for resume from %p %p\n\n", info, D.17337);
  gc_debug_file.14 = gc_debug_file;
  fflush (gc_debug_file.14);
  <D.17335>:
  suspend_ack_semaphore_ptr.15 = suspend_ack_semaphore_ptr;
  mono_sem_post (suspend_ack_semaphore_ptr.15);
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17341;
  int D.17346;
  void * D.17348;
  unsigned int D.17349;

  D.17341 = __builtin_constant_p (__len);
  if (D.17341 != 0) goto <D.17342>; else goto <D.17343>;
  <D.17342>:
  if (__len == 0) goto <D.17344>; else goto <D.17345>;
  <D.17344>:
  D.17346 = __builtin_constant_p (__ch);
  if (D.17346 == 0) goto <D.17339>; else goto <D.17347>;
  <D.17347>:
  if (__ch != 0) goto <D.17339>; else goto <D.17340>;
  <D.17339>:
  __warn_memset_zero_len ();
  D.17348 = __dest;
  return D.17348;
  <D.17340>:
  <D.17345>:
  <D.17343>:
  D.17349 = __builtin_object_size (__dest, 0);
  D.17348 = __builtin___memset_chk (__dest, __ch, __len, D.17349);
  return D.17348;
}


mono_gc_get_suspend_signal ()
{
  int D.17351;

  D.17351 = 19;
  return D.17351;
}


