Exemplo n.º 1
0
void*
mono_gc_alloc_fixed (size_t size, void *descr)
{
	/* To help track down typed allocation bugs */
	/*
	static int count;
	count ++;
	if (count == atoi (getenv ("COUNT2")))
		printf ("HIT!\n");
	if (count > atoi (getenv ("COUNT2")))
		return GC_MALLOC (size);
	*/

	if (descr)
		return GC_MALLOC_EXPLICITLY_TYPED (size, (GC_descr)descr);
	else
		return GC_MALLOC (size);
}
Exemplo n.º 2
0
static inline MonoGHashNode*
g_hash_node_new (gpointer key,
		 gpointer value,
		 gint gc_type)
{
  MonoGHashNode *hash_node = NULL;

#if HAVE_BOEHM_GC
  if (node_free_lists [gc_type]) {
	  G_LOCK (g_hash_global);

	  if (node_free_lists [gc_type]) {
		  hash_node = node_free_lists [gc_type];
		  node_free_lists [gc_type] = node_free_lists [gc_type]->next;
	  }
	  G_UNLOCK (g_hash_global);
  }
  if (!hash_node) {
	  if (gc_type != MONO_HASH_CONSERVATIVE_GC) {
		  //hash_node = GC_MALLOC (sizeof (MonoGHashNode));
		  hash_node = GC_MALLOC_EXPLICITLY_TYPED (sizeof (MonoGHashNode), (GC_descr)node_gc_descs [gc_type]);
	  } else {
		  hash_node = GC_MALLOC (sizeof (MonoGHashNode));
	  }
  }
#elif defined(HAVE_SGEN_GC)
  if (node_free_lists [gc_type]) {
	  G_LOCK (g_hash_global);

	  if (node_free_lists [gc_type]) {
		  hash_node = node_free_lists [gc_type];
		  node_free_lists [gc_type] = node_free_lists [gc_type]->next;
	  }
	  G_UNLOCK (g_hash_global);
  }
  if (!hash_node) {
	  if (gc_type != MONO_HASH_CONSERVATIVE_GC) {
		  /* 
		   * Marking is handled by the marker function, no need to allocate GC visible
		   * memory.
		   */
		  if (!node_mem_chunk)
			  node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
												sizeof (MonoGHashNode),
												1024, G_ALLOC_ONLY);
		  hash_node = g_chunk_new (MonoGHashNode, node_mem_chunk);
	  } else {
		  hash_node = mono_gc_alloc_fixed (sizeof (MonoGHashNode), NULL);
	  }
  }
#else
  G_LOCK (g_hash_global);
  if (node_free_list)
    {
      hash_node = node_free_list;
      node_free_list = node_free_list->next;
    }
  else
    {
      if (!node_mem_chunk)
	node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
					  sizeof (MonoGHashNode),
					  1024, G_ALLOC_ONLY);
      
      hash_node = g_chunk_new (MonoGHashNode, node_mem_chunk);
    }
  G_UNLOCK (g_hash_global);
#endif

  SET_NODE_KEY (hash_node, gc_type, key);
  SET_NODE_VALUE (hash_node, gc_type, value);
  hash_node->next = NULL;
  
  return hash_node;
}