on master help sign in
Undo previous commit mess which contained unrelated code from another branch
699090eJorge Acereda
rts/idris_gc.c+6−6
@@ -4,7 +4,7 @@
4#include "idris_bitstring.h"
4#include "idris_bitstring.h"
5#include <assert.h>
5#include <assert.h>
6
6
7−static inline VAL plain(VM* vm, VAL x, size_t sz) {
7+static inline VAL copy_plain(VM* vm, VAL x, size_t sz) {
8 VAL cl = iallocate(vm, sz, 1);
8 VAL cl = iallocate(vm, sz, 1);
9 memcpy(cl, x, sz);
9 memcpy(cl, x, sz);
10 return cl;
10 return cl;
@@ -18,13 +18,13 @@ VAL copy(VM* vm, VAL x) {
18 }
18 }
19 switch(GETTY(x)) {
19 switch(GETTY(x)) {
20 case CT_INT: return x;
20 case CT_INT: return x;
21− case CT_BITS32: return plain(vm, x, sizeof(Bits32));
21+ case CT_BITS32: return copy_plain(vm, x, sizeof(Bits32));
22− case CT_BITS64: return plain(vm, x, sizeof(Bits64));
22+ case CT_BITS64: return copy_plain(vm, x, sizeof(Bits64));
23− case CT_FLOAT: return plain(vm, x, sizeof(Float));
23+ case CT_FLOAT: return copy_plain(vm, x, sizeof(Float));
24 case CT_FWD:
24 case CT_FWD:
25 return GETPTR(x);
25 return GETPTR(x);
26 case CT_CDATA:
26 case CT_CDATA:
27− cl = plain(vm, x, sizeof(CDataC));
27+ cl = copy_plain(vm, x, sizeof(CDataC));
28 c_heap_mark_item(GETCDATA(x));
28 c_heap_mark_item(GETCDATA(x));
29 break;
29 break;
30 case CT_BIGINT:
30 case CT_BIGINT:
@@ -43,7 +43,7 @@ VAL copy(VM* vm, VAL x) {
43 case CT_PTR:
43 case CT_PTR:
44 case CT_MANAGEDPTR:
44 case CT_MANAGEDPTR:
45 case CT_RAWDATA:
45 case CT_RAWDATA:
46− cl = plain(vm, x, x->hdr.sz);
46+ cl = copy_plain(vm, x, x->hdr.sz);
47 break;
47 break;
48 default:
48 default:
49 cl = NULL;
49 cl = NULL;
rts/idris_rts.c+31−31
@@ -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+ assert(vm->inbox);
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;
280+ if (!cl->hdr.u8)
279− memcpy(cl->str, str, len);
281+ memcpy(cl->str, str, len);
280 return (VAL)cl;
282 return (VAL)cl;
281}
283}
282
284
@@ -411,7 +413,7 @@ void dumpVal(VAL v) {
411 int i;
413 int i;
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));
415 break;
417 break;
416 case CT_CON:
418 case CT_CON:
417 {
419 {
@@ -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));
515 break;
517 break;
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;
966
968
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;
970 }
972 }
971 }
973 }
@@ -1028,7 +1030,7 @@ Msg* idris_recvMessage(VM* vm) {
1028
1030
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));
1032
1034
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) {
1051 }
1053 }
1052 pthread_mutex_unlock(&vm->inbox_block);
1054 pthread_mutex_unlock(&vm->inbox_block);
1053
1055
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;
1057− }
1058
1059
1059− ret = malloc(sizeof(Msg));
1060+ pthread_mutex_lock(&(vm->inbox_lock));
1060− ret->msg = msg->msg;
1061− ret->sender = msg->sender;
1062
1061
1063− pthread_mutex_lock(&(vm->inbox_lock));
1064−
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
1069−
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;
1074− }
1075− }
1076
1066
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;
1071+ }
1072+ }
1080
1073
1081− pthread_mutex_unlock(&(vm->inbox_lock));
1074+ vm->inbox_write->msg = NULL;
1075+ vm->inbox_write->sender = NULL;
1076+ vm->inbox_write--;
1082
1077
1078+ pthread_mutex_unlock(&(vm->inbox_lock));
1079+ } else {
1080+ fprintf(stderr, "No messages waiting");
1081+ exit(-1);
1082+ }
1083 return ret;
1083 return ret;
1084}
1084}
1085#endif
1085#endif