- do {
- chunk->next = chunk_free_list;
- } while (InterlockedCompareExchangePointer ((gpointer*) &chunk_free_list, chunk, chunk->next) != chunk->next);
-}
-
-static MonoHandle
-handle_new (MonoHandleArena *arena, MonoObject *obj)
-{
- MonoHandleArenaChunk *chunk;
-
- g_assert (arena->chunk);
- g_assert (arena->chunk_last);
-
- chunk = arena->chunk_last;
-
- if (chunk->handles_size < HANDLES_PER_CHUNK) {
- chunk->handles [chunk->handles_size].__private_obj = obj;
- chunk->handles_size += 1;
-
- return &chunk->handles [chunk->handles_size - 1];
+ MonoThreadInfo *info = mono_thread_info_current ();
+ HandleStack *handles = (HandleStack *)info->handle_stack;
+ HandleChunk *top = handles->top;
+
+retry:
+ if (G_LIKELY (top->size < OBJECTS_PER_HANDLES_CHUNK)) {
+ MonoObject **h = &top->objects [top->size++];
+ *h = object;
+ return h;