+
+/**
+ @Begin
+ @Options:
+ LANG = C;
+ @Global_define:
+ @DeclareStruct:
+ typedef struct tag_elem {
+ call_id_t id;
+ unsigned int data;
+ } tag_elem_t;
+
+ @DeclareVar:
+ spec_list *__queue;
+ id_tag_t *tag;
+ @InitVar:
+ __queue = new_spec_list();
+ tag = new_id_tag(); // Beginning of available id
+ @DefineFunc:
+ tag_elem_t* new_tag_elem(call_id_t id, unsigned int data) {
+ tag_elem_t *e = (tag_elem_t*) CMODEL_MALLOC(sizeof(tag_elem_t));
+ e->id = id;
+ e->data = data;
+ return e;
+ }
+ @DefineFunc:
+ void free_tag_elem(tag_elem_t *e) {
+ free(e);
+ }
+ @DefineFunc:
+ call_id_t get_id(void *wrapper) {
+ if (wrapper == NULL)
+ return 0;
+ return ((tag_elem_t*) wrapper)->id;
+ }
+ @DefineFunc:
+ unsigned int get_data(void *wrapper) {
+ return ((tag_elem_t*) wrapper)->data;
+ }
+ @Happens_before:
+ # Only check the happens-before relationship according to the id of the
+ # commit_point_set. For commit_point_set that has same ID, A -> B means
+ # B happens after the previous A.
+ Enqueue -> Dequeue
+ @End
+*/
+
+
+
+/**
+ @Begin
+ @Interface: Enqueue
+ @Commit_point_set: Enqueue_Read_Tail | Enqueue_UpdateNext
+ @ID: get_and_inc(tag)
+ @Action:
+ # __ID__ is an internal macro that refers to the id of the current
+ # interface call
+ tag_elem_t *elem = new_tag_elem(__ID__, val);
+ push_back(__queue, elem);
+ //model_print("Enqueue: input=%d\n", val);
+ @End
+*/