@@ -14,11 +14,15 @@
14VM* init_vm(int stack_size, size_t heap_size,
14VM* init_vm(int stack_size, size_t heap_size,
15 int max_threads, // not implemented yet
15 int max_threads, // not implemented yet
16 int argc, char* argv[]) {
16 int argc, char* argv[]) {
17− VAL* valstack = malloc(stack_size*sizeof(VAL));
18− int* intstack = malloc(stack_size*sizeof(int));
19− double* floatstack = malloc(stack_size*sizeof(double));
21 VM* vm = malloc(sizeof(VM));
18 VM* vm = malloc(sizeof(VM));
19+ STATS_INIT_STATS(vm->stats)
20+ STATS_ENTER_INIT(vm->stats)
22+ VAL* valstack = malloc(stack_size * sizeof(VAL));
23+ int* intstack = malloc(stack_size * sizeof(int));
24+ double* floatstack = malloc(stack_size*sizeof(double));
22 vm->valstack = valstack;
26 vm->valstack = valstack;
23 vm->valstack_top = valstack;
27 vm->valstack_top = valstack;
24 vm->valstack_base = valstack;
28 vm->valstack_base = valstack;
@@ -30,9 +34,6 @@ VM* init_vm(int stack_size, size_t heap_size,
31 alloc_heap(&(vm->heap), heap_size);
35 alloc_heap(&(vm->heap), heap_size);
36 vm->ret = NULL;
37 vm->ret = NULL;
37 vm->reg1 = NULL;
38 vm->reg1 = NULL;
@@ -59,23 +60,28 @@ VM* init_vm(int stack_size, size_t heap_size,
59 vm->argv[i] = MKSTR(vm, argv[i]);
60 vm->argv[i] = MKSTR(vm, argv[i]);
63+ STATS_LEAVE_INIT(vm->stats)
62 return vm;
64 return vm;
65−void terminate(VM* vm) {
67+Stats terminate(VM* vm) {
68+ Stats stats = vm->stats;
69+ STATS_ENTER_EXIT(stats)
66 free(vm->inbox);
71 free(vm->inbox);
67 free(vm->valstack);
72 free(vm->valstack);
68 free(vm->intstack);
73 free(vm->intstack);
69 free(vm->floatstack);
74 free(vm->floatstack);
71 free_heap(&(vm->heap));
75 free_heap(&(vm->heap));
73 free(vm->argv);
76 free(vm->argv);
75 pthread_mutex_destroy(&(vm -> inbox_lock));
78 pthread_mutex_destroy(&(vm -> inbox_lock));
76 pthread_mutex_destroy(&(vm -> inbox_block));
79 pthread_mutex_destroy(&(vm -> inbox_block));
77 pthread_cond_destroy(&(vm -> inbox_waiting));
80 pthread_cond_destroy(&(vm -> inbox_waiting));
83+ STATS_LEAVE_EXIT(stats)
81void idris_requireAlloc(VM* vm, size_t size) {
87void idris_requireAlloc(VM* vm, size_t size) {
@@ -111,7 +117,7 @@ void* allocate(VM* vm, size_t size, int outerlock) {
111 size_t chunk_size = size + sizeof(size_t);
117 size_t chunk_size = size + sizeof(size_t);
113 if (vm->heap.next + chunk_size < vm->heap.end) {
119 if (vm->heap.next + chunk_size < vm->heap.end) {
114− vm->allocations += chunk_size;
120+ STATS_ALLOC(vm->stats, chunk_size)
115 void* ptr = (void*)(vm->heap.next + sizeof(size_t));
121 void* ptr = (void*)(vm->heap.next + sizeof(size_t));
116 *((size_t*)(vm->heap.next)) = chunk_size;
122 *((size_t*)(vm->heap.next)) = chunk_size;
117 vm->heap.next += chunk_size;
123 vm->heap.next += chunk_size;
@@ -409,7 +415,9 @@ void* runThread(void* arg) {
409 callvm->processes--;
415 callvm->processes--;
411 free(td);
417 free(td);
412− terminate(vm);
419+ Stats stats = terminate(vm);
420+ // aggregate_stats(&(td->vm->stats), &stats);
413 return NULL;
421 return NULL;
@@ -501,12 +509,12 @@ void idris_sendMessage(VM* sender, VM* dest, VAL msg) {
501 // So: we try to copy, if a collection happens, we do the copy again
509 // So: we try to copy, if a collection happens, we do the copy again
502 // under the assumption there's enough space this time.
510 // under the assumption there's enough space this time.
504− int gcs = dest->collections;
512+ int gcs = dest->stats.collections;
505 pthread_mutex_lock(&dest->alloc_lock);
513 pthread_mutex_lock(&dest->alloc_lock);
506 VAL dmsg = copyTo(dest, msg);
514 VAL dmsg = copyTo(dest, msg);
507 pthread_mutex_unlock(&dest->alloc_lock);
515 pthread_mutex_unlock(&dest->alloc_lock);
509− if (dest->collections>gcs) {
517+ if (dest->stats.collections > gcs) {
510 // a collection will have invalidated the copy
518 // a collection will have invalidated the copy
511 pthread_mutex_lock(&dest->alloc_lock);
519 pthread_mutex_lock(&dest->alloc_lock);
512 dmsg = copyTo(dest, msg); // try again now there's room...
520 dmsg = copyTo(dest, msg); // try again now there's room...