#define __SPEC_SEQUENTIAL_GENERATED_H
#include <specannotation.h>
#include <spec_private_hashtable.h>
+#include <spec_tag.h>
/* Beginning of struct Sequential */
typedef struct Sequential {
- spec_private_hashtable cond;
+ spec_private_hashtable condition;
spec_private_hashtable id;
spec_private_hashtable interface;
spec_private_hashtable interface_call_sequence;
+ Tag global_call_sequence;
/* DefineVar unfolded here */
spec_private_hashtable Put__Old_Val;
/* Define function for sequential code initialization */
void __sequential_init() {
/* Init internal variables */
- init(&__sequential.cond);
+ init(&__sequential.condition);
init(&__sequential.id);
init(&__sequential.interface);
init(&__sequential.interface_call_sequence);
+ init(&global_call_sequence);
/* Init DefineVars */
init(&__sequential.Put__Old_Val);
/* Init user-defined variables */
lock_acquired = false;
reader_lock_cnt = 0;
+
+ /* Pass the happens-before initialization here */
+ /* PutIfAbsent (putIfAbsent_Succ) -> Get (true) */
+ anno_hb_init hbConditionInit0;
+ hbConditionInit0.interface_num_before = 1;
+ hbConditionInit0.hb_condition_num_before = 1;
+ hbConditionInit0.interface_num_after = 2;
+ hbConditionInit0.hb_condition_num_after = 0;
+ spec_annotation hb_init0;
+ hb_init0.type = HB_INIT;
+ hb_init0.annotation = &hbConditionInit0;
+ cdsannotate(SPEC_ANALYSIS, &hb_init0);
+
}
/* All other user-defined functions */
#include <threads.h>
#include <cdsannotate.h>
#include <specannotation.h>
+#include <spec_tag.h>
+#include <spec_private_hashtable.h>
TypeReturn interfaceName(ARGType1 arg1, ARGType2 arg2)
{
thrd_t tid = thrd_current();
- uint64_t call_sequence_num = current(&__interface_call_sequence);
- put(&__interface_call_sequence, tid, call_sequence_num);
+ uint64_t call_sequence_num = current(&__sequential.global_call_sequence);
+ next(&__sequential.global_call_sequence);
+ put(&__sequential.interface_call_sequence, tid, call_sequence_num);
// Interface begins
anno_interface_boundary interface_boundary;
cdsannotate(SPEC_ANALYSIS, &annoation_interface_begin);
TypeReturn __RET__ = __wrapper_interfaceName(arg1, arg2);
- int __COND__ = get(&__sequential.cond, tid);
+ int __COND__ = get(&__sequential.condition, tid);
uint64_t __ID__ = get(&__sequential.id, tid);
/* Post_check action, define macros for all DefineVars */
#define _Old_Val (get(&__sequential.put__Old_Val, tid))
// And more...
bool post_check_passed = INTERFACE_POST_CHECK_CONDITION;
- #undef _Old_Val
- // And more...
anno_post_check post_check;
post_check.check_passed = post_check_passed;
// Post Action (if any)
POST_ACTION_CODE // Unfolded in place
+ #undef _Old_Val
+ // And more...
// HB conditions (if any)
if (HB_CONDITION1) {
anno_hb_condition hb_condition1;
hb_condition1.interface_num = 0; // Interface number
hb_condition1.hb_condition_num = 1; // HB condition number
- hb_condition1.id = id;
+ hb_condition1.id = __ID__;
hb_condition1.call_sequence_num = call_sequence_num;
spec_annotation annotation_hb_condition;
annotation_hb_condition.type = HB_CONDITION;
#include <spec_private_hashtable.h>
#include <_sepc_sequential_genenrated.h>
-thrd_t __tid = thrd_current();
+thrd_t tid = thrd_current();
uint64_t __ATOMIC_RET__ = get_prev_value(tid);
if (POTENTIAL_CP_DEFINE_CONDITION) {
uint64_t call_sequence_num = get(&__sequential.interface_call_sequence, tid);
- int interface_num = get(&__sequential.interface, tid);
+
anno_potential_cp_define potential_cp_define;
- potential_cp_define.interface_num = interface_num;
+ potential_cp_define.interface_num = get(&__sequential.interface, tid);
potential_cp_define.label_num = 1; // Commit point label number
potential_cp_define.call_sequence_num = call_sequence_num;
spec_annotation annotation_potential_cp_define;