// Copyright 2012 The Emscripten Authors.  All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License.  Both these licenses can be
// found in the LICENSE file.

#include <stdio.h>
#include <gc.h>
#include <assert.h>
#include <emscripten.h>

void *global;

int freed = 0;

void finalizer(void *ptr, void *arg) {
  printf("finalizing %ld (global == %d)\n", (long)arg, ptr == global);
  freed++;
  if (ptr == global) global = 0;
}

int stage = 0;
float start = 0;

void waiter(void*) {
  if (stage == 0) { // wait for a while, see no GCing
    assert(global);
    if (emscripten_get_now() - start > 2100) {
      GC_MALLOC(1024*1024*2); // allocate enough to trigger a GC
      start = emscripten_get_now();
      stage = 1;
      printf("stage 1\n");
    }
  } else if (stage == 1) {
    assert(global);
    if (freed > 0) {
      GC_FREE(global);
      stage = 2;
      start = emscripten_get_now();
      printf("stage 2\n");
    }
    if (emscripten_get_now() - start > 2100) {
      printf("fail, too much time passed (a)\n");
      return;
    }
  } else if (stage == 2) {
    if (emscripten_get_now() - start > 2100) { // wait and see that no gc'ing happens yet
      GC_MALLOC(1024*1024*2); // allocate enough to trigger a GC
      stage = 3;
      start = emscripten_get_now();
      printf("stage 3\n");
    }
  } else if (stage == 3) {
    assert(!global);
    if (freed == 5) {
      printf("Ok.\n");
      REPORT_RESULT(1);
      return;
    }
    if (emscripten_get_now() - start > 2100) {
      printf("fail, too much time passed (b)\n");
      return;
    }
  }

  emscripten_async_call(waiter, NULL, 100);
}

int main() {
  start = emscripten_get_now();

  GC_INIT();

  void *local, *local2, *local3, *local4;

  global = GC_MALLOC(12);
  GC_REGISTER_FINALIZER_NO_ORDER(global, finalizer, 0, 0, 0);
  local = GC_MALLOC(12);
  GC_REGISTER_FINALIZER_NO_ORDER(local, finalizer, (void*)1, 0, 0);
  local2 = GC_MALLOC_ATOMIC(12);
  GC_REGISTER_FINALIZER_NO_ORDER(local2, finalizer, (void*)2, 0, 0);
  local3 = GC_MALLOC(12);
  GC_REGISTER_FINALIZER_NO_ORDER(local3, finalizer, (void*)3, 0, 0);
  local4 = GC_MALLOC(12);
  GC_REGISTER_FINALIZER_NO_ORDER(local4, finalizer, (void*)4, 0, 0);

  void **globalData = (void**)global;
  globalData[0] = local;
  globalData[1] = local2;

  void **localData = (void**)local;
  localData[0] = local3;

  void **local2Data = (void**)local2;
  local2Data[0] = local4; // actually ignored, because local2 is atomic, so 4 is freeable

  emscripten_async_call(waiter, NULL, 100);

  return 0;
}

