[pypy-commit] stmgc c7: in-progress

arigo noreply at buildbot.pypy.org
Sat Jan 18 15:35:35 CET 2014


Author: Armin Rigo <arigo at 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))


More information about the pypy-commit mailing list