Author: Armin Rigo <[email protected]>
Branch:
Changeset: r234:87869a164209
Date: 2013-06-22 14:55 +0200
http://bitbucket.org/pypy/stmgc/changeset/87869a164209/
Log: Simplify the allocation of stubs, at the cost of ~9/10th of a
pointer :-) For now it's good enough. We'll try later to compress
one or two pointer fields off some objects.
diff --git a/c4/steal.c b/c4/steal.c
--- a/c4/steal.c
+++ b/c4/steal.c
@@ -1,50 +1,14 @@
#include "stmimpl.h"
-#define STUB_PAGE (4096 - 2*WORD)
-#define STUB_NB_OBJS ((STUB_BLOCK_SIZE - 2*WORD) / \
- sizeof(struct stm_object_s))
-
-struct stub_block_s {
- struct tx_public_descriptor *thread;
- struct stub_block_s *next;
- struct stm_object_s stubs[STUB_NB_OBJS];
-};
-
inline void copy_to_old_id_copy(gcptr obj, gcptr id);
gcptr stm_stub_malloc(struct tx_public_descriptor *pd)
{
assert(pd->collection_lock != 0);
- gcptr p = pd->stub_free_list;
- if (p == NULL) {
- assert(sizeof(struct stub_block_s) == STUB_BLOCK_SIZE);
-
- /* XXX free! */
- char *page = stm_malloc(STUB_PAGE);
- char *page_end = page + STUB_PAGE;
- page += (-(revision_t)page) & (STUB_BLOCK_SIZE-1); /* round up */
-
- struct stub_block_s *b = (struct stub_block_s *)page;
- struct stub_block_s *nextb = NULL;
- gcptr nextp = NULL;
- int i;
-
- while (((char *)(b + 1)) <= page_end) {
- b->thread = pd;
- b->next = nextb;
- for (i = 0; i < STUB_NB_OBJS; i++) {
- b->stubs[i].h_revision = (revision_t)nextp;
- nextp = &b->stubs[i];
- }
- b++;
- }
- assert(nextp != NULL);
- p = nextp;
- }
- pd->stub_free_list = (gcptr)p->h_revision;
- assert(STUB_THREAD(p) == pd);
+ gcptr p = stmgcpage_malloc(sizeof(struct stm_stub_s));
+ STUB_THREAD(p) = pd;
return p;
}
diff --git a/c4/steal.h b/c4/steal.h
--- a/c4/steal.h
+++ b/c4/steal.h
@@ -2,10 +2,12 @@
#define _SRCSTM_STEAL_H
-#define STUB_BLOCK_SIZE (32 * WORD) /* power of two */
+struct stm_stub_s {
+ struct stm_object_s s_header;
+ struct tx_public_descriptor *s_thread;
+};
-#define STUB_THREAD(h) (*(struct tx_public_descriptor **) \
- (((revision_t)(h)) & ~(STUB_BLOCK_SIZE-1)))
+#define STUB_THREAD(h) (((struct stm_stub_s *)(h))->s_thread)
gcptr stm_stub_malloc(struct tx_public_descriptor *);
void stm_steal_stub(gcptr);
diff --git a/c4/test/support.py b/c4/test/support.py
--- a/c4/test/support.py
+++ b/c4/test/support.py
@@ -100,7 +100,6 @@
/* some constants normally private that are useful in the tests */
#define WORD ...
#define GC_PAGE_SIZE ...
- #define STUB_BLOCK_SIZE ...
#define GCFLAG_OLD ...
#define GCFLAG_VISITED ...
#define GCFLAG_PUBLIC ...
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit