@@ -49,8 +49,9 @@ VM* init_vm(int stack_size, size_t heap_size,
49 vm->ret = NULL;
49 vm->ret = NULL;
50 vm->reg1 = NULL;
50 vm->reg1 = NULL;
51#ifdef HAS_PTHREAD
51#ifdef HAS_PTHREAD
52− vm->inbox = malloc(1024*sizeof(VAL));
52+ vm->inbox = malloc(1024*sizeof(vm->inbox[0]));
53− memset(vm->inbox, 0, 1024*sizeof(VAL));
54+ memset(vm->inbox, 0, 1024*sizeof(vm->inbox[0]));
54 vm->inbox_end = vm->inbox + 1024;
55 vm->inbox_end = vm->inbox + 1024;
55 vm->inbox_write = vm->inbox;
56 vm->inbox_write = vm->inbox;
56 vm->inbox_nextid = 1;
57 vm->inbox_nextid = 1;
@@ -276,7 +277,8 @@ static VAL mkstrlen(VM* vm, const char * str, size_t len, int outer) {
276 String * cl = allocStr(vm, len, outer);
277 String * cl = allocStr(vm, len, outer);
277 // hdr.u8 used to mark a null string
278 // hdr.u8 used to mark a null string
278 cl->hdr.u8 = str == NULL;
279 cl->hdr.u8 = str == NULL;
279− memcpy(cl->str, str, len);
281+ memcpy(cl->str, str, len);
280 return (VAL)cl;
282 return (VAL)cl;
@@ -411,7 +413,7 @@ void dumpVal(VAL v) {
412 switch(GETTY(v)) {
414 switch(GETTY(v)) {
413 case CT_INT:
415 case CT_INT:
414− printf("%d ", (int)(GETINT(v)));
416+ printf("%" PRIdPTR " ", GETINT(v));
416 case CT_CON:
418 case CT_CON:
@@ -511,7 +513,7 @@ VAL idris_castBitsStr(VM* vm, VAL i) {
511 case CT_INT: // 8/16 bits
513 case CT_INT: // 8/16 bits
512 // max length 16 bit unsigned int str 5 chars (65,535)
514 // max length 16 bit unsigned int str 5 chars (65,535)
513 cl = allocStr(vm, 6, 0);
515 cl = allocStr(vm, 6, 0);
514− cl->slen = sprintf(cl->str, "%ld", GETBITS16(i));
516+ cl->slen = sprintf(cl->str, "%" PRIu16, (uint16_t)GETBITS16(i));
516 case CT_BITS32:
518 case CT_BITS32:
517 // max length 32 bit unsigned int str 10 chars (4,294,967,295)
519 // max length 32 bit unsigned int str 10 chars (4,294,967,295)
@@ -965,7 +967,7 @@ Msg* idris_checkInitMessages(VM* vm) {
965 Msg* msg;
967 Msg* msg;
967 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
969 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
968− if (msg->channel_id && 1 == 1) { // init bit set
970+ if ((msg->channel_id & 1) == 1) { // init bit set
969 return msg;
971 return msg;
@@ -1028,7 +1030,7 @@ Msg* idris_recvMessage(VM* vm) {
1029Msg* idris_recvMessageFrom(VM* vm, int channel_id, VM* sender) {
1031Msg* idris_recvMessageFrom(VM* vm, int channel_id, VM* sender) {
1030 Msg* msg;
1032 Msg* msg;
1031− Msg* ret;
1033+ Msg* ret = malloc(sizeof(Msg));
1033 struct timespec timeout;
1035 struct timespec timeout;
1034 int status;
1036 int status;
@@ -1051,35 +1053,33 @@ Msg* idris_recvMessageFrom(VM* vm, int channel_id, VM* sender) {
1052 pthread_mutex_unlock(&vm->inbox_block);
1054 pthread_mutex_unlock(&vm->inbox_block);
1054− if (msg == NULL) {
1056+ if (msg != NULL) {
1055− fprintf(stderr, "No messages waiting");
1057+ ret->msg = msg->msg;
1056− exit(-1);
1058+ ret->sender = msg->sender;
1059− ret = malloc(sizeof(Msg));
1060+ pthread_mutex_lock(&(vm->inbox_lock));
1060− ret->msg = msg->msg;
1061− ret->sender = msg->sender;
1063− pthread_mutex_lock(&(vm->inbox_lock));
1065− // Slide everything down after the message in the inbox,
1062+ // Slide everything down after the message in the inbox,
1066− // Move the inbox_write pointer down, and clear the value at the
1063+ // Move the inbox_write pointer down, and clear the value at the
1067− // end - O(n) but it's easier since the message from a specific
1064+ // end - O(n) but it's easier since the message from a specific
1068− // sender could be anywhere in the inbox
1065+ // sender could be anywhere in the inbox
1070− for(;msg < vm->inbox_write; ++msg) {
1071− if (msg+1 != vm->inbox_end) {
1072− msg->sender = (msg + 1)->sender;
1073− msg->msg = (msg + 1)->msg;
1077− vm->inbox_write->msg = NULL;
1067+ for(;msg < vm->inbox_write; ++msg) {
1078− vm->inbox_write->sender = NULL;
1068+ if (msg+1 != vm->inbox_end) {
1079− vm->inbox_write--;
1069+ msg->sender = (msg + 1)->sender;
1070+ msg->msg = (msg + 1)->msg;
1081− pthread_mutex_unlock(&(vm->inbox_lock));
1074+ vm->inbox_write->msg = NULL;
1075+ vm->inbox_write->sender = NULL;
1078+ pthread_mutex_unlock(&(vm->inbox_lock));
1080+ fprintf(stderr, "No messages waiting");
1083 return ret;
1083 return ret;