summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-10-25 08:39:13 +0000
committersongyanchao <[email protected]>2023-10-25 08:39:13 +0000
commite04111652bc3397f2eaccdc5c37e1c15e986d529 (patch)
tree9b3e868395b9148f97a851f3525715899d5d9ad9 /app/src
parent4e4613c9b3a2b643f0af6f0c37870d29b228e839 (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.c54
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;
}