Author: Armin Rigo <[email protected]>
Branch:
Changeset: r77:9baaba7aa86d
Date: 2013-06-06 13:55 +0200
http://bitbucket.org/pypy/stmgc/changeset/9baaba7aa86d/
Log: Move the code to a new directory "c4" as I need it.
diff --git a/c3/atomic_ops.h b/c4/atomic_ops.h
rename from c3/atomic_ops.h
rename to c4/atomic_ops.h
diff --git a/c3/dbgmem.c b/c4/dbgmem.c
rename from c3/dbgmem.c
rename to c4/dbgmem.c
diff --git a/c3/dbgmem.h b/c4/dbgmem.h
rename from c3/dbgmem.h
rename to c4/dbgmem.h
diff --git a/c3/doc-objects.txt b/c4/doc-objects.txt
rename from c3/doc-objects.txt
rename to c4/doc-objects.txt
diff --git a/c3/doc-stmgc.txt b/c4/doc-stmgc.txt
rename from c3/doc-stmgc.txt
rename to c4/doc-stmgc.txt
diff --git a/c3/et.c b/c4/et.c
rename from c3/et.c
rename to c4/et.c
--- a/c3/et.c
+++ b/c4/et.c
@@ -192,10 +192,13 @@
}
else
{
- abort(); // stealing
+ /* stealing */
+ fprintf(stderr, "read_barrier: %p -> stealing %p...", G, (gcptr)v);
+ abort();
}
}
+#if 0
static gcptr _latest_gcptr(gcptr R)
{
/* don't use, for tests only */
@@ -270,6 +273,7 @@
return obj;
}
}
+#endif
#if 0
void *stm_DirectReadBarrierFromR(void *G1, void *R_Container1, size_t offset)
@@ -294,6 +298,14 @@
#endif
}
+gcptr stmgc_duplicate(gcptr P)
+{
+ size_t size = stmcb_size(P);
+ gcptr L = stm_malloc(size);
+ memcpy(L, P, size);
+ return L;
+}
+
static gcptr LocalizeProtected(struct tx_descriptor *d, gcptr P)
{
gcptr B;
@@ -307,7 +319,7 @@
if (P->h_revision & 1)
{
/* does not have a backup yet */
- B = stmgc_duplicate(P, 0);
+ B = stmgc_duplicate(P);
B->h_tid |= GCFLAG_BACKUP_COPY;
}
else
@@ -338,7 +350,7 @@
R->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
not_found:;
- gcptr L = stmgc_duplicate(R, 0);
+ gcptr L = stmgc_duplicate(R);
assert(!(L->h_tid & GCFLAG_BACKUP_COPY));
assert(!(L->h_tid & GCFLAG_STOLEN));
assert(!(L->h_tid & GCFLAG_STUB));
@@ -556,7 +568,7 @@
gcptrlist_clear(&d->list_of_read_objects);
g2l_clear(&d->private_to_backup);
- stmgc_abort_transaction(d);
+ abort();//stmgc_abort_transaction(d);
fprintf(stderr,
"\n"
@@ -620,7 +632,7 @@
}
assert(d->list_of_read_objects.size == 0);
assert(!g2l_any_entry(&d->private_to_backup));
- stmgc_start_transaction(d);
+ assert(!g2l_any_entry(&d->public_to_private));
d->count_reads = 1;
fxcache_clear(&d->recent_reads_cache);
@@ -750,10 +762,10 @@
gcptr R = item->addr;
revision_t v = (revision_t)item->val;
+ assert(R->h_tid & GCFLAG_PUBLIC);
assert(R->h_tid & GCFLAG_PUBLIC_TO_PRIVATE);
assert(!(R->h_tid & GCFLAG_NURSERY_MOVED));
assert(!(R->h_tid & GCFLAG_STOLEN));
- assert(!is_young(R));
assert(R->h_revision != localrev);
/* XXX compactify and don't leak! */
@@ -773,6 +785,7 @@
#endif
ACCESS_ONCE(R->h_revision) = w;
+#if 0
if (R->h_tid & GCFLAG_PREBUILT_ORIGINAL)
{
/* cannot possibly get here more than once for a given value of R */
@@ -781,12 +794,14 @@
pthread_mutex_unlock(&mutex_prebuilt_gcroots);
/*mark*/
}
+#endif
} G2L_LOOP_END;
g2l_clear(&d->public_to_private);
}
+#if 0
void UpdateProtectedChainHeads(struct tx_descriptor *d, revision_t cur_time,
revision_t localrev)
{
@@ -805,6 +820,7 @@
L->h_revision = new_revision;
}
}
+#endif
void TurnPrivateWithBackupToProtected(struct tx_descriptor *d,
revision_t cur_time)
@@ -829,7 +845,7 @@
struct tx_descriptor *d = thread_descriptor;
assert(d->active >= 1);
- stmgc_stop_transaction(d);
+ spinlock_acquire(d->collection_lock, 'C'); /* committing */
AcquireLocks(d);
if (is_inevitable(d))
@@ -851,10 +867,10 @@
if (cur_time & 1)
{ // there is another inevitable transaction
CancelLocks(d);
- stmgc_suspend_commit_transaction(d);
+ spinlock_release(d->collection_lock);
inev_mutex_acquire(); // wait until released
inev_mutex_release();
- stmgc_stop_transaction(d);
+ spinlock_acquire(d->collection_lock, 'C');
AcquireLocks(d);
continue;
}
@@ -879,8 +895,8 @@
TurnPrivateWithBackupToProtected(d, cur_time);
revision_t localrev = stm_private_rev_num;
- UpdateProtectedChainHeads(d, cur_time, localrev);
- smp_wmb();
+ //UpdateProtectedChainHeads(d, cur_time, localrev);
+ //smp_wmb();
revision_t newrev = -(cur_time + 1);
assert(newrev & 1);
@@ -890,7 +906,7 @@
UpdateChainHeads(d, cur_time, localrev);
- stmgc_committed_transaction(d);
+ spinlock_release(d->collection_lock);
d->num_commits++;
d->active = 0;
stm_stop_sharedlock();
@@ -1107,6 +1123,7 @@
thread_descriptor = NULL;
+ g2l_delete(&d->public_to_private);
g2l_delete(&d->private_to_backup);
gcptrlist_delete(&d->list_of_read_objects);
gcptrlist_delete(&d->abortinfo);
diff --git a/c3/et.h b/c4/et.h
rename from c3/et.h
rename to c4/et.h
--- a/c3/et.h
+++ b/c4/et.h
@@ -13,6 +13,7 @@
#define LOCKED ((INTPTR_MAX - 0xffff) | 1)
+#define WORD sizeof(gcptr)
#define HANDLE_BLOCK_SIZE (2 * WORD)
/* Description of the flags
@@ -100,11 +101,13 @@
#define SPINLOOP_REASONS 4
struct tx_descriptor {
- NURSERY_FIELDS_DECL
- local_gcpages_t *local_gcpages;
jmp_buf *setjmp_buf;
revision_t start_time;
revision_t my_lock;
+ revision_t collection_lock;
+ gcptr *shadowstack;
+ gcptr **shadowstack_end_ref;
+
long atomic; /* 0 = not atomic, > 0 atomic */
unsigned long count_reads;
unsigned long reads_size_limit; /* see should_break_tr. */
@@ -119,6 +122,7 @@
struct GcPtrList list_of_read_objects;
struct GcPtrList abortinfo;
struct G2L private_to_backup;
+ struct G2L public_to_private;
char *longest_abort_info;
long long longest_abort_info_time;
struct FXCache recent_reads_cache;
diff --git a/c3/fprintcolor.c b/c4/fprintcolor.c
rename from c3/fprintcolor.c
rename to c4/fprintcolor.c
diff --git a/c3/fprintcolor.h b/c4/fprintcolor.h
rename from c3/fprintcolor.h
rename to c4/fprintcolor.h
diff --git a/c3/lists.c b/c4/lists.c
rename from c3/lists.c
rename to c4/lists.c
diff --git a/c3/lists.h b/c4/lists.h
rename from c3/lists.h
rename to c4/lists.h
diff --git a/c3/stmgc.h b/c4/stmgc.h
rename from c3/stmgc.h
rename to c4/stmgc.h
diff --git a/c3/stmimpl.h b/c4/stmimpl.h
rename from c3/stmimpl.h
rename to c4/stmimpl.h
--- a/c3/stmimpl.h
+++ b/c4/stmimpl.h
@@ -30,8 +30,6 @@
#include "fprintcolor.h"
#include "lists.h"
#include "dbgmem.h"
-#include "nursery.h"
-#include "gcpage.h"
#include "et.h"
#include "stmsync.h"
diff --git a/c3/stmsync.c b/c4/stmsync.c
rename from c3/stmsync.c
rename to c4/stmsync.c
--- a/c3/stmsync.c
+++ b/c4/stmsync.c
@@ -59,19 +59,19 @@
{
int r = DescriptorInit();
assert(r == 1);
- stmgc_init_tls();
+ //stmgc_init_tls();
init_shadowstack();
- stmgcpage_init_tls();
+ //stmgcpage_init_tls();
BeginInevitableTransaction();
}
void stm_finalize(void)
{
- stmgc_minor_collect(); /* force everything out of the nursery */
+ //stmgc_minor_collect(); /* force everything out of the nursery */
CommitTransaction();
- stmgcpage_done_tls();
+ //stmgcpage_done_tls();
done_shadowstack();
- stmgc_done_tls();
+ //stmgc_done_tls();
DescriptorDone();
}
@@ -95,18 +95,16 @@
gcptr stm_allocate(size_t size, unsigned long tid)
{
- gcptr result = stm_allocate_object_of_size(size);
+ gcptr result = stm_malloc(size);
assert(tid == (tid & STM_USER_TID_MASK));
result->h_tid = tid;
+ result->h_revision = stm_private_rev_num;
return result;
}
gcptr _stm_allocate_old(size_t size, unsigned long tid)
{
- gcptr result = _stm_allocate_object_of_size_old(size);
- assert(tid == (tid & STM_USER_TID_MASK));
- result->h_tid = tid | GCFLAG_OLD;
- return result;
+ abort();
}
/************************************************************/
@@ -237,12 +235,12 @@
{
int err = pthread_rwlock_rdlock(&rwlock_shared);
assert(err == 0);
- assert(stmgc_nursery_hiding(thread_descriptor, 0));
+ //assert(stmgc_nursery_hiding(thread_descriptor, 0));
}
void stm_stop_sharedlock(void)
{
- assert(stmgc_nursery_hiding(thread_descriptor, 1));
+ //assert(stmgc_nursery_hiding(thread_descriptor, 1));
int err = pthread_rwlock_unlock(&rwlock_shared);
assert(err == 0);
}
@@ -303,3 +301,15 @@
which takes priority here */
stm_start_sharedlock();
}
+
+/************************************************************/
+
+void stm_clear_between_tests(void)
+{
+ fprintf(stderr, "\n"
+ "===============================================================\n"
+ "========================[ START ]============================\n"
+ "===============================================================\n"
+ "\n");
+ //gcptrlist_clear(&stm_prebuilt_gcroots);
+}
diff --git a/c3/stmsync.h b/c4/stmsync.h
rename from c3/stmsync.h
rename to c4/stmsync.h
--- a/c3/stmsync.h
+++ b/c4/stmsync.h
@@ -11,4 +11,6 @@
void stm_possible_safe_point(void);
+void stm_clear_between_tests(void);
+
#endif
diff --git a/c3/test/support.py b/c4/test/support.py
rename from c3/test/support.py
rename to c4/test/support.py
--- a/c3/test/support.py
+++ b/c4/test/support.py
@@ -5,11 +5,11 @@
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
header_files = [os.path.join(parent_dir, _n) for _n in
- "et.h lists.h nursery.h gcpage.h "
+ "et.h lists.h "
"stmsync.h dbgmem.h fprintcolor.h "
"stmgc.h stmimpl.h atomic_ops.h".split()]
source_files = [os.path.join(parent_dir, _n) for _n in
- "et.c lists.c nursery.c gcpage.c "
+ "et.c lists.c "
"stmsync.c dbgmem.c fprintcolor.c".split()]
_pycache_ = os.path.join(parent_dir, 'test', '__pycache__')
@@ -40,7 +40,7 @@
#define PREBUILT_FLAGS ...
#define PREBUILT_REVISION ...
- gcptr stm_allocate_object_of_size(size_t size);
+ //gcptr stm_allocate_object_of_size(size_t size);
gcptr stm_allocate(size_t size, unsigned long tid);
void stm_push_root(gcptr);
gcptr stm_pop_root(void);
@@ -55,15 +55,15 @@
void stm_set_transaction_length(long length_max);
/* extra non-public code */
- gcptr stmgcpage_malloc(size_t size);
- void stmgcpage_free(gcptr obj);
- long stmgcpage_count(int quantity);
- void stmgcpage_possibly_major_collect(int);
+ //gcptr stmgcpage_malloc(size_t size);
+ //void stmgcpage_free(gcptr obj);
+ //long stmgcpage_count(int quantity);
+ //void stmgcpage_possibly_major_collect(int);
revision_t stm_global_cur_time(void);
- void stmgcpage_add_prebuilt_root(gcptr);
+ //void stmgcpage_add_prebuilt_root(gcptr);
void stm_clear_between_tests(void);
- void stmgc_minor_collect(void);
- gcptr _stm_nonrecord_barrier(gcptr, int *);
+ //void stmgc_minor_collect(void);
+ //gcptr _stm_nonrecord_barrier(gcptr, int *);
int stm_dbgmem_is_active(void *p, int allow_outside);
void stm_start_sharedlock(void);
void stm_stop_sharedlock(void);
@@ -86,8 +86,8 @@
revision_t get_start_time(void);
revision_t get_my_lock(void);
- gcptr *addr_of_thread_local(void);
- int in_nursery(gcptr);
+ //gcptr *addr_of_thread_local(void);
+ //int in_nursery(gcptr);
void stm_initialize_tests(int max_aborts);
/* some constants normally private that are useful in the tests */
@@ -106,22 +106,20 @@
#define GCFLAG_STOLEN ...
#define GCFLAG_STUB ...
#define ABRT_MANUAL ...
- typedef struct { ...; } page_header_t;
+ //typedef struct { ...; } page_header_t;
''')
lib = ffi.verify(r'''
#include "stmgc.h"
#include "stmimpl.h"
- extern gcptr stmgcpage_malloc(size_t size);
- extern void stmgcpage_free(gcptr obj);
- extern long stmgcpage_count(int quantity);
- extern void stmgcpage_possibly_major_collect(int);
+ //extern gcptr stmgcpage_malloc(size_t size);
+ //extern void stmgcpage_free(gcptr obj);
+ //extern long stmgcpage_count(int quantity);
+ //extern void stmgcpage_possibly_major_collect(int);
extern revision_t stm_global_cur_time(void);
- extern void stmgcpage_add_prebuilt_root(gcptr);
- extern void stm_clear_between_tests(void);
+ //extern void stmgcpage_add_prebuilt_root(gcptr);
extern revision_t get_private_rev_num(void);
- extern local_gcpages_t *stm_local_gcpages(void);
int gettid(gcptr obj)
{
@@ -214,17 +212,17 @@
return thread_descriptor->my_lock;
}
- gcptr *addr_of_thread_local(void)
+ /*gcptr *addr_of_thread_local(void)
{
return &stm_thread_local_obj;
- }
+ }*/
- int in_nursery(gcptr obj)
+ /*int in_nursery(gcptr obj)
{
assert(stm_dbgmem_is_active(obj, 1));
struct tx_descriptor *d = thread_descriptor;
return (d->nursery <= (char*)obj && ((char*)obj) < d->nursery_end);
- }
+ }*/
void stm_initialize_tests(int max_aborts)
{
@@ -275,7 +273,7 @@
HDR = ffi.sizeof("struct stm_object_s")
WORD = lib.WORD
-PAGE_ROOM = lib.GC_PAGE_SIZE - ffi.sizeof("page_header_t")
+#PAGE_ROOM = lib.GC_PAGE_SIZE - ffi.sizeof("page_header_t")
for name in lib.__dict__:
if name.startswith('GCFLAG_') or name.startswith('PREBUILT_'):
globals()[name] = getattr(lib, name)
@@ -416,7 +414,7 @@
lib.settid(p, 42 + size)
return p
-ofree = lib.stmgcpage_free
+#ofree = lib.stmgcpage_free
def oalloc_refs(nrefs):
"Allocate an 'old' object, i.e. outside any nursery, with nrefs pointers"
diff --git a/c3/test/test_et.py b/c4/test/test_et.py
rename from c3/test/test_et.py
rename to c4/test/test_et.py
--- a/c3/test/test_et.py
+++ b/c4/test/test_et.py
@@ -223,3 +223,15 @@
p4 = lib.stm_read_barrier(p)
assert p4 == p2
assert list_of_read_objects() == [p2]
+
+def test_stealing_protected_without_backup():
+ p = palloc(HDR + WORD)
+ def f1(r):
+ lib.setlong(p, 0, 2782172)
+ lib.stm_commit_transaction()
+ lib.stm_begin_inevitable_transaction()
+ r.set(2)
+ def f2(r):
+ r.wait(2)
+ assert lib.getlong(p, 0) == 2782172
+ run_parallel(f1, f2)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit