Author: Armin Rigo <ar...@tunes.org> Branch: hashtable-iter Changeset: r1601:5e3761dd15b6 Date: 2015-02-01 10:50 +0100 http://bitbucket.org/pypy/stmgc/changeset/5e3761dd15b6/
Log: Adding tests for stm_hashtable_list diff --git a/c7/test/support.py b/c7/test/support.py --- a/c7/test/support.py +++ b/c7/test/support.py @@ -167,17 +167,23 @@ void (*stmcb_finalizer)(object_t *); typedef struct stm_hashtable_s stm_hashtable_t; +typedef ... stm_hashtable_entry_t; stm_hashtable_t *stm_hashtable_create(void); void stm_hashtable_free(stm_hashtable_t *); bool _check_hashtable_read(object_t *, stm_hashtable_t *, uintptr_t key); object_t *hashtable_read_result; bool _check_hashtable_write(object_t *, stm_hashtable_t *, uintptr_t key, object_t *nvalue, stm_thread_local_t *tl); +long stm_hashtable_length_upper_bound(stm_hashtable_t *); +long stm_hashtable_list(object_t *, stm_hashtable_t *, + stm_hashtable_entry_t **results); uint32_t stm_hashtable_entry_userdata; void stm_hashtable_tracefn(stm_hashtable_t *, void (object_t **)); void _set_hashtable(object_t *obj, stm_hashtable_t *h); stm_hashtable_t *_get_hashtable(object_t *obj); +uintptr_t _get_entry_index(stm_hashtable_entry_t *entry); +object_t *_get_entry_object(stm_hashtable_entry_t *entry); """) @@ -308,6 +314,18 @@ return *(stm_hashtable_t *TLPREFIX *)field_addr; } +uintptr_t _get_entry_index(stm_hashtable_entry_t *entry) +{ + stm_read((object_t *)entry); + return entry->index; +} + +object_t *_get_entry_object(stm_hashtable_entry_t *entry) +{ + stm_read((object_t *)entry); + return entry->object; +} + void _set_ptr(object_t *obj, int n, object_t *v) { long nrefs = (long)((myobj_t*)obj)->type_id - 421420; diff --git a/c7/test/test_hashtable.py b/c7/test/test_hashtable.py --- a/c7/test/test_hashtable.py +++ b/c7/test/test_hashtable.py @@ -16,6 +16,19 @@ if res: raise Conflict +def ht_length_upper_bound(o): + h = get_hashtable(o) + return lib.stm_hashtable_length_upper_bound(h) + +def htitems(o): + h = get_hashtable(o) + upper_bound = lib.stm_hashtable_length_upper_bound(h) + entries = ffi.new("stm_hashtable_entry_t *[]", upper_bound) + count = lib.stm_hashtable_list(o, h, entries) + assert count <= upper_bound + return [(lib._get_entry_index(entries[i]), + lib._get_entry_object(entries[i])) for i in range(count)] + class BaseTestHashtable(BaseTest): @@ -236,6 +249,28 @@ assert htget(h, 11) != ffi.NULL assert htget(h, 12) != ffi.NULL + def test_list_1(self): + self.start_transaction() + h = self.allocate_hashtable() + tl0 = self.tls[self.current_thread] + for i in range(32): + assert ht_length_upper_bound(h) == i + htset(h, 19 ^ i, stm_allocate(32), tl0) + assert ht_length_upper_bound(h) == 32 + + def test_list_2(self): + self.start_transaction() + h = self.allocate_hashtable() + tl0 = self.tls[self.current_thread] + expected = [] + for i in range(29): + lp = stm_allocate(32) + htset(h, 19 ^ i, lp, tl0) + expected.append((19 ^ i, lp)) + lst = htitems(h) + assert len(lst) == 29 + assert sorted(lst) == sorted(expected) + class TestRandomHashtable(BaseTestHashtable): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit