@@ -10,14 +10,19 @@
10#include "idris_gc.h"
10#include "idris_gc.h"
11#include "idris_bitstring.h"
11#include "idris_bitstring.h"
13VM* init_vm(int stack_size, size_t heap_size,
14VM* init_vm(int stack_size, size_t heap_size,
14 int max_threads, // not implemented yet
15 int max_threads, // not implemented yet
15 int argc, char* argv[]) {
16 int argc, char* argv[]) {
16− VAL* valstack = malloc(stack_size*sizeof(VAL));
17− int* intstack = malloc(stack_size*sizeof(int));
18− double* floatstack = malloc(stack_size*sizeof(double));
20 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));
21 vm->valstack = valstack;
26 vm->valstack = valstack;
22 vm->valstack_top = valstack;
27 vm->valstack_top = valstack;
23 vm->valstack_base = valstack;
28 vm->valstack_base = valstack;
@@ -26,14 +31,9 @@ VM* init_vm(int stack_size, size_t heap_size,
26 vm->floatstack = floatstack;
31 vm->floatstack = floatstack;
27 vm->floatstack_ptr = floatstack;
32 vm->floatstack_ptr = floatstack;
28 vm->stack_max = valstack + stack_size;
33 vm->stack_max = valstack + stack_size;
29− vm->heap = malloc(heap_size);
35+ alloc_heap(&(vm->heap), heap_size);
30− vm->oldheap = NULL;
36+
31− vm->heap_next = vm->heap;
32− vm->heap_end = vm->heap + heap_size;
33− vm->heap_size = heap_size;
36− vm->heap_growth = heap_size;
37 vm->ret = NULL;
37 vm->ret = NULL;
38 vm->reg1 = NULL;
38 vm->reg1 = NULL;
@@ -60,25 +60,32 @@ VM* init_vm(int stack_size, size_t heap_size,
60 vm->argv[i] = MKSTR(vm, argv[i]);
60 vm->argv[i] = MKSTR(vm, argv[i]);
63+ STATS_LEAVE_INIT(vm->stats)
63 return vm;
64 return vm;
66−void terminate(VM* vm) {
67+Stats terminate(VM* vm) {
68+ Stats stats = vm->stats;
69+ STATS_ENTER_EXIT(stats)
67 free(vm->inbox);
71 free(vm->inbox);
68 free(vm->valstack);
72 free(vm->valstack);
69 free(vm->intstack);
73 free(vm->intstack);
70 free(vm->floatstack);
74 free(vm->floatstack);
71− free(vm->heap);
75+ free_heap(&(vm->heap));
72 free(vm->argv);
76 free(vm->argv);
73− if (vm->oldheap != NULL) { free(vm->oldheap); }
77+
74 pthread_mutex_destroy(&(vm -> inbox_lock));
78 pthread_mutex_destroy(&(vm -> inbox_lock));
75 pthread_mutex_destroy(&(vm -> inbox_block));
79 pthread_mutex_destroy(&(vm -> inbox_block));
76 pthread_cond_destroy(&(vm -> inbox_waiting));
80 pthread_cond_destroy(&(vm -> inbox_waiting));
83+ STATS_LEAVE_EXIT(stats)
80void idris_requireAlloc(VM* vm, size_t size) {
87void idris_requireAlloc(VM* vm, size_t size) {
81− if (!(vm -> heap_next + size < vm -> heap_end)) {
88+ if (!(vm->heap.next + size < vm->heap.end)) {
82 idris_gc(vm);
89 idris_gc(vm);
@@ -109,13 +116,13 @@ void* allocate(VM* vm, size_t size, int outerlock) {
110 size_t chunk_size = size + sizeof(size_t);
117 size_t chunk_size = size + sizeof(size_t);
112− if (vm -> heap_next + chunk_size < vm -> heap_end) {
119+ if (vm->heap.next + chunk_size < vm->heap.end) {
113− vm->allocations += chunk_size;
120+ STATS_ALLOC(vm->stats, chunk_size)
114− void* ptr = (void*)(vm->heap_next + sizeof(size_t));
121+ void* ptr = (void*)(vm->heap.next + sizeof(size_t));
115− *((size_t*)(vm->heap_next)) = chunk_size;
122+ *((size_t*)(vm->heap.next)) = chunk_size;
116− vm -> heap_next += chunk_size;
123+ vm->heap.next += chunk_size;
118− assert(vm->heap_next <= vm->heap_end);
125+ assert(vm->heap.next <= vm->heap.end);
120 memset(ptr, 0, size);
127 memset(ptr, 0, size);
@@ -215,7 +222,7 @@ void dumpStack(VM* vm) {
215 for (root = vm->valstack; root < vm->valstack_top; ++root, ++i) {
222 for (root = vm->valstack; root < vm->valstack_top; ++root, ++i) {
216 printf("%d: ", i);
223 printf("%d: ", i);
217 dumpVal(*root);
224 dumpVal(*root);
218− if (*root >= (VAL)(vm->heap) && *root < (VAL)(vm->heap_end)) { printf("OK"); }
225+ if (*root >= (VAL)(vm->heap.heap) && *root < (VAL)(vm->heap.end)) { printf("OK"); }
219 printf("\n");
226 printf("\n");
221 printf("RET: ");
228 printf("RET: ");
@@ -408,12 +415,14 @@ void* runThread(void* arg) {
408 callvm->processes--;
415 callvm->processes--;
410 free(td);
417 free(td);
411− terminate(vm);
419+ Stats stats = terminate(vm);
420+ // aggregate_stats(&(td->vm->stats), &stats);
412 return NULL;
421 return NULL;
415void* vmThread(VM* callvm, func f, VAL arg) {
424void* vmThread(VM* callvm, func f, VAL arg) {
416− VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap_size,
425+ VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
417 callvm->max_threads,
426 callvm->max_threads,
418 0, NULL);
427 0, NULL);
419 vm->processes=1; // since it can send and receive messages
428 vm->processes=1; // since it can send and receive messages
@@ -500,12 +509,12 @@ void idris_sendMessage(VM* sender, VM* dest, VAL msg) {
500 // 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
501 // under the assumption there's enough space this time.
510 // under the assumption there's enough space this time.
503− int gcs = dest->collections;
512+ int gcs = dest->stats.collections;
504 pthread_mutex_lock(&dest->alloc_lock);
513 pthread_mutex_lock(&dest->alloc_lock);
505 VAL dmsg = copyTo(dest, msg);
514 VAL dmsg = copyTo(dest, msg);
506 pthread_mutex_unlock(&dest->alloc_lock);
515 pthread_mutex_unlock(&dest->alloc_lock);
508− if (dest->collections>gcs) {
517+ if (dest->stats.collections > gcs) {
509 // a collection will have invalidated the copy
518 // a collection will have invalidated the copy
510 pthread_mutex_lock(&dest->alloc_lock);
519 pthread_mutex_lock(&dest->alloc_lock);
511 dmsg = copyTo(dest, msg); // try again now there's room...
520 dmsg = copyTo(dest, msg); // try again now there's room...