Portable lock-free data structures by Keir Fraser (MCAS)
[openafs.git] / src / mcas / stm.h
1 /******************************************************************************
2  * stm.h
3  *
4  * Interface definitions for software transactional memory (STM).
5  *
6  * Copyright (c) 2002-2003, K A Fraser
7  */
8
9 #include "ptst.h"
10 #include <setjmp.h>
11
12 typedef struct stm_st stm;
13 typedef struct stm_blk_st stm_blk;
14 typedef struct stm_tx_st stm_tx;
15
16 stm *new_stm(ptst_t *ptst, int blk_size);
17 void free_stm(ptst_t *ptst, stm *mem);
18
19 stm_blk *new_stm_blk(ptst_t *ptst, stm *mem);
20 void free_stm_blk(ptst_t *ptst, stm *mem, stm_blk *b);
21 void *init_stm_blk(ptst_t *ptst, stm *mem, stm_blk *b);
22 int sizeof_stm_blk(ptst_t *ptst, stm *mem, stm_blk *b);
23
24 stm_tx *new_stm_tx(ptst_t *ptst, stm *mem, sigjmp_buf *penv);
25 bool_t commit_stm_tx(ptst_t *ptst, stm_tx *t);
26 bool_t validate_stm_tx(ptst_t *ptst, stm_tx *t);
27 /* NB. Must still call commit after abort, but it's guaranteed to fail. */
28 void abort_stm_tx(ptst_t *ptst, stm_tx *t);
29
30 void *read_stm_blk(ptst_t *ptst, stm_tx *t, stm_blk *b);
31 void *write_stm_blk(ptst_t *ptst, stm_tx *t, stm_blk *b);
32
33 void remove_from_tx(ptst_t *ptst, stm_tx *t, stm_blk *b);
34
35 void _init_stm_subsystem(int pad_data);
36
37 #define new_stm_tx(_tx, _ptst, _mem)                \
38     do {                                            \
39         sigjmp_buf env;                             \
40         sigsetjmp(env, 1);                          \
41         (_tx) = new_stm_tx((_ptst), (_mem), &env);  \
42     } while ( 0 )