/*
 * Copyright 2013 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.
 */

// Emscripten tests

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <dlfcn.h>

typedef void *(*mallocer)(int n);
typedef void (*freeer)(void *p);

void *lib_handle;
int handles = 0;
mallocer mallocproxy = NULL;
freeer freeproxy = NULL;

void get_lib() {
  //printf("get lib\n");
  lib_handle = dlopen("liblib.so", RTLD_NOW);
  assert(lib_handle != NULL);
  handles++;

  mallocproxy = (mallocer)dlsym(lib_handle, "mallocproxy");
  assert(mallocproxy!= NULL);
  freeproxy = (freeer)dlsym(lib_handle, "freeproxy");
  assert(freeproxy!= NULL);
}

void unget_lib() {
  //printf("unget lib\n");
  assert(lib_handle);
  dlclose(lib_handle);
  handles--;
  if (handles == 0) lib_handle = NULL;
}

int main() {
  int n = 0, total = 0, l = 0;
  void *allocs[50];
  allocs[n++] = malloc(10); // pull in real malloc
  for (int i = 0; i < 1000; i++) {
    //printf("%d: total ever %d MB, current MB %d, total libs %d\n", i, total, n, l);
    assert(n < 50);
    if (i % 5 == 0) {
      if (handles < 10) {
        get_lib();
        l++;
      }
    }
    if (i % 7 == 0) {
      if (handles > 0) unget_lib();
    }
    if (i % 3 == 0) {
      if (handles > 0) {
        if (n < 10) {
          if (i % 2 == 0) {
            //printf("%d: alloc\n", i);
            allocs[n++] = mallocproxy(1024*1024);
          } else {
            //printf("%d: real alloc\n", i);
            allocs[n++] = malloc(1024*1024);
          }
          total++;
        } else {
          //printf("real free\n");
          free(allocs[--n]); // real free
        }
      }
    }
    if (i % 4 == 0) {
      if (handles > 0 && n > 0) {
        //printf("free\n");
        if (i % 2 == 0) {
          //printf("free\n");
          freeproxy(allocs[--n]);
        } else {
          //printf("real free\n");
          free(allocs[--n]);
        }
      }
    }
  }
  while (n > 0) free(allocs[--n]); // real free
  while (handles > 0) unget_lib();
  printf("*%d,%d*\n", total, l);
}

