static void mod_free_record(void *addr, void (*rev_func)(void*)) { /* Memory disposal is delayed until commit */ mod_alloc_info_t *mi; mod_alloc_block_t *mb; if (!mod_alloc_initialized) { fprintf(stderr, "Module mod_alloc not mod_alloc_initialized\n"); exit(1); } mi = (mod_alloc_info_t *)stm_get_specific(mod_alloc_key); assert(mi != NULL); /* Overwrite to prevent inconsistent reads */ /* TODO delete operators doesn't give the allocated size */ /* Acquire lock and update version number */ stm_store2(addr, 0, 0); /* Schedule for removal */ if ((mb = (mod_alloc_block_t *)malloc(sizeof(mod_alloc_block_t))) == NULL) { perror("malloc"); exit(1); } mb->addr = addr; mb->rev_func = rev_func; mb->next = mi->freed; mi->freed = mb; }
void tm_store2(TXPARAMS volatile stm_word_t *addr, stm_word_t value, stm_word_t mask) { TX_GET; if (!tx->software) { hytm_store2(TXARGS addr, value, mask); } else { stm_store2(TXARGS addr, value, mask); } }