on master help sign in
Avoid indirections for nullaries, refactorized locked/unlocked variants
commit3be07b0e1a384b98de7b172efc736a7acda0f545 authorJorge Acereda <jacereda@gmail.com> dateThu 22 Mar 2018, 19:08 (9 years ago) parent1af584d
3 files changed+66−73
rts/idris_main.c+1−2 rts/idris_rts.c+51−56 rts/idris_rts.h+14−15
rts/idris_main.c+1−2
@@ -33,7 +33,7 @@ int win32_get_argv_utf8(int *argc_ptr, char ***argv_ptr)
3333#endif
3434
3535// The default options should give satisfactory results under many circumstances.
36−RTSOpts opts = {
36+RTSOpts opts = {
3737 .init_heap_size = 16384000,
3838 .max_stack_size = 4096000,
3939 .show_summary = 0
@@ -74,6 +74,5 @@ int main(int argc, char **argv) {
7474 print_stats(&stats);
7575 }
7676
77− free_nullaries();
7877 return EXIT_SUCCESS;
7978}
rts/idris_rts.c+51−56
@@ -223,16 +223,15 @@ void* iallocate(VM * vm, size_t isize, int outerlock) {
223223 STATS_ALLOC(vm->stats, size)
224224 char* ptr = vm->heap.next;
225225 vm->heap.next += size;
226−
227226 assert(vm->heap.next <= vm->heap.end);
228−
229227 memset(ptr, 0, size);
228+ ((Hdr*)ptr)->sz = isize;
229+
230230#ifdef HAS_PTHREAD
231231 if (lock) { // not message passing
232232 pthread_mutex_unlock(&vm->alloc_lock);
233233 }
234234#endif
235− ((Hdr*)ptr)->sz = size;
236235 return (void*)ptr;
237236 } else {
238237 // If we're trying to allocate something bigger than the heap,
@@ -258,22 +257,42 @@ static String * allocStr(VM * vm, size_t len, int outer) {
258257 return cl;
259258}
260259
261−VAL MKFLOAT(VM* vm, double val) {
262− Float * cl = iallocate(vm, sizeof(*cl), 0);
260+static VAL mkfloat(VM* vm, double val, int outer) {
261+ Float * cl = iallocate(vm, sizeof(*cl), outer);
263262 SETTY(cl, CT_FLOAT);
264263 cl->f = val;
265264 return (VAL)cl;
266265}
267266
268−VAL MKSTRlen(VM* vm, const char * str, size_t len) {
269− String * cl = allocStr(vm, len, 0);
267+VAL MKFLOAT(VM* vm, double val) {
268+ return mkfloat(vm, val, 0);
269+}
270+
271+VAL MKFLOATc(VM* vm, double val) {
272+ return mkfloat(vm, val, 1);
273+}
274+
275+static VAL mkstrlen(VM* vm, const char * str, size_t len, int outer) {
276+ String * cl = allocStr(vm, len, outer);
270277 memcpy(cl->str, str, len);
271− cl->__null = str == NULL;
278+ cl->_null = str == NULL;
272279 return (VAL)cl;
273280}
274281
282+VAL MKSTRlen(VM* vm, const char * str, size_t len) {
283+ return mkstrlen(vm, str, len, 0);
284+}
285+
286+VAL MKSTRclen(VM* vm, char* str, size_t len) {
287+ return mkstrlen(vm, str, len, 1);
288+}
289+
275290VAL MKSTR(VM* vm, const char* str) {
276− return MKSTRlen(vm, str, str? strlen(str) : 0);
291+ return mkstrlen(vm, str, str? strlen(str) : 0, 0);
292+}
293+
294+VAL MKSTRc(VM* vm, char* str) {
295+ return mkstrlen(vm, str, strlen(str), 1);
277296}
278297
279298static char * getstroff(StrOffset * stroff) {
@@ -295,65 +314,50 @@ size_t GETSTROFFLEN(VAL stroff) {
295314 return getstrofflen((StrOffset*)stroff);
296315}
297316
298−VAL MKCDATA(VM* vm, CHeapItem * item) {
317+static VAL mkcdata(VM * vm, CHeapItem * item, int outer) {
299318 c_heap_insert_if_needed(vm, &vm->c_heap, item);
300− CDataC * cl = iallocate(vm, sizeof(*cl), 0);
319+ CDataC * cl = iallocate(vm, sizeof(*cl), outer);
301320 SETTY(cl, CT_CDATA);
302321 cl->item = item;
303322 return (VAL)cl;
304323}
305324
325+VAL MKCDATA(VM* vm, CHeapItem * item) {
326+ return mkcdata(vm, item, 0);
327+}
328+
306329VAL MKCDATAc(VM* vm, CHeapItem * item) {
307− c_heap_insert_if_needed(vm, &vm->c_heap, item);
308− CDataC * cl = iallocate(vm, sizeof(*cl), 1);
309− SETTY(cl, CT_CDATA);
310− cl->item = item;
311− return (VAL)cl;
330+ return mkcdata(vm, item, 1);
312331}
313332
314−VAL MKPTR(VM* vm, void* ptr) {
315− Ptr * cl = iallocate(vm, sizeof(*cl), 0);
333+static VAL mkptr(VM* vm, void* ptr, int outer) {
334+ Ptr * cl = iallocate(vm, sizeof(*cl), outer);
316335 SETTY(cl, CT_PTR);
317336 cl->ptr = ptr;
318337 return (VAL)cl;
319338}
320339
321−VAL MKMPTR(VM* vm, void* ptr, size_t size) {
322− ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, 0);
323− SETTY(cl, CT_MANAGEDPTR);
324− memcpy(cl->mptr, ptr, size);
325− return (VAL)cl;
340+VAL MKPTR(VM* vm, void* ptr) {
341+ return mkptr(vm, ptr, 0);
326342}
327343
328−VAL MKFLOATc(VM* vm, double val) {
329− Float * cl = iallocate(vm, sizeof(*cl), 1);
330− SETTY(cl, CT_FLOAT);
331− cl->f = val;
332− return (VAL)cl;
344+VAL MKPTRc(VM* vm, void* ptr) {
345+ return mkptr(vm, ptr, 1);
333346}
334347
335−VAL MKSTRclen(VM* vm, char* str, size_t len) {
336− String * cl = allocStr(vm, len, 1);
337− memcpy(cl->str, str, len);
348+VAL mkmptr(VM* vm, void* ptr, size_t size, int outer) {
349+ ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, outer);
350+ SETTY(cl, CT_MANAGEDPTR);
351+ memcpy(cl->mptr, ptr, size);
338352 return (VAL)cl;
339353}
340354
341−VAL MKSTRc(VM* vm, char* str) {
342− return MKSTRclen(vm, str, strlen(str));
343−}
344−
345−VAL MKPTRc(VM* vm, void* ptr) {
346− Ptr * cl = iallocate(vm, sizeof(*cl), 1);
347− SETTY(cl, CT_PTR);
348− cl->ptr = ptr;
349− return (VAL)cl;
355+VAL MKMPTR(VM* vm, void* ptr, size_t size) {
356+ return mkmptr(vm, ptr, size, 0);
350357}
351358
352359VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
353− ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, 1);
354− SETTY(cl, CT_MANAGEDPTR);
355− memcpy(cl->mptr, ptr, size);
356− return (VAL)cl;
360+ return mkmptr(vm, ptr, size, 1);
357361}
358362
359363VAL MKB8(VM* vm, uint8_t bits8) {
@@ -1105,25 +1109,16 @@ char* idris_showerror(int err) {
11051109 return strerror(err);
11061110}
11071111
1108−VAL* nullary_cons;
1112+Con nullary_cons[256];
11091113
11101114void init_nullaries(void) {
11111115 int i;
1112− nullary_cons = malloc(256 * sizeof(VAL));
11131116 for(i = 0; i < 256; ++i) {
1114− Con * cl = calloc(1, sizeof(*cl));
1117+ Con * cl = nullary_cons + i;
1118+ cl->hdr.sz = sizeof(*cl);
11151119 SETTY(cl, CT_CON);
11161120 cl->tag = i;
1117− nullary_cons[i] = (VAL)cl;
1118− }
1119−}
1120−
1121−void free_nullaries(void) {
1122− int i;
1123− for(i = 0; i < 256; ++i) {
1124− free(nullary_cons[i]);
11251121 }
1126− free(nullary_cons);
11271122}
11281123
11291124int __idris_argc;
rts/idris_rts.h+14−15
@@ -1,6 +1,7 @@
11#ifndef _IDRISRTS_H
22#define _IDRISRTS_H
33
4+#include <assert.h>
45#include <stdlib.h>
56#include <stdio.h>
67#ifdef HAS_PTHREAD
@@ -22,12 +23,13 @@
2223
2324// Closures
2425typedef enum {
25− CT_CON, CT_ARRAY, CT_INT, CT_BIGINT, CT_FLOAT, CT_STRING, CT_STROFFSET,
26− CT_BITS8, CT_BITS16, CT_BITS32, CT_BITS64, CT_PTR, CT_REF,
27− CT_FWD, CT_MANAGEDPTR, CT_RAWDATA, CT_CDATA
26+ CT_CON, CT_ARRAY, CT_INT, CT_BIGINT,
27+ CT_FLOAT, CT_STRING, CT_STROFFSET, CT_BITS8,
28+ CT_BITS16, CT_BITS32, CT_BITS64, CT_PTR,
29+ CT_REF, CT_FWD, CT_MANAGEDPTR, CT_RAWDATA,
30+ CT_CDATA
2831} ClosureType;
2932
30−
3133typedef struct Hdr {
3234 uint8_t ty;
3335 uint8_t u8;
@@ -35,7 +37,6 @@ typedef struct Hdr {
3537 uint32_t sz;
3638} Hdr;
3739
38−
3940typedef struct Val {
4041 Hdr hdr;
4142} Val;
@@ -72,7 +73,7 @@ typedef struct Float {
7273typedef struct String {
7374 Hdr hdr;
7475 size_t slen;
75−#define __null hdr.u8
76+#define _null hdr.u8
7677 char str[0];
7778} String;
7879
@@ -240,7 +241,7 @@ typedef void(*func)(VM*, VAL*);
240241
241242// Retrieving values
242243static inline char * getstr(String * x) {
243− return x->__null? NULL : x->str;
244+ return x->_null? NULL : x->str;
244245}
245246
246247static inline size_t getstrlen(String * x) {
@@ -369,12 +370,12 @@ static inline void updateConF(Con * cl, unsigned tag, unsigned arity) {
369370 SETTY(cl, CT_CON);
370371 cl->tag = tag;
371372 cl->arity = arity;
372− cl->hdr.sz = sizeof(*cl) + sizeof(VAL) * arity;
373+ assert(cl->hdr.sz == sizeof(*cl) + sizeof(VAL) * arity);
374+ // cl->hdr.sz = sizeof(*cl) + sizeof(VAL) * arity;
373375}
374376
375377static inline Con * allocConF(VM * vm, unsigned tag, unsigned arity, int outer) {
376− size_t sz = sizeof(VAL) * arity;
377− Con * cl = iallocate(vm, sizeof(*cl) + sz, outer);
378+ Con * cl = iallocate(vm, sizeof(*cl) + sizeof(VAL) * arity, outer);
378379 SETTY(cl, CT_CON);
379380 cl->tag = tag;
380381 cl->arity = arity;
@@ -382,8 +383,7 @@ static inline Con * allocConF(VM * vm, unsigned tag, unsigned arity, int outer)
382383}
383384
384385static inline Array * allocArrayF(VM * vm, size_t len, int outer) {
385− size_t sz = sizeof(VAL) * len;
386− Array * cl = iallocate(vm, sizeof(*cl) + sz, outer);
386+ Array * cl = iallocate(vm, sizeof(*cl) + sizeof(VAL) * len, outer);
387387 SETTY(cl, CT_ARRAY);
388388 return cl;
389389}
@@ -393,16 +393,15 @@ static inline Array * allocArrayF(VM * vm, size_t len, int outer) {
393393
394394#define updateCon(cl, old, tag, arity) (cl) = (old); updateConF(cl, tag, arity)
395395
396−#define NULL_CON(x) nullary_cons[x]
396+#define NULL_CON(x) ((VAL)(nullary_cons + x))
397397
398398#define allocArray(cl, vm, len, o) (cl) = (VAL)allocArrayF(vm, len, o)
399399
400400int idris_errno(void);
401401char* idris_showerror(int err);
402402
403−extern VAL* nullary_cons;
403+extern Con nullary_cons[];
404404void init_nullaries(void);
405−void free_nullaries(void);
406405
407406void init_signals(void);
408407