sgen_gray_object_alloc_queue_section (struct SgenGrayQueue * queue)
{
  void (*<T2a90>) (struct SgenGrayQueue *) D.17290;
  struct GrayQueueSection * D.17293;
  struct GrayQueueSection * D.17296;
  struct GrayQueueSection * D.17298;
  struct GrayQueueSection * section;

  D.17290 = queue->alloc_prepare_func;
  if (D.17290 != 0B) goto <D.17291>; else goto <D.17292>;
  <D.17291>:
  D.17290 = queue->alloc_prepare_func;
  D.17290 (queue);
  <D.17292>:
  D.17293 = queue->free_list;
  if (D.17293 != 0B) goto <D.17294>; else goto <D.17295>;
  <D.17294>:
  section = queue->free_list;
  D.17296 = section->next;
  queue->free_list = D.17296;
  goto <D.17297>;
  <D.17295>:
  section = sgen_alloc_internal (14);
  <D.17297>:
  section->end = 0;
  D.17298 = queue->first;
  section->next = D.17298;
  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.17305;
  int D.17307;
  _Bool D.17308;
  long int D.17309;
  long int D.17310;
  int D.17315;
  int D.17316;

  if (0 != 0) goto <D.17299>; else goto <D.17300>;
  <D.17299>:
  monoeg_g_log (0B, 4, "enqueueing a null object");
  <D.17216>:
  goto <D.17216>;
  <D.17300>:
  D.17305 = queue->first;
  if (D.17305 == 0B) goto <D.17302>; else goto <D.17306>;
  <D.17306>:
  D.17305 = queue->first;
  D.17307 = D.17305->end;
  if (D.17307 == 125) goto <D.17302>; else goto <D.17303>;
  <D.17302>:
  iftmp.0 = 1;
  goto <D.17304>;
  <D.17303>:
  iftmp.0 = 0;
  <D.17304>:
  D.17308 = iftmp.0 != 0;
  D.17309 = (long int) D.17308;
  D.17310 = __builtin_expect (D.17309, 0);
  if (D.17310 != 0) goto <D.17311>; else goto <D.17312>;
  <D.17311>:
  sgen_gray_object_alloc_queue_section (queue);
  <D.17312>:
  if (0 != 0) goto <D.17313>; else goto <D.17314>;
  <D.17313>:
  D.17305 = queue->first;
  D.17307 = D.17305->end;
  D.17305 = queue->first;
  monoeg_g_log (0B, 4, "gray queue %p overflow, first %p, end %d", queue, D.17305, D.17307);
  <D.17217>:
  goto <D.17217>;
  <D.17314>:
  D.17305 = queue->first;
  D.17305 = queue->first;
  D.17307 = D.17305->end;
  D.17315 = D.17307;
  D.17316 = D.17315 + 1;
  D.17305->end = D.17316;
  D.17305->objects[D.17315] = obj;
}


sgen_gray_object_dequeue (struct SgenGrayQueue * queue)
{
  int D.17317;
  char * D.17320;
  struct GrayQueueSection * D.17323;
  int D.17324;
  int D.17325;
  _Bool D.17326;
  long int D.17327;
  long int D.17328;
  struct GrayQueueSection * D.17331;
  struct GrayQueueSection * D.17332;
  char * obj;

  D.17317 = sgen_gray_object_queue_is_empty (queue);
  if (D.17317 != 0) goto <D.17318>; else goto <D.17319>;
  <D.17318>:
  D.17320 = 0B;
  return D.17320;
  <D.17319>:
  if (0 != 0) goto <D.17321>; else goto <D.17322>;
  <D.17321>:
  D.17323 = queue->first;
  D.17324 = D.17323->end;
  D.17323 = queue->first;
  monoeg_g_log (0B, 4, "gray queue %p underflow, first %p, end %d", queue, D.17323, D.17324);
  <D.17222>:
  goto <D.17222>;
  <D.17322>:
  D.17323 = queue->first;
  D.17323 = queue->first;
  D.17324 = D.17323->end;
  D.17325 = D.17324 + -1;
  D.17323->end = D.17325;
  D.17324 = D.17323->end;
  obj = D.17323->objects[D.17324];
  D.17323 = queue->first;
  D.17324 = D.17323->end;
  D.17326 = D.17324 == 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>:
  {
    struct GrayQueueSection * section;

    section = queue->first;
    D.17331 = section->next;
    queue->first = D.17331;
    D.17332 = queue->free_list;
    section->next = D.17332;
    queue->free_list = section;
  }
  <D.17330>:
  D.17320 = obj;
  return D.17320;
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.17334;
  struct GrayQueueSection * D.17335;
  _Bool D.17336;

  D.17335 = queue->first;
  D.17336 = D.17335 == 0B;
  D.17334 = (gboolean) D.17336;
  return D.17334;
}


sgen_gray_object_dequeue_section (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.17338;
  struct GrayQueueSection * D.17341;
  struct GrayQueueSection * D.17342;
  struct GrayQueueSection * section;

  D.17338 = queue->first;
  if (D.17338 == 0B) goto <D.17339>; else goto <D.17340>;
  <D.17339>:
  D.17341 = 0B;
  return D.17341;
  <D.17340>:
  section = queue->first;
  D.17342 = section->next;
  queue->first = D.17342;
  section->next = 0B;
  D.17341 = section;
  return D.17341;
}


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

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


sgen_gray_object_queue_init (struct SgenGrayQueue * queue, void (*GrayQueueEnqueueCheckFunc) (char *) enqueue_check_func)
{
  int D.17345;
  _Bool D.17346;
  long int D.17347;
  long int D.17348;
  _Bool D.17351;
  _Bool D.17352;
  _Bool D.17353;
  struct GrayQueueSection * D.17356;
  struct GrayQueueSection * D.17357;
  struct GrayQueueSection * section;
  struct GrayQueueSection * next;
  int i;

  D.17345 = sgen_gray_object_queue_is_empty (queue);
  D.17346 = D.17345 == 0;
  D.17347 = (long int) D.17346;
  D.17348 = __builtin_expect (D.17347, 0);
  if (D.17348 != 0) goto <D.17349>; else goto <D.17350>;
  <D.17349>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 168, "sgen_gray_object_queue_is_empty (queue)");
  <D.17350>:
  queue->alloc_prepare_func = 0B;
  queue->alloc_prepare_data = 0B;
  i = 0;
  section = queue->free_list;
  goto <D.17240>;
  <D.17239>:
  i = i + 1;
  section = section->next;
  <D.17240>:
  D.17351 = section != 0B;
  D.17352 = i <= 62;
  D.17353 = D.17351 & D.17352;
  if (D.17353 != 0) goto <D.17239>; else goto <D.17241>;
  <D.17241>:
  if (section == 0B) goto <D.17354>; else goto <D.17355>;
  <D.17354>:
  return;
  <D.17355>:
  goto <D.17243>;
  <D.17242>:
  next = section->next;
  D.17356 = next->next;
  section->next = D.17356;
  sgen_gray_object_free_queue_section (next);
  <D.17243>:
  D.17357 = section->next;
  if (D.17357 != 0B) goto <D.17242>; else goto <D.17244>;
  <D.17244>:
}


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.17359;
  _Bool D.17360;
  long int D.17361;
  long int D.17362;
  struct GrayQueueSection * D.17365;

  D.17359 = queue->first;
  D.17360 = D.17359 != 0B;
  D.17361 = (long int) D.17360;
  D.17362 = __builtin_expect (D.17361, 0);
  if (D.17362 != 0) goto <D.17363>; else goto <D.17364>;
  <D.17363>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 218, "!queue->first");
  <D.17364>:
  goto <D.17262>;
  <D.17261>:
  {
    struct GrayQueueSection * next;

    D.17365 = queue->free_list;
    next = D.17365->next;
    D.17365 = queue->free_list;
    sgen_gray_object_free_queue_section (D.17365);
    queue->free_list = next;
  }
  <D.17262>:
  D.17365 = queue->free_list;
  if (D.17365 != 0B) goto <D.17261>; else goto <D.17263>;
  <D.17263>:
}


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.17366;
  _Bool D.17367;
  long int D.17368;
  long int D.17369;
  union mono_mutex_t * D.17374;

  D.17366 = sgen_section_gray_queue_is_empty (queue);
  D.17367 = D.17366 == 0;
  D.17368 = (long int) D.17367;
  D.17369 = __builtin_expect (D.17368, 0);
  if (D.17369 != 0) goto <D.17370>; else goto <D.17371>;
  <D.17370>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gray.c", 255, "sgen_section_gray_queue_is_empty (queue)");
  <D.17371>:
  queue->locked = locked;
  if (locked != 0) goto <D.17372>; else goto <D.17373>;
  <D.17372>:
  D.17374 = &queue->lock;
  mono_mutex_init_recursive (D.17374);
  <D.17373>:
}


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


sgen_section_gray_queue_is_empty (struct SgenSectionGrayQueue * queue)
{
  gboolean D.17378;
  struct GrayQueueSection * D.17379;
  _Bool D.17380;

  D.17379 = queue->first;
  D.17380 = D.17379 == 0B;
  D.17378 = (gboolean) D.17380;
  return D.17378;
}


sgen_section_gray_queue_dequeue (struct SgenSectionGrayQueue * queue)
{
  struct GrayQueueSection * D.17382;
  struct GrayQueueSection * D.17385;
  struct GrayQueueSection * D.17387;
  struct GrayQueueSection * section;

  lock_section_queue (queue);
  D.17382 = queue->first;
  if (D.17382 != 0B) goto <D.17383>; else goto <D.17384>;
  <D.17383>:
  section = queue->first;
  D.17385 = section->next;
  queue->first = D.17385;
  section->next = 0B;
  goto <D.17386>;
  <D.17384>:
  section = 0B;
  <D.17386>:
  unlock_section_queue (queue);
  D.17387 = section;
  return D.17387;
}


lock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17389;
  union mono_mutex_t * D.17392;

  D.17389 = queue->locked;
  if (D.17389 == 0) goto <D.17390>; else goto <D.17391>;
  <D.17390>:
  return;
  <D.17391>:
  D.17392 = &queue->lock;
  pthread_mutex_lock (D.17392);
}


unlock_section_queue (struct SgenSectionGrayQueue * queue)
{
  int D.17394;
  union mono_mutex_t * D.17397;

  D.17394 = queue->locked;
  if (D.17394 == 0) goto <D.17395>; else goto <D.17396>;
  <D.17395>:
  return;
  <D.17396>:
  D.17397 = &queue->lock;
  pthread_mutex_unlock (D.17397);
}


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

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


