Author: Armin Rigo <ar...@tunes.org> Branch: c7 Changeset: r640:d1bebba84ce9 Date: 2014-01-18 15:35 +0100 http://bitbucket.org/pypy/stmgc/changeset/d1bebba84ce9/
Log: in-progress diff --git a/c7/core.c b/c7/core.c --- a/c7/core.c +++ b/c7/core.c @@ -219,6 +219,11 @@ return o; } +object_t *stm_allocate_prebuilt(size_t size) +{ + return _stm_allocate_old(size); /* XXX */ +} + static void _stm_privatize(uintptr_t pagenum) { diff --git a/c7/core.h b/c7/core.h --- a/c7/core.h +++ b/c7/core.h @@ -1,6 +1,7 @@ #ifndef _STM_CORE_H #define _STM_CORE_H +#include <stddef.h> #include <stdint.h> #include <stdbool.h> @@ -117,6 +118,8 @@ bool _stm_is_young(object_t *o); object_t *_stm_allocate_old(size_t size); +object_t *stm_allocate_prebuilt(size_t size); + void _stm_start_safe_point(void); void _stm_stop_safe_point(void); diff --git a/duhton/Makefile b/duhton/Makefile --- a/duhton/Makefile +++ b/duhton/Makefile @@ -1,11 +1,16 @@ + +C7SOURCES = ../c7/core.c \ + ../c7/pagecopy.c \ + ../c7/list.c \ + ../c7/reader_writer_lock.c all: duhton_debug duhton duhton: *.c *.h ../c4/*.c ../c4/*.h - gcc -pthread -g -O2 -o duhton *.c ../c4/stmgc.c -Wall -lrt + clang -pthread -g -O2 -o duhton *.c $(C7SOURCES) -Wall duhton_debug: *.c *.h ../c4/*.c ../c4/*.h - gcc -pthread -g -DDu_DEBUG -D_GC_DEBUGPRINTS=1 -DGC_NURSERY=2048 -o duhton_debug *.c ../c4/stmgc.c -Wall -lrt + clang -pthread -g -DDu_DEBUG -o duhton_debug *.c $(C7SOURCES) -Wall clean: rm -f duhton duhton_debug diff --git a/duhton/README b/duhton/README --- a/duhton/README +++ b/duhton/README @@ -16,3 +16,12 @@ There are demos: try "time duhton demo/many_square_roots.duh". For more general information see the PAPERS file. + + + + + +XXX +=== + +* remove _du_read1() on immutable objects diff --git a/duhton/consobject.c b/duhton/consobject.c --- a/duhton/consobject.c +++ b/duhton/consobject.c @@ -1,10 +1,10 @@ #include "duhton.h" -void cons_trace(DuConsObject *ob, void visit(gcptr *)) +void cons_trace(struct DuConsObject_s *ob, void visit(object_t **)) { - visit(&ob->car); - visit(&ob->cdr); + visit((object_t **)&ob->car); + visit((object_t **)&ob->cdr); } void cons_print(DuConsObject *ob) diff --git a/duhton/containerobject.c b/duhton/containerobject.c --- a/duhton/containerobject.c +++ b/duhton/containerobject.c @@ -1,14 +1,14 @@ #include "duhton.h" -typedef struct { - DuOBJECT_HEAD +typedef TLPREFIX struct DuContainerObject_s { + DuOBJECT_HEAD1 DuObject *ob_reference; } DuContainerObject; -void container_trace(DuContainerObject *ob, void visit(gcptr *)) +void container_trace(struct DuContainerObject_s *ob, void visit(object_t **)) { - visit(&ob->ob_reference); + visit((object_t **)&ob->ob_reference); } void container_print(DuContainerObject *ob) diff --git a/duhton/duhton.c b/duhton/duhton.c --- a/duhton/duhton.c +++ b/duhton/duhton.c @@ -1,3 +1,4 @@ +#include <string.h> #include "duhton.h" #define DEFAULT_NUM_THREADS 4 diff --git a/duhton/duhton.h b/duhton/duhton.h --- a/duhton/duhton.h +++ b/duhton/duhton.h @@ -1,18 +1,20 @@ #ifndef _DUHTON_H_ #define _DUHTON_H_ -#include "../c4/stmgc.h" -#include "../c4/fprintcolor.h" +#include "../c7/core.h" #include <stdio.h> #include <stdlib.h> #include <assert.h> -typedef struct stm_object_s DuObject; +struct DuObject_s { + struct object_s header; + uint32_t type_id; +}; +typedef TLPREFIX struct DuObject_s DuObject; -#define DuOBJECT_HEAD DuObject ob_base; -#define DuOBJECT_HEAD_INIT(type) { type | PREBUILT_FLAGS, PREBUILT_REVISION } +#define DuOBJECT_HEAD1 DuObject ob_base; #ifdef __GNUC__ @@ -22,8 +24,8 @@ #endif -typedef void(*trace_fn)(DuObject *, void visit(gcptr *)); -typedef size_t(*bytesize_fn)(DuObject *); +typedef void(*trace_fn)(struct DuObject_s *, void visit(object_t **)); +typedef size_t(*bytesize_fn)(struct DuObject_s *); typedef void(*print_fn)(DuObject *); typedef DuObject *(*eval_fn)(DuObject *, DuObject *); typedef int(*len_fn)(DuObject *); @@ -71,10 +73,9 @@ int DuObject_Length(DuObject *ob); -extern DuObject _Du_NoneStruct; -#define Du_None (&_Du_NoneStruct) +extern DuObject *Du_None; -#define _DuObject_TypeNum(ob) stm_get_tid((DuObject*)(ob)) +#define _DuObject_TypeNum(ob) (((DuObject*)(ob))->type_id) #define Du_TYPE(ob) (Du_Types[_DuObject_TypeNum(ob)]) #define DuInt_Check(ob) (_DuObject_TypeNum(ob) == DUTYPE_INT) #define DuSymbol_Check(ob) (_DuObject_TypeNum(ob) == DUTYPE_SYMBOL) @@ -107,9 +108,10 @@ DuObject *DuSymbol_FromString(const char *name); char *DuSymbol_AsString(DuObject *ob); +int DuSymbol_Id(DuObject *ob); -typedef struct { - DuOBJECT_HEAD +typedef TLPREFIX struct DuConsObject_s { + DuOBJECT_HEAD1 DuObject *car, *cdr; } DuConsObject; @@ -136,11 +138,10 @@ DuObject *arglist, DuObject *progn); DuObject *_DuFrame_EvalCall(DuObject *frame, DuObject *symbol, DuObject *rest, int execute_now); -DuObject *_Du_GetGlobals(void); void Du_Initialize(int); void Du_Finalize(void); -#define Du_Globals (_Du_GetGlobals()) +extern DuObject *Du_Globals; void Du_TransactionAdd(DuObject *code, DuObject *frame); void Du_TransactionRun(void); @@ -160,23 +161,23 @@ p2 = (typeof(p2))_pop_root(), \ p1 = (typeof(p1))_pop_root()) -#define _du_read1(p1) (p1 = (typeof(p1))stm_read_barrier((DuObject *)(p1))) -#define _du_write1(p1) (p1 = (typeof(p1))stm_write_barrier((DuObject *)(p1))) +#define _du_read1(p1) stm_read((object_t *)(p1)) +#define _du_write1(p1) stm_write((object_t *)(p1)) #ifdef NDEBUG -# define _push_root(ob) stm_push_root(ob) +# define _push_root(ob) stm_push_root((object_t *)ob) # define _pop_root() stm_pop_root() #else # define _check_not_free(ob) \ - assert(stm_get_tid((DuObject *)(ob)) > DUTYPE_INVALID && \ - stm_get_tid((DuObject *)(ob)) < _DUTYPE_TOTAL) -static inline void _push_root(gcptr ob) { + assert(_DuObject_TypeNum(ob) > DUTYPE_INVALID && \ + _DuObject_TypeNum(ob) < _DUTYPE_TOTAL) +static inline void _push_root(DuObject *ob) { if (ob) _check_not_free(ob); - stm_push_root(ob); + stm_push_root((object_t *)ob); } -static inline gcptr _pop_root(void) { - gcptr ob = stm_pop_root(); +static inline object_t *_pop_root(void) { + object_t *ob = stm_pop_root(); if (ob) _check_not_free(ob); return ob; } diff --git a/duhton/frame.c b/duhton/frame.c --- a/duhton/frame.c +++ b/duhton/frame.c @@ -1,70 +1,74 @@ #include "duhton.h" #include <stdint.h> -struct dictentry { - revision_t symbol_id; +typedef TLPREFIX struct dictentry_s { + int symbol_id; DuObject *symbol; DuObject *value; eval_fn builtin_macro; DuObject *func_arglist; DuObject *func_progn; -}; +} dictentry_t; -typedef struct { - DuOBJECT_HEAD +typedef TLPREFIX struct DuFrameNodeObject_s { + DuOBJECT_HEAD1 int ob_count; - struct dictentry ob_items[1]; + struct dictentry_s ob_items[1]; } DuFrameNodeObject; -void framenode_trace(DuFrameNodeObject *ob, void visit(gcptr *)) + +void framenode_trace(struct DuFrameNodeObject_s *ob, void visit(object_t **)) { int i; for (i=ob->ob_count-1; i>=0; i--) { - struct dictentry *e = &ob->ob_items[i]; - visit(&e->symbol); - visit(&e->value); - visit(&e->func_arglist); - visit(&e->func_progn); + struct dictentry_s *e = &ob->ob_items[i]; + visit((object_t **)&e->symbol); + visit((object_t **)&e->value); + visit((object_t **)&e->func_arglist); + visit((object_t **)&e->func_progn); } } -size_t framenode_bytesize(DuFrameNodeObject *ob) +size_t framenode_bytesize(struct DuFrameNodeObject_s *ob) { return (sizeof(DuFrameNodeObject) + - (ob->ob_count - 1) * sizeof(struct dictentry)); + (ob->ob_count - 1) * sizeof(struct dictentry_s)); } -typedef struct { - DuOBJECT_HEAD +typedef TLPREFIX struct DuFrameObject_s { + DuOBJECT_HEAD1 DuFrameNodeObject *ob_nodes; } DuFrameObject; -static DuFrameNodeObject du_empty_framenode = { - DuOBJECT_HEAD_INIT(DUTYPE_FRAMENODE), - 0, -}; +DuObject *Du_Globals; +static DuFrameNodeObject *du_empty_framenode; -DuFrameObject Du_GlobalsFrame = { - DuOBJECT_HEAD_INIT(DUTYPE_FRAME), - &du_empty_framenode, -}; +void init_prebuilt_frame_objects(void) +{ + du_empty_framenode = (DuFrameNodeObject *) + stm_allocate_prebuilt(sizeof(DuFrameNodeObject)); + du_empty_framenode->ob_base.type_id = DUTYPE_FRAMENODE; + du_empty_framenode->ob_count = 0; -DuObject *_Du_GetGlobals() -{ - return (DuObject *)&Du_GlobalsFrame; + DuFrameObject *g = (DuFrameObject *) + stm_allocate_prebuilt(sizeof(DuFrameObject)); + g->ob_base.type_id = DUTYPE_FRAME; + g->ob_nodes = du_empty_framenode; + Du_Globals = (DuObject *)g; } DuObject *DuFrame_New() { DuFrameObject *ob = (DuFrameObject *)DuObject_New(&DuFrame_Type); - ob->ob_nodes = &du_empty_framenode; + ob->ob_nodes = du_empty_framenode; return (DuObject *)ob; } #if 0 DuObject *DuFrame_Copy(DuObject *frame) { + XXX fix or kill DuFrame_Ensure("DuFrame_Copy", frame); int i; DuFrameObject *src = (DuFrameObject *)frame; @@ -84,9 +88,9 @@ } #endif -void frame_trace(DuFrameObject *ob, void visit(gcptr *)) +void frame_trace(struct DuFrameObject_s *ob, void visit(object_t **)) { - visit((gcptr *)&ob->ob_nodes); + visit((object_t **)&ob->ob_nodes); } void frame_print(DuFrameObject *ob) @@ -94,7 +98,7 @@ printf("<frame>"); } -static struct dictentry * +static dictentry_t * find_entry(DuFrameObject *frame, DuObject *symbol, int write_mode) { _du_read1(frame); @@ -103,21 +107,21 @@ _du_read1(ob); int left = 0; int right = ob->ob_count; - struct dictentry *entries = ob->ob_items; - revision_t search_id = stm_id(symbol); + dictentry_t *entries = ob->ob_items; + int search_id = DuSymbol_Id(symbol); #if 0 #ifdef _GC_DEBUG int j; for (j = 0; j < right; j++) { - dprintf(("\t%p\n", (gcptr)entries[j].symbol_id)); + dprintf(("\t%d\n", entries[j].symbol_id)); } #endif #endif while (right > left) { int middle = (left + right) / 2; - revision_t found_id = entries[middle].symbol_id; + int found_id = entries[middle].symbol_id; if (search_id < found_id) right = middle; else if (search_id == found_id) { @@ -137,22 +141,25 @@ else { int i; size_t size = (sizeof(DuFrameNodeObject) + - (ob->ob_count + 1 - 1)*sizeof(struct dictentry)); + (ob->ob_count + 1 - 1)*sizeof(dictentry_t)); DuFrameNodeObject *newob; _du_save3(ob, symbol, frame); - newob = (DuFrameNodeObject *)stm_allocate(size, DUTYPE_FRAMENODE); + newob = (DuFrameNodeObject *)stm_allocate(size); + newob->ob_base.type_id = DUTYPE_FRAMENODE; _du_restore3(ob, symbol, frame); newob->ob_count = ob->ob_count + 1; - struct dictentry *newentries = newob->ob_items; + dictentry_t *newentries = newob->ob_items; entries = ob->ob_items; for (i=0; i<left; i++) newentries[i] = entries[i]; DuSymbol_Ensure("find_entry", symbol); - dprintf(("NEW ENTRY ADDED WITH search_id = %p\n", (gcptr)search_id)); +#ifdef _GC_DEBUG + dprintf(("NEW ENTRY ADDED WITH search_id = %d\n", search_id)); +#endif newentries[left].symbol_id = search_id; newentries[left].symbol = symbol; newentries[left].value = NULL; @@ -178,7 +185,7 @@ DuObject *sym = DuSymbol_FromString(name); _du_restore1(frame); - struct dictentry *e = find_entry((DuFrameObject *)frame, sym, 1); + dictentry_t *e = find_entry((DuFrameObject *)frame, sym, 1); e->builtin_macro = func; } @@ -220,7 +227,7 @@ DuObject *_DuFrame_EvalCall(DuObject *frame, DuObject *symbol, DuObject *rest, int execute_now) { - struct dictentry *e; + dictentry_t *e; DuFrame_Ensure("_DuFrame_EvalCall", frame); e = find_entry((DuFrameObject *)frame, symbol, 0); @@ -269,7 +276,7 @@ DuObject *DuFrame_GetSymbol(DuObject *frame, DuObject *symbol) { - struct dictentry *e; + dictentry_t *e; DuFrame_Ensure("DuFrame_GetSymbol", frame); e = find_entry((DuFrameObject *)frame, symbol, 0); @@ -278,7 +285,7 @@ void DuFrame_SetSymbol(DuObject *frame, DuObject *symbol, DuObject *value) { - struct dictentry *e; + dictentry_t *e; DuFrame_Ensure("DuFrame_SetSymbol", frame); _du_save1(value); @@ -300,7 +307,7 @@ void DuFrame_SetUserFunction(DuObject *frame, DuObject *symbol, DuObject *arglist, DuObject *progn) { - struct dictentry *e; + dictentry_t *e; DuFrame_Ensure("DuFrame_SetUserFunction", frame); _du_save2(arglist, progn); diff --git a/duhton/glob.c b/duhton/glob.c --- a/duhton/glob.c +++ b/duhton/glob.c @@ -609,9 +609,14 @@ return Du_None; } +extern void init_prebuilt_frame_objects(void); + void Du_Initialize(int num_threads) { stm_initialize(); + + init_prebuilt_frame_objects(); + all_threads_count = num_threads; all_threads = (pthread_t*)malloc(sizeof(pthread_t) * num_threads); diff --git a/duhton/listobject.c b/duhton/listobject.c --- a/duhton/listobject.c +++ b/duhton/listobject.c @@ -185,10 +185,7 @@ (len_fn)list_length, }; -static DuTupleObject du_empty_tuple = { - DuOBJECT_HEAD_INIT(DUTYPE_TUPLE), - 0, -}; +static DuTupleObject *du_empty_tuple; DuObject *DuList_New() { diff --git a/duhton/object.c b/duhton/object.c --- a/duhton/object.c +++ b/duhton/object.c @@ -17,21 +17,22 @@ /* callback: get the size of an object */ -size_t stmcb_size(gcptr obj) +size_t stmcb_size(struct object_s *obj) { - DuType *tp = Du_TYPE(obj); + DuType *tp = Du_Types[((struct DuObject_s *)obj)->type_id]; size_t result = tp->dt_size; if (result == 0) - result = tp->dt_bytesize(obj); + result = tp->dt_bytesize((struct DuObject_s *)obj); return result; } /* callback: trace the content of an object */ -void stmcb_trace(gcptr obj, void visit(gcptr *)) +void stmcb_trace(struct object_s *obj, void visit(object_t **)) { - trace_fn trace = Du_TYPE(obj)->dt_trace; + DuType *tp = Du_Types[((struct DuObject_s *)obj)->type_id]; + trace_fn trace = tp->dt_trace; if (trace) - trace(obj, visit); + trace((struct DuObject_s *)obj, visit); } diff --git a/duhton/symbol.c b/duhton/symbol.c --- a/duhton/symbol.c +++ b/duhton/symbol.c @@ -4,6 +4,7 @@ typedef struct _Du_Symbol { DuOBJECT_HEAD + int myid; char *name; struct _Du_Symbol *next; } DuSymbolObject; @@ -50,6 +51,9 @@ (eval_fn)symbol_eval, }; + +static int next_id = 1; + DuObject *DuSymbol_FromString(const char *name) { DuSymbolObject *p, *head = &_Du_AllSymbols; @@ -61,6 +65,7 @@ } p = (DuSymbolObject *)DuObject_New(&DuSymbol_Type); p->name = strdup(name); + p->myid = __sync_fetch_and_add(&next_id, 1); _du_write1(head); p->next = head->next; @@ -76,6 +81,12 @@ return ((DuSymbolObject *)ob)->name; } +int DuSymbol_Id(DuObject *ob) +{ + DuSymbol_Ensure("DuSymbol_Id", ob); + return ((DuSymbolObject *)ob)->id; +} + void DuSymbol_Ensure(char *where, DuObject *ob) { if (!DuSymbol_Check(ob)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit