示例#1
0
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;
}
示例#2
0
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);
    }
}