__attribute__((visibility ("hidden")))
sgen_gray_object_alloc_queue_section (struct SgenGrayQueue * queue)
{
  void (*<T2c80>) (struct SgenGrayQueue *) D.17797;
  struct GrayQueueSection * D.17800;
  struct GrayQueueSection * D.17803;
  struct GrayQueueSection * D.17805;
  struct GrayQueueSection * section;

  D.17797 = queue->alloc_prepare_func;
  if (D.17797 != 0B) goto <D.17798>; else goto <D.17799>;
  <D.17798>:
  D.17797 = queue->alloc_prepare_func;
  D.17797 (queue);
  <D.17799>:
  D.17800 = queue->free_list;
  if (D.17800 != 0B) goto <D.17801>; else goto <D.17802>;
  <D.17801>:
  section = queue->free_list;
  D.17803 = section->next;
  queue->free_list = D.17803;
  goto <D.17804>;
  <D.17802>:
  section = sgen_alloc_internal (14);
  <D.17804>:
  section->end = 0;
  D.17805 = queue->first;
  section->next = D.17805;
  queue->first = section;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_free_queue_section (struct GrayQueueSection * section)
{
  sgen_free_internal (section, 14);
}


__attribute__((visibility ("hidden")))
sgen_gray_object_enqueue (struct SgenGrayQueue * queue, char * obj)
{
  int iftmp.0;
  struct GrayQueueSection * D.17812;
  int D.17814;
  _Bool D.17815;
  long int D.17816;
  long int D.17817;
  int D.17822;
  int D.17823;

  if (0 != 0) goto <D.17806>; else goto <D.17807>;
  <D.17806>:
  monoeg_g_log (0B, 4, "enqueueing a null object");
  <D.17723>:
  goto <D.17723>;
  <D.17807>:
  D.17812 = queue->first;
  if (D.17812 == 0B) goto <D.17809>; else goto <D.17813>;
  <D.17813>:
  D.17812 = queue->first;
  D.17814 = D.17812->end;
  if (D.17814 == 125) goto <D.17809>; else goto <D.17810>;
  <D.17809>:
  iftmp.0 = 1;
  goto <D.17811>;
  <D.17810>:
  iftmp.0 = 0;
  <D.17811>:
  D.17815 = iftmp.0 != 0;
  D.17816 = (long int) D.17815;
  D.17817 = __builtin_expect (D.17816, 0);
  if (D.17817 != 0) goto <D.17818>; else goto <D.17819>;
  <D.17818>:
  sgen_gray_object_alloc_queue_section (queue);
  <D.17819>:
  if (0 != 0) goto <D.17820>; else goto <D.17821>;
  <D.17820>:
  D.17812 = queue->first;
  D.17812 = queue->first;
  D.17814 = D.17812->end;
  monoeg_g_log (0B, 4, "gray queue %p overflow, first %p, end %d", queue, D.17812, D.17814);
  <D.17724>:
  goto <D.17724>;
  <D.17821>:
  D.17812 = queue->first;
  D.17812 = queue->first;
  D.17814 = D.17812->end;
  D.17822 = D.17814;
  D.17823 = D.17822 + 1;
  D.17812->end = D.17823;
  D.17812->objects[D.17822] = obj;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_dequeue (struct SgenGrayQueue * queue)
{
  int D.17824;
  char * D.17827;
  struct GrayQueueSection * D.17830;
  int D.17831;
  int D.17832;
  _Bool D.17833;
  long int D.17834;
  long int D.17835;
  struct GrayQueueSection * D.17838;
  struct GrayQueueSection * D.17839;
  char * obj;

  D.17824 = sgen_gray_object_queue_is_empty (queue);
  if (D.17824 != 0) goto <D.17825>; else goto <D.17826>;
  <D.17825>:
  D.17827 = 0B;
  return D.17827;
  <D.17826>:
  if (0 != 0) goto <D.17828>; else goto <D.17829>;
  <D.17828>:
  D.17830 = queue->first;
  D.17830 = queue->first;
  D.17831 = D.17830->end;
  monoeg_g_log (0B, 4, "gray queue %p underflow, first %p, end %d", queue, D.17830, D.17831);
  <D.17729>:
  goto <D.17729>;
  <D.17829>:
  D.17830 = queue->first;
  D.17830 = queue->first;
  D.17831 = D.17830->end;
  D.17832 = D.17831 + -1;
  D.17830->end = D.17832;
  D.17831 = D.17830->end;
  obj = D.17830->objects[D.17831];
  D.17830 = queue->first;
  D.17831 = D.17830->end;
  D.17833 = D.17831 == 0;
  D.17834 = (long int) D.17833;
  D.17835 = __builtin_expect (D.17834, 0);
  if (D.17835 != 0) goto <D.17836>; else goto <D.17837>;
  <D.17836>:
  {
    struct GrayQueueSection * section;

    section = queue->first;
    D.17838 = section->next;
    queue->first = D.17838;
    D.17839 = queue->free_list;
    section->next = D.17839;
    queue->free_list = section;
  }
  <D.17837>:
  D.17827 = obj;
  return D.17827;
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.17841;
  struct GrayQueueSection * D.17842;
  _Bool D.17843;

  D.17842 = queue->first;
  D.17843 = D.17842 == 0B;
  D.17841 = (gboolean) D.17843;
  return D.17841;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_dequeue_section (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.17845;
  struct GrayQueueSection * D.17848;
  struct GrayQueueSection * D.17849;
  struct GrayQueueSection * section;

  D.17845 = queue->first;
  if (D.17845 == 0B) goto <D.17846>; else goto <D.17847>;
  <D.17846>:
  D.17848 = 0B;
  return D.17848;
  <D.17847>:
  section = queue->first;
  D.17849 = section->next;
  queue->first = D.17849;
  section->next = 0B;
  D.17848 = section;
  return D.17848;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_enqueue_section (struct SgenGrayQueue * queue, struct GrayQueueSection * section)
{
  struct GrayQueueSection * D.17851;

  D.17851 = queue->first;
  section->next = D.17851;
  queue->first = section;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_queue_init (struct SgenGrayQueue * queue, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func)
{
  int D.17852;
  _Bool D.17853;
  long int D.17854;
  long int D.17855;
  struct GrayQueueSection * D.17861;
  struct GrayQueueSection * D.17862;
  struct GrayQueueSection * section;
  struct GrayQueueSection * next;
  int i;

  D.17852 = sgen_gray_object_queue_is_empty (queue);
  D.17853 = D.17852 == 0;
  D.17854 = (long int) D.17853;
  D.17855 = __builtin_expect (D.17854, 0);
  if (D.17855 != 0) goto <D.17856>; else goto <D.17857>;
  <D.17856>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 168, "sgen_gray_object_queue_is_empty (queue)");
  <D.17857>:
  queue->alloc_prepare_func = 0B;
  queue->alloc_prepare_data = 0B;
  i = 0;
  section = queue->free_list;
  goto <D.17747>;
  <D.17746>:
  i = i + 1;
  section = section->next;
  <D.17747>:
  if (section != 0B) goto <D.17858>; else goto <D.17748>;
  <D.17858>:
  if (i <= 62) goto <D.17746>; else goto <D.17748>;
  <D.17748>:
  if (section == 0B) goto <D.17859>; else goto <D.17860>;
  <D.17859>:
  return;
  <D.17860>:
  goto <D.17750>;
  <D.17749>:
  next = section->next;
  D.17861 = next->next;
  section->next = D.17861;
  sgen_gray_object_free_queue_section (next);
  <D.17750>:
  D.17862 = section->next;
  if (D.17862 != 0B) goto <D.17749>; else goto <D.17751>;
  <D.17751>:
}


__attribute__((visibility ("hidden")))
sgen_gray_object_queue_init_invalid (struct SgenGrayQueue * queue)
{
  sgen_gray_object_queue_init (queue, 0B);
  queue->alloc_prepare_func = invalid_prepare_func;
  queue->alloc_prepare_data = 0B;
}


invalid_prepare_func (struct SgenGrayQueue * queue)
{
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gray.c", 195);
}


__attribute__((visibility ("hidden")))
sgen_gray_object_queue_init_with_alloc_prepare (struct SgenGrayQueue * queue, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func, void (*GrayQueueAllocPrepareFunc) (struct SgenGrayQueue *) alloc_prepare_func, void * data)
{
  sgen_gray_object_queue_init (queue, enqueue_check_func);
  queue->alloc_prepare_func = alloc_prepare_func;
  queue->alloc_prepare_data = data;
}


__attribute__((visibility ("hidden")))
sgen_gray_object_queue_deinit (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.17864;
  _Bool D.17865;
  long int D.17866;
  long int D.17867;
  struct GrayQueueSection * D.17870;

  D.17864 = queue->first;
  D.17865 = D.17864 != 0B;
  D.17866 = (long int) D.17865;
  D.17867 = __builtin_expect (D.17866, 0);
  if (D.17867 != 0) goto <D.17868>; else goto <D.17869>;
  <D.17868>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 218, "!queue->first");
  <D.17869>:
  goto <D.17769>;
  <D.17768>:
  {
    struct GrayQueueSection * next;

    D.17870 = queue->free_list;
    next = D.17870->next;
    D.17870 = queue->free_list;
    sgen_gray_object_free_queue_section (D.17870);
    queue->free_list = next;
  }
  <D.17769>:
  D.17870 = queue->free_list;
  if (D.17870 != 0B) goto <D.17768>; else goto <D.17770>;
  <D.17770>:
}


__attribute__((visibility ("hidden")))
sgen_gray_object_queue_disable_alloc_prepare (struct SgenGrayQueue * queue)
{
  queue->alloc_prepare_func = 0B;
  queue->alloc_prepare_data = 0B;
}


__attribute__((visibility ("hidden")))
sgen_section_gray_queue_init (struct SgenSectionGrayQueue * queue, gboolean locked, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func)
{
  int D.17871;
  _Bool D.17872;
  long int D.17873;
  long int D.17874;
  union mono_mutex_t * D.17879;

  D.17871 = sgen_section_gray_queue_is_empty (queue);
  D.17872 = D.17871 == 0;
  D.17873 = (long int) D.17872;
  D.17874 = __builtin_expect (D.17873, 0);
  if (D.17874 != 0) goto <D.17875>; else goto <D.17876>;
  <D.17875>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 255, "sgen_section_gray_queue_is_empty (queue)");
  <D.17876>:
  queue->locked = locked;
  if (locked != 0) goto <D.17877>; else goto <D.17878>;
  <D.17877>:
  D.17879 = &queue->lock;
  mono_mutex_init_recursive (D.17879);
  <D.17878>:
}


mono_mutex_init_recursive (union mono_mutex_t * mutex)
{
  int D.17880;
  int res;
  union pthread_mutexattr_t attr;

  try
    {
      pthread_mutexattr_init (&attr);
      pthread_mutexattr_settype (&attr, 1);
      res = pthread_mutex_init (mutex, &attr);
      pthread_mutexattr_destroy (&attr);
      D.17880 = res;
      return D.17880;
    }
  finally
    {
      attr = {CLOBBER};
    }
}


__attribute__((visibility ("hidden")))
sgen_section_gray_queue_is_empty (struct SgenSectionGrayQueue * queue)
{
  gboolean D.17883;
  struct GrayQueueSection * D.17884;
  _Bool D.17885;

  D.17884 = queue->first;
  D.17885 = D.17884 == 0B;
  D.17883 = (gboolean) D.17885;
  return D.17883;
}


__attribute__((visibility ("hidden")))
sgen_section_gray_queue_dequeue (struct SgenSectionGrayQueue * queue)
{
  struct GrayQueueSection * D.17887;
  struct GrayQueueSection * D.17890;
  struct GrayQueueSection * D.17892;
  struct GrayQueueSection * section;

  lock_section_queue (queue);
  D.17887 = queue->first;
  if (D.17887 != 0B) goto <D.17888>; else goto <D.17889>;
  <D.17888>:
  section = queue->first;
  D.17890 = section->next;
  queue->first = D.17890;
  section->next = 0B;
  goto <D.17891>;
  <D.17889>:
  section = 0B;
  <D.17891>:
  unlock_section_queue (queue);
  D.17892 = section;
  return D.17892;
}


lock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17894;
  union mono_mutex_t * D.17897;

  D.17894 = queue->locked;
  if (D.17894 == 0) goto <D.17895>; else goto <D.17896>;
  <D.17895>:
  return;
  <D.17896>:
  D.17897 = &queue->lock;
  pthread_mutex_lock (D.17897);
}


unlock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17899;
  union mono_mutex_t * D.17902;

  D.17899 = queue->locked;
  if (D.17899 == 0) goto <D.17900>; else goto <D.17901>;
  <D.17900>:
  return;
  <D.17901>:
  D.17902 = &queue->lock;
  pthread_mutex_unlock (D.17902);
}


__attribute__((visibility ("hidden")))
sgen_section_gray_queue_enqueue (struct SgenSectionGrayQueue * queue, struct GrayQueueSection * section)
{
  struct GrayQueueSection * D.17904;

  lock_section_queue (queue);
  D.17904 = queue->first;
  section->next = D.17904;
  queue->first = section;
  unlock_section_queue (queue);
}


