7 #include <cdsannotate.h>
8 #include <specannotation.h>
9 #include <model_memory.h>
16 template <typename t_element, size_t t_size>
17 struct mpmc_boundq_1_alt
21 // elements should generally be cache-line-size padded :
22 t_element m_array[t_size];
24 // rdwr counts the reads & writes that have started
25 atomic<unsigned int> m_rdwr;
26 // "read" and "written" count the number completed
27 atomic<unsigned int> m_read;
28 atomic<unsigned int> m_written;
49 CLASS = mpmc_boundq_1_alt;
52 //typedef struct elem {
56 // thread_id_t fetch_tid;
63 // list = new_spec_list();
74 //-----------------------------------------------------
79 @Commit_point_set: Fetch_RW_Load_Empty | Fetch_RW_RMW | Fetch_W_Load
80 @ID: (call_id_t) __RET__
82 //__RET__ == NULL || has_elem(list, __RET__)
85 t_element * read_fetch() {
86 // Try this new weaker semantics
87 unsigned int rdwr = m_rdwr.load(mo_acquire);
88 //unsigned int rdwr = m_rdwr.load(mo_relaxed);
91 @Potential_commit_point_define: true
92 @Label: Fetch_Potential_RW_Load
97 rd = (rdwr>>16) & 0xFFFF;
100 if ( wr == rd ) { // empty
104 @Commit_point_define: true
105 @Potential_commit_point_label: Fetch_Potential_RW_Load
106 @Label: Fetch_RW_Load_Empty
113 bool succ = m_rdwr.compare_exchange_weak(rdwr,rdwr+(1<<16),mo_acq_rel);
116 @Commit_point_define_check: succ
129 int written = m_written.load(mo_acquire);
132 @Potential_commit_point_define: true
133 @Label: Fetch_Potential_W_Load
136 if ((written & 0xFFFF) != wr) {
145 @Commit_point_define: true
146 @Potential_commit_point_label: Fetch_Potential_W_Load
151 t_element * p = & ( m_array[ rd % t_size ] );
159 @Commit_point_set: Consume_R_RMW
162 // consume_check(__TID__)
167 void read_consume(t_element *bin) {
168 /**** FIXME: miss ****/
169 m_read.fetch_add(1,mo_release);
172 @Commit_point_define_check: true
173 @Label: Consume_R_RMW
178 //-----------------------------------------------------
183 @Commit_point_set: Prepare_RW_Load_Full | Prepare_RW_RMW | Prepare_R_Load
184 @ID: (call_id_t) __RET__
186 //prepare_check(__RET__, __TID__)
188 //push_back(list, __RET__);
191 t_element * write_prepare() {
192 // Try weaker semantics
193 unsigned int rdwr = m_rdwr.load(mo_acquire);
194 //unsigned int rdwr = m_rdwr.load(mo_relaxed);
197 @Potential_commit_point_define: true
198 @Label: Prepare_Potential_RW_Load
203 rd = (rdwr>>16) & 0xFFFF;
206 if ( wr == ((rd + t_size)&0xFFFF) ) { // full
210 @Commit_point_define: true
211 @Potential_commit_point_label: Prepare_Potential_RW_Load
212 @Label: Prepare_RW_Load_Full
218 bool succ = m_rdwr.compare_exchange_weak(rdwr,(rd<<16) |
219 ((wr+1)&0xFFFF),mo_acq_rel);
222 @Commit_point_define_check: succ
223 @Label: Prepare_RW_RMW
235 int read = m_read.load(mo_acquire);
238 @Potential_commit_point_define: true
239 @Label: Prepare_Potential_R_Load
242 if ((read & 0xFFFF) != rd)
250 @Commit_point_define: true
251 @Potential_commit_point_label: Prepare_Potential_R_Load
252 @Label: Prepare_R_Load
256 t_element * p = & ( m_array[ wr % t_size ] );
264 @Commit_point_set: Publish_W_RMW
267 //publish_check(__TID__)
272 void write_publish(t_element *bin)
274 /**** hb violation ****/
275 m_written.fetch_add(1,mo_release);
278 @Commit_point_define_check: true
279 @Label: Publish_W_RMW
284 //-----------------------------------------------------