diff options
| author | songyanchao <[email protected]> | 2023-10-25 08:39:13 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2023-10-25 08:39:13 +0000 |
| commit | e04111652bc3397f2eaccdc5c37e1c15e986d529 (patch) | |
| tree | 9b3e868395b9148f97a851f3525715899d5d9ad9 /app/src | |
| parent | 4e4613c9b3a2b643f0af6f0c37870d29b228e839 (diff) | |
🎈 perf(DPISDN-23): Optimize Storage of SID Data using Circular Queue and Add Associated Functions
Optimize Storage of SID Data using Circular Queue and Add Associated Functions
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/mrb.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/app/src/mrb.c b/app/src/mrb.c index 23d8013..330e516 100644 --- a/app/src/mrb.c +++ b/app/src/mrb.c @@ -1,5 +1,3 @@ - - #include <assert.h> #include <marsio.h> #include <mrapp.h> @@ -860,10 +858,15 @@ int marsio_buff_get_sid_list(marsio_buff_t * m, sid_t * out_slist, uint8_t sz_ou struct mrb_metadata * mrb_metadata = (struct mrb_metadata *)mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); uint8_t out_i = 0; - for (uint8_t i = mrb_metadata->start_sid; - i < mrb_metadata->start_sid + mrb_metadata->nr_sid && out_i < sz_out_slist; i++, out_i++) + uint8_t sid_tail = mrb_metadata->sid_tail; + for (uint8_t i = 0; i < (RTE_DIM(mrb_metadata->sids) - mrb_metadata->sid_capacity) && out_i < sz_out_slist; + i++, out_i++) { - out_slist[out_i] = mrb_metadata->sids[i]; + out_slist[out_i] = mrb_metadata->sids[sid_tail]; + if (++sid_tail >= RTE_DIM(mrb_metadata->sids)) + { + sid_tail = 0; + } } return out_i; @@ -885,8 +888,9 @@ int marsio_buff_set_sid_list(marsio_buff_t * m, sid_t * slist, uint8_t sz_slist) mrb_metadata->sids[i] = slist[i]; } - mrb_metadata->start_sid = 0; - mrb_metadata->nr_sid = sz_slist; + mrb_metadata->sid_tail = 0; + mrb_metadata->sid_head = sz_slist; + mrb_metadata->sid_capacity = RTE_DIM(mrb_metadata->sids) - sz_slist; return 0; } @@ -896,17 +900,23 @@ int marsio_buff_append_sid_list(marsio_buff_t * m, sid_t * slist, uint8_t sz_sli struct mrb_metadata * mrb_metadata = (struct mrb_metadata *)mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); assert(sz_slist <= RTE_DIM(mrb_metadata->sids)); - if (mrb_metadata->nr_sid + sz_slist > RTE_DIM(mrb_metadata->sids)) + if (unlikely(sz_slist > mrb_metadata->sid_capacity)) { return -ENOMEM; } - for (uint8_t i = 0; i < sz_slist; i++) + for (uint32_t index = 0; index < sz_slist; index++) { - mrb_metadata->sids[mrb_metadata->nr_sid + i] = slist[i]; + mrb_metadata->sids[mrb_metadata->sid_head] = slist[index]; + mrb_metadata->sid_head++; + + if (unlikely(mrb_metadata->sid_head == RTE_DIM(mrb_metadata->sids))) + { + mrb_metadata->sid_head = 0; + } } - mrb_metadata->nr_sid += sz_slist; + mrb_metadata->sid_capacity -= sz_slist; return 0; } @@ -916,16 +926,26 @@ int marsio_buff_prepend_sid_list(marsio_buff_t * m, sid_t * slist, uint8_t sz_sl struct mrb_metadata * mrb_metadata = (struct mrb_metadata *)mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); assert(sz_slist <= RTE_DIM(mrb_metadata->sids)); - if (mrb_metadata->nr_sid + sz_slist > RTE_DIM(mrb_metadata->sids)) + if (unlikely(sz_slist > mrb_metadata->sid_capacity)) { return -ENOMEM; } - memmove(mrb_metadata->sids + sz_slist, mrb_metadata->sids + mrb_metadata->start_sid, - sizeof(uint16_t) * mrb_metadata->nr_sid); - memcpy(mrb_metadata->sids, slist, sizeof(uint16_t) * sz_slist); - mrb_metadata->start_sid = 0; - mrb_metadata->nr_sid += sz_slist; + for (uint32_t index = 0; index < sz_slist; index++) + { + if (likely(mrb_metadata->sid_tail != 0)) + { + mrb_metadata->sid_tail--; + } + else + { + mrb_metadata->sid_tail = RTE_DIM(mrb_metadata->sids) - 1; + } + mrb_metadata->sids[mrb_metadata->sid_tail] = slist[sz_slist - index - 1]; + } + + mrb_metadata->sid_capacity -= sz_slist; + return 0; } |
