]> rtime.felk.cvut.cz Git - ulut.git/blobdiff - ulut/ul_dqfifo.h
uLUt: add methods to use data queue FIFO for random data in kept history range access.
[ulut.git] / ulut / ul_dqfifo.h
index bcc92c4582aae2e4cb7c13d8394eee96dc01e6d1..98ac068e03ee3094976d3c5f223b9f5b723dd30e 100644 (file)
@@ -40,20 +40,20 @@ typedef struct ul_dqfifo_base_t {
 
 
 static inline unsigned int
-ul_dqfifo_base_loc2idx(ul_dqfifo_base_t *dqf, ul_dqfifo_loc_t loc)
+ul_dqfifo_base_loc2idx(const ul_dqfifo_base_t *dqf, ul_dqfifo_loc_t loc)
 {
   return loc & dqf->locmask;
 }
 
 static inline unsigned int
-ul_dqfifo_base_is_full(ul_dqfifo_base_t *dqf)
+ul_dqfifo_base_is_full(const ul_dqfifo_base_t *dqf)
 {
   ul_dqfifo_loc_t locx = dqf->locin ^ dqf->locout;
   return (locx && !(locx & dqf->locmask));
 }
 
 static inline unsigned int
-ul_dqfifo_base_is_empty(ul_dqfifo_base_t *dqf)
+ul_dqfifo_base_is_empty(const ul_dqfifo_base_t *dqf)
 {
   return (dqf->locin == dqf->locout);
 }
@@ -66,24 +66,37 @@ typedef struct cust_prefix##_t { \
 } cust_prefix##_t; \
 \
 cust_static_inline unsigned int \
-cust_prefix##_loc2idx(cust_prefix##_t *cdqf, ul_dqfifo_loc_t loc) \
+cust_prefix##_loc2idx(const cust_prefix##_t *cdqf, ul_dqfifo_loc_t loc) \
 { \
   return ul_dqfifo_base_loc2idx(&cdqf->dqf, loc); \
 } \
 \
 cust_static_inline unsigned int \
-cust_prefix##_is_full(cust_prefix##_t *cdqf) \
+cust_prefix##_is_full(const cust_prefix##_t *cdqf) \
 { \
   return ul_dqfifo_base_is_full(&cdqf->dqf); \
 } \
 \
 cust_static_inline unsigned int \
-cust_prefix##_is_empty(cust_prefix##_t *cdqf) \
+cust_prefix##_is_empty(const cust_prefix##_t *cdqf) \
 { \
   return ul_dqfifo_base_is_empty(&cdqf->dqf); \
 } \
 \
 cust_static_inline int \
+cust_prefix##_put_no_check(cust_prefix##_t *cdqf, const cust_data_t *data) \
+{ \
+  ul_dqfifo_loc_t locin; \
+  cust_barrier; \
+  locin = cdqf->dqf.locin; \
+  cdqf->buff[cust_prefix##_loc2idx(cdqf, locin)] = *data; \
+  cust_barrier; \
+  cdqf->dqf.locin = ++locin; \
+  cust_barrier; \
+  return 1; \
+} \
+\
+cust_static_inline int \
 cust_prefix##_put(cust_prefix##_t *cdqf, const cust_data_t *data) \
 { \
   ul_dqfifo_loc_t locin; \
@@ -136,7 +149,7 @@ cust_prefix##_flush(cust_prefix##_t *cdqf) \
 } \
 \
 cust_static_inline ul_dqfifo_loc_t \
-cust_prefix##_count(cust_prefix##_t *cdqf) \
+cust_prefix##_count(const cust_prefix##_t *cdqf) \
 { ul_dqfifo_loc_t loccount; \
   cust_barrier; \
   loccount = cdqf->dqf.locin - cdqf->dqf.locout; \
@@ -145,7 +158,7 @@ cust_prefix##_count(cust_prefix##_t *cdqf) \
 } \
 \
 cust_static_inline ul_dqfifo_loc_t \
-cust_prefix##_get_locin(cust_prefix##_t *cdqf) \
+cust_prefix##_get_locin(const cust_prefix##_t *cdqf) \
 { \
   ul_dqfifo_loc_t loc; \
   cust_barrier; \
@@ -155,7 +168,7 @@ cust_prefix##_get_locin(cust_prefix##_t *cdqf) \
 } \
 \
 cust_static_inline ul_dqfifo_loc_t \
-cust_prefix##_get_locout(cust_prefix##_t *cdqf) \
+cust_prefix##_get_locout(const cust_prefix##_t *cdqf) \
 { \
   ul_dqfifo_loc_t loc; \
   cust_barrier; \
@@ -165,6 +178,31 @@ cust_prefix##_get_locout(cust_prefix##_t *cdqf) \
 } \
 \
 cust_static_inline void \
+cust_prefix##_at_loc_no_check(const cust_prefix##_t *cdqf, cust_data_t *data, \
+                       ul_dqfifo_loc_t loc) \
+{ \
+  *data = cdqf->buff[cust_prefix##_loc2idx(cdqf, loc)]; \
+} \
+\
+cust_static_inline int \
+cust_prefix##_at_loc(const cust_prefix##_t *cdqf, cust_data_t *data, \
+                       ul_dqfifo_loc_t loc) \
+{ \
+  ul_dqfifo_loc_t locin = cdqf->dqf.locin; \
+  ul_dqfifo_loc_t locdiff; \
+  cust_barrier; \
+  cust_prefix##_at_loc_no_check(cdqf, data, loc); \
+  cust_barrier; \
+  locdiff = locin - loc; \
+  if (locdiff > cdqf->dqf.locmask + 1) \
+    return 0; \
+  locdiff = cdqf->dqf.locin - loc; \
+  if (locdiff > cdqf->dqf.locmask + 1) \
+    return 0; \
+  return 1; \
+} \
+\
+cust_static_inline void \
 cust_prefix##_init(cust_prefix##_t *cdqf, cust_data_t *databuff, \
                        ul_dqfifo_loc_t locmask) \
 { \