grt_bool_t hashtable_insert(grt_word_t val) { unsigned bucket = compute_hash(val); node_t *p, *q; stm_start(); grt_word_t *loc = (grt_word_t*) &table[bucket]; stm_open_for_read(table_proc, loc); stm_read(table_proc, loc, (grt_word_t*) &p); if (find_node_stm(val, p)) { stm_commit(); return GRT_TRUE; } q = (node_t*) stm_alloc(table_proc, sizeof(node_t)); loc = (grt_word_t*) &q->next; stm_open_for_write(table_proc, loc); stm_write(table_proc, (grt_word_t) p, loc); loc = (grt_word_t*) &q->val; stm_open_for_write(table_proc, loc); stm_write(table_proc, val, loc); loc = (grt_word_t*) &table[bucket]; stm_open_for_write(table_proc, loc); stm_write(table_proc, (grt_word_t) q, loc); stm_commit(); return GRT_FALSE; }
/* * Called by the CURRENT thread to store part of a word-sized value. */ void stm_store2(TXPARAMS volatile stm_word_t *addr, stm_word_t value, stm_word_t mask) { TX_GET; stm_write(tx, addr, value, mask); }
/* * Called by the CURRENT thread to store a word-sized value. */ void stm_store(TXPARAMS volatile stm_word_t *addr, stm_word_t value) { TX_GET; stm_write(tx, addr, value, ~(stm_word_t)0); }