sgen_gray_object_alloc_queue_section (struct SgenGrayQueue * queue)
{
  void (*<T2a8a>) (struct SgenGrayQueue *) D.17270;
  struct GrayQueueSection * D.17273;
  struct GrayQueueSection * D.17276;
  struct GrayQueueSection * D.17278;
  struct GrayQueueSection * section;

  D.17270 = queue->alloc_prepare_func;
  if (D.17270 != 0B) goto <D.17271>; else goto <D.17272>;
  <D.17271>:
  D.17270 = queue->alloc_prepare_func;
  D.17270 (queue);
  <D.17272>:
  D.17273 = queue->free_list;
  if (D.17273 != 0B) goto <D.17274>; else goto <D.17275>;
  <D.17274>:
  section = queue->free_list;
  D.17276 = section->next;
  queue->free_list = D.17276;
  goto <D.17277>;
  <D.17275>:
  section = sgen_alloc_internal (14);
  <D.17277>:
  section->end = 0;
  D.17278 = queue->first;
  section->next = D.17278;
  queue->first = section;
}


sgen_gray_object_free_queue_section (struct GrayQueueSection * section)
{
  sgen_free_internal (section, 14);
}


sgen_gray_object_enqueue (struct SgenGrayQueue * queue, char * obj)
{
  int iftmp.0;
  struct GrayQueueSection * D.17285;
  int D.17287;
  _Bool D.17288;
  long int D.17289;
  long int D.17290;
  int D.17295;
  int D.17296;

  if (0 != 0) goto <D.17279>; else goto <D.17280>;
  <D.17279>:
  monoeg_g_log (0B, 4, "enqueueing a null object");
  <D.17196>:
  goto <D.17196>;
  <D.17280>:
  D.17285 = queue->first;
  if (D.17285 == 0B) goto <D.17282>; else goto <D.17286>;
  <D.17286>:
  D.17285 = queue->first;
  D.17287 = D.17285->end;
  if (D.17287 == 125) goto <D.17282>; else goto <D.17283>;
  <D.17282>:
  iftmp.0 = 1;
  goto <D.17284>;
  <D.17283>:
  iftmp.0 = 0;
  <D.17284>:
  D.17288 = iftmp.0 != 0;
  D.17289 = (long int) D.17288;
  D.17290 = __builtin_expect (D.17289, 0);
  if (D.17290 != 0) goto <D.17291>; else goto <D.17292>;
  <D.17291>:
  sgen_gray_object_alloc_queue_section (queue);
  <D.17292>:
  if (0 != 0) goto <D.17293>; else goto <D.17294>;
  <D.17293>:
  D.17285 = queue->first;
  D.17285 = queue->first;
  D.17287 = D.17285->end;
  monoeg_g_log (0B, 4, "gray queue %p overflow, first %p, end %d", queue, D.17285, D.17287);
  <D.17197>:
  goto <D.17197>;
  <D.17294>:
  D.17285 = queue->first;
  D.17285 = queue->first;
  D.17287 = D.17285->end;
  D.17295 = D.17287;
  D.17296 = D.17295 + 1;
  D.17285->end = D.17296;
  D.17285->objects[D.17295] = obj;
}


sgen_gray_object_dequeue (struct SgenGrayQueue * queue)
{
  int D.17297;
  char * D.17300;
  struct GrayQueueSection * D.17303;
  int D.17304;
  int D.17305;
  _Bool D.17306;
  long int D.17307;
  long int D.17308;
  struct GrayQueueSection * D.17311;
  struct GrayQueueSection * D.17312;
  char * obj;

  D.17297 = sgen_gray_object_queue_is_empty (queue);
  if (D.17297 != 0) goto <D.17298>; else goto <D.17299>;
  <D.17298>:
  D.17300 = 0B;
  return D.17300;
  <D.17299>:
  if (0 != 0) goto <D.17301>; else goto <D.17302>;
  <D.17301>:
  D.17303 = queue->first;
  D.17303 = queue->first;
  D.17304 = D.17303->end;
  monoeg_g_log (0B, 4, "gray queue %p underflow, first %p, end %d", queue, D.17303, D.17304);
  <D.17202>:
  goto <D.17202>;
  <D.17302>:
  D.17303 = queue->first;
  D.17303 = queue->first;
  D.17304 = D.17303->end;
  D.17305 = D.17304 + -1;
  D.17303->end = D.17305;
  D.17304 = D.17303->end;
  obj = D.17303->objects[D.17304];
  D.17303 = queue->first;
  D.17304 = D.17303->end;
  D.17306 = D.17304 == 0;
  D.17307 = (long int) D.17306;
  D.17308 = __builtin_expect (D.17307, 0);
  if (D.17308 != 0) goto <D.17309>; else goto <D.17310>;
  <D.17309>:
  {
    struct GrayQueueSection * section;

    section = queue->first;
    D.17311 = section->next;
    queue->first = D.17311;
    D.17312 = queue->free_list;
    section->next = D.17312;
    queue->free_list = section;
  }
  <D.17310>:
  D.17300 = obj;
  return D.17300;
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.17314;
  struct GrayQueueSection * D.17315;
  _Bool D.17316;

  D.17315 = queue->first;
  D.17316 = D.17315 == 0B;
  D.17314 = (gboolean) D.17316;
  return D.17314;
}


sgen_gray_object_dequeue_section (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.17318;
  struct GrayQueueSection * D.17321;
  struct GrayQueueSection * D.17322;
  struct GrayQueueSection * section;

  D.17318 = queue->first;
  if (D.17318 == 0B) goto <D.17319>; else goto <D.17320>;
  <D.17319>:
  D.17321 = 0B;
  return D.17321;
  <D.17320>:
  section = queue->first;
  D.17322 = section->next;
  queue->first = D.17322;
  section->next = 0B;
  D.17321 = section;
  return D.17321;
}


sgen_gray_object_enqueue_section (struct SgenGrayQueue * queue, struct GrayQueueSection * section)
{
  struct GrayQueueSection * D.17324;

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


sgen_gray_object_queue_init (struct SgenGrayQueue * queue, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func)
{
  int D.17325;
  _Bool D.17326;
  long int D.17327;
  long int D.17328;
  struct GrayQueueSection * D.17334;
  struct GrayQueueSection * D.17335;
  struct GrayQueueSection * section;
  struct GrayQueueSection * next;
  int i;

  D.17325 = sgen_gray_object_queue_is_empty (queue);
  D.17326 = D.17325 == 0;
  D.17327 = (long int) D.17326;
  D.17328 = __builtin_expect (D.17327, 0);
  if (D.17328 != 0) goto <D.17329>; else goto <D.17330>;
  <D.17329>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 168, "sgen_gray_object_queue_is_empty (queue)");
  <D.17330>:
  queue->alloc_prepare_func = 0B;
  queue->alloc_prepare_data = 0B;
  i = 0;
  section = queue->free_list;
  goto <D.17220>;
  <D.17219>:
  i = i + 1;
  section = section->next;
  <D.17220>:
  if (section != 0B) goto <D.17331>; else goto <D.17221>;
  <D.17331>:
  if (i <= 62) goto <D.17219>; else goto <D.17221>;
  <D.17221>:
  if (section == 0B) goto <D.17332>; else goto <D.17333>;
  <D.17332>:
  return;
  <D.17333>:
  goto <D.17223>;
  <D.17222>:
  next = section->next;
  D.17334 = next->next;
  section->next = D.17334;
  sgen_gray_object_free_queue_section (next);
  <D.17223>:
  D.17335 = section->next;
  if (D.17335 != 0B) goto <D.17222>; else goto <D.17224>;
  <D.17224>:
}


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);
}


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;
}


sgen_gray_object_queue_deinit (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.17337;
  _Bool D.17338;
  long int D.17339;
  long int D.17340;
  struct GrayQueueSection * D.17343;

  D.17337 = queue->first;
  D.17338 = D.17337 != 0B;
  D.17339 = (long int) D.17338;
  D.17340 = __builtin_expect (D.17339, 0);
  if (D.17340 != 0) goto <D.17341>; else goto <D.17342>;
  <D.17341>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 218, "!queue->first");
  <D.17342>:
  goto <D.17242>;
  <D.17241>:
  {
    struct GrayQueueSection * next;

    D.17343 = queue->free_list;
    next = D.17343->next;
    D.17343 = queue->free_list;
    sgen_gray_object_free_queue_section (D.17343);
    queue->free_list = next;
  }
  <D.17242>:
  D.17343 = queue->free_list;
  if (D.17343 != 0B) goto <D.17241>; else goto <D.17243>;
  <D.17243>:
}


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


sgen_section_gray_queue_init (struct SgenSectionGrayQueue * queue, gboolean locked, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func)
{
  int D.17344;
  _Bool D.17345;
  long int D.17346;
  long int D.17347;
  union mono_mutex_t * D.17352;

  D.17344 = sgen_section_gray_queue_is_empty (queue);
  D.17345 = D.17344 == 0;
  D.17346 = (long int) D.17345;
  D.17347 = __builtin_expect (D.17346, 0);
  if (D.17347 != 0) goto <D.17348>; else goto <D.17349>;
  <D.17348>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 255, "sgen_section_gray_queue_is_empty (queue)");
  <D.17349>:
  queue->locked = locked;
  if (locked != 0) goto <D.17350>; else goto <D.17351>;
  <D.17350>:
  D.17352 = &queue->lock;
  mono_mutex_init_recursive (D.17352);
  <D.17351>:
}


mono_mutex_init_recursive (union mono_mutex_t * mutex)
{
  int D.17353;
  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.17353 = res;
      return D.17353;
    }
  finally
    {
      attr = {CLOBBER};
    }
}


sgen_section_gray_queue_is_empty (struct SgenSectionGrayQueue * queue)
{
  gboolean D.17356;
  struct GrayQueueSection * D.17357;
  _Bool D.17358;

  D.17357 = queue->first;
  D.17358 = D.17357 == 0B;
  D.17356 = (gboolean) D.17358;
  return D.17356;
}


sgen_section_gray_queue_dequeue (struct SgenSectionGrayQueue * queue)
{
  struct GrayQueueSection * D.17360;
  struct GrayQueueSection * D.17363;
  struct GrayQueueSection * D.17365;
  struct GrayQueueSection * section;

  lock_section_queue (queue);
  D.17360 = queue->first;
  if (D.17360 != 0B) goto <D.17361>; else goto <D.17362>;
  <D.17361>:
  section = queue->first;
  D.17363 = section->next;
  queue->first = D.17363;
  section->next = 0B;
  goto <D.17364>;
  <D.17362>:
  section = 0B;
  <D.17364>:
  unlock_section_queue (queue);
  D.17365 = section;
  return D.17365;
}


lock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17367;
  union mono_mutex_t * D.17370;

  D.17367 = queue->locked;
  if (D.17367 == 0) goto <D.17368>; else goto <D.17369>;
  <D.17368>:
  return;
  <D.17369>:
  D.17370 = &queue->lock;
  pthread_mutex_lock (D.17370);
}


unlock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17372;
  union mono_mutex_t * D.17375;

  D.17372 = queue->locked;
  if (D.17372 == 0) goto <D.17373>; else goto <D.17374>;
  <D.17373>:
  return;
  <D.17374>:
  D.17375 = &queue->lock;
  pthread_mutex_unlock (D.17375);
}


sgen_section_gray_queue_enqueue (struct SgenSectionGrayQueue * queue, struct GrayQueueSection * section)
{
  struct GrayQueueSection * D.17377;

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


