[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