00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00070 #ifndef _STM_H_
00071 # define _STM_H_
00072
00073 # include <setjmp.h>
00074 # include <stdint.h>
00075 # include <stdio.h>
00076 # include <stdlib.h>
00077
00078
00079 # define STM_VERSION "1.0.0"
00080
00081 # define STM_VERSION_NB 100
00082
00083 # ifdef __cplusplus
00084 extern "C" {
00085 # endif
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 # ifdef EXPLICIT_TX_PARAMETER
00096 struct stm_tx;
00097 # define TXTYPE struct stm_tx *
00098 # define TXPARAM struct stm_tx *tx
00099 # define TXPARAMS struct stm_tx *tx,
00100 # define TXARG (struct stm_tx *)tx
00101 # define TXARGS (struct stm_tx *)tx,
00102 struct stm_tx *stm_current_tx();
00103 # else
00104 # define TXTYPE void
00105 # define TXPARAM
00106 # define TXPARAMS
00107 # define TXARG
00108 # define TXARGS
00109 #endif
00110
00111
00112
00113
00114
00119 typedef uintptr_t stm_word_t;
00120
00124 typedef struct stm_tx_attr {
00132 int id;
00139 int ro;
00140 } stm_tx_attr_t;
00141
00146 enum {
00150 STM_ABORT_EXPLICIT = 0x01,
00154 STM_ABORT_IMPLICIT = 0x02,
00159 STM_ABORT_RR_CONFLICT = (1 << 2) | 0x02,
00164 STM_ABORT_RW_CONFLICT = (2 << 2) | 0x02,
00169 STM_ABORT_WR_CONFLICT = (3 << 2) | 0x02,
00174 STM_ABORT_WW_CONFLICT = (4 << 2) | 0x02,
00178 STM_ABORT_VAL_READ = (5 << 2) | 0x02,
00182 STM_ABORT_VAL_WRITE = (6 << 2) | 0x02,
00186 STM_ABORT_VAL_COMMIT = (7 << 2) | 0x02,
00190 STM_ABORT_RO_WRITE = (8 << 2) | 0x02,
00194 STM_ABORT_KILLED = (9 << 2) | 0x02,
00198 STM_ABORT_SIGNAL = (12 << 2) | 0x02,
00202 STM_ABORT_OTHER = (13 << 2) | 0x02
00203 };
00204
00205
00206
00207
00208
00214 void stm_init();
00215
00220 void stm_exit();
00221
00227 TXTYPE stm_init_thread();
00228
00233 void stm_exit_thread(TXPARAM);
00234
00248 void stm_start(TXPARAMS sigjmp_buf *env, stm_tx_attr_t *attr);
00249
00257 int stm_commit(TXPARAM);
00258
00265 void stm_abort(TXPARAM);
00266
00279 stm_word_t stm_load(TXPARAMS volatile stm_word_t *addr);
00280
00292 void stm_store(TXPARAMS volatile stm_word_t *addr, stm_word_t value);
00293
00309 void stm_store2(TXPARAMS volatile stm_word_t *addr, stm_word_t value, stm_word_t mask);
00310
00317 int stm_active(TXPARAM);
00318
00325 int stm_aborted(TXPARAM);
00326
00339 sigjmp_buf *stm_get_env(TXPARAM);
00340
00349 stm_tx_attr_t *stm_get_attributes(TXPARAM);
00350
00363 int stm_get_stats(TXPARAMS const char *name, void *val);
00364
00377 int stm_get_parameter(const char *name, void *val);
00378
00390 int stm_set_parameter(const char *name, void *val);
00391
00400 int stm_create_specific();
00401
00411 void *stm_get_specific(TXPARAMS int key);
00412
00422 void stm_set_specific(TXPARAMS int key, void *data);
00423
00443 int stm_register(void (*on_thread_init)(TXPARAMS void *arg),
00444 void (*on_thread_exit)(TXPARAMS void *arg),
00445 void (*on_start)(TXPARAMS void *arg),
00446 void (*on_commit)(TXPARAMS void *arg),
00447 void (*on_abort)(TXPARAMS void *arg),
00448 void *arg);
00449
00464 stm_word_t stm_unit_load(volatile stm_word_t *addr, stm_word_t *timestamp);
00465
00487 int stm_unit_store(volatile stm_word_t *addr, stm_word_t value, stm_word_t *timestamp);
00488
00514 int stm_unit_store2(volatile stm_word_t *addr, stm_word_t value, stm_word_t mask, stm_word_t *timestamp);
00515
00530 void stm_set_extension(TXPARAMS int enable, stm_word_t *timestamp);
00531
00539 stm_word_t stm_get_clock();
00540
00541 #ifdef __cplusplus
00542 }
00543 #endif
00544
00545 #endif