# correctness. The key thing is to identify all the commit point.
@Begin
+ @Options:
+ LANG = C;
+ CLASS = cliffc_hashtable;
@Global_define:
@DeclareVar:
spec_hashtable<TypeK, TypeV*> map;
id_map = spec_hashtable<TypeK, TypeV*>();
tag = Tag();
@DefineFunc:
- static bool equals_val(TypeV *ptr1, TypeV *ptr2) {
+ bool equals_val(TypeV *ptr1, TypeV *ptr2) {
// ...
}
+ @DefineFunc:
# Update the tag for the current key slot if the corresponding tag
# is NULL, otherwise just return that tag. It will update the next
# available tag too if it requires a new tag for that key slot.
- static Tag getKeyTag(TypeK &key) {
+ Tag getKeyTag(TypeK &key) {
if (id_map.get(key) == NULL) {
Tag cur_tag = tag.current();
id_map.put(key, cur_tag);
@Commit_point_set: Read_Val_Point1 | Read_Val_Point2 | Read_Val_Point3
@ID: __sequential.getKeyTag(key)
@Action:
- @DefineVar: TypeV *_Old_Val = __sequential.map.get(key)
+ TypeV *_Old_Val = __sequential.map.get(key)
@Post_check:
__sequential.equals_val(_Old_Val, __RET__)
@End
@ID: __sequential.getKeyTag(key)
@Action:
# Remember this old value at checking point
- @DefineVar: TypeV *_Old_Val = __sequential.map.get(key)
- @Code: __sequential.map.put(key, &val);
+ TypeV *_Old_Val = __sequential.map.get(key)
+ __sequential.map.put(key, &val);
@Post_check:
__sequential.equals_val(__RET__, _Old_Val)
@End
COND_PutIfAbsentSucc :: __RET__ == NULL
@ID: __sequential.getKeyTag(key)
@Action:
- @DefineVar: TypeV *_Old_Val = __sequential.map.get(key)
- @Code:
- if (__COND_SAY__)
+ TypeV *_Old_Val = __sequential.map.get(key)
+ if (__COND_SAT__)
__sequential.map.put(key, &value);
@Post_check:
- __COND_SAY__ ? __RET__ == NULL : __sequential.equals_val(_Old_Val, __RET__)
+ __COND_SAT__ ? __RET__ == NULL : __sequential.equals_val(_Old_Val, __RET__)
@End
*/
shared_ptr<TypeV> putIfAbsent(TypeK& key, TypeV& value) {
@Commit_point_set: Write_Val_Point
@ID: __sequential.getKeyTag(key)
@Action:
- @DefineVar: TypeV *_Old_Val = __sequential.map.get(key)
- @Code: __sequential.map.put(key, NULL);
+ TypeV *_Old_Val = __sequential.map.get(key)
+ __sequential.map.put(key, NULL);
@Post_check:
__sequential.equals_val(__RET__, _Old_Val)
@End
COND_RemoveIfMatchSucc :: __RET__ == true
@ID: __sequential.getKeyTag(key)
@Action:
- @Code:
- if (__COND_SAY__)
+ if (__COND_SAT__)
__sequential.map.put(key, NULL);
@Post_check:
- __COND_SAY__ ? __RET__ : !__RET__
+ __COND_SAT__ ? __RET__ : !__RET__
@End
*/
bool remove(TypeK& key, TypeV& val) {
Write_Val_Point
@ID: __sequential.getKeyTag(key)
@Action:
- @DefineVar: TypeV *_Old_Val = __sequential.map.get(key)
+ TypeV *_Old_Val = __sequential.map.get(key)
@Post_check:
__sequential.equals_val(__RET__, _Old_Val)
@End
COND_ReplaceIfMatchSucc :: __RET__ == true
@ID: __sequential.getKeyTag(key)
@Action:
- @Code:
- if (__COND_SAY__)
+ if (__COND_SAT__)
__sequential.map.put(key, &newval);
@Post_check:
- __COND_SAY__ ? __RET__ : !__RET__
+ __COND_SAT__ ? __RET__ : !__RET__
@End
*/
bool replace(TypeK& key, TypeV& oldval, TypeV& newval) {