kirr has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/40086?usp=email )
Change subject: trx_toolkit/burst_fwd: Reuse RxMsg object ......................................................................
trx_toolkit/burst_fwd: Reuse RxMsg object
To forward each received TxMsg BurstForwarder currently creates RxMsg via TxMsg.trans(), then sends created RxMsg to destination trx.
Creating RxMsg and convertion TxMsg .burst to RxMsg .burst all show in the profile.
-> Optimize the first part of this story: create RxMsg only once and reuse it, by resetting, each time we need to forward a message. This is safe to do as that RxMsg is created by BurstForwarder internally and is not exposed to any upper layer at all. In other words it has strictly controlled lifetime limited by the forwarding activity.
Change-Id: Ie0690da0f901f4f19a7e4cf048bdc244a24235b0 --- M src/target/trx_toolkit/burst_fwd.pxd M src/target/trx_toolkit/burst_fwd.pyx M src/target/trx_toolkit/data_msg.pxd M src/target/trx_toolkit/data_msg.pyx 4 files changed, 24 insertions(+), 5 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/86/40086/1
diff --git a/src/target/trx_toolkit/burst_fwd.pxd b/src/target/trx_toolkit/burst_fwd.pxd index 486faa1..87ae95d 100644 --- a/src/target/trx_toolkit/burst_fwd.pxd +++ b/src/target/trx_toolkit/burst_fwd.pxd @@ -1,9 +1,10 @@ # cython: language_level=3
-from data_msg cimport TxMsg +from data_msg cimport TxMsg, RxMsg from transceiver cimport Transceiver
cdef class BurstForwarder: cdef list[Transceiver] trx_list + cdef RxMsg tx_msg # reused RxMsg to avoid object allocation at every forward_msg
cdef forward_msg(self, Transceiver src_trx, TxMsg rx_msg) diff --git a/src/target/trx_toolkit/burst_fwd.pyx b/src/target/trx_toolkit/burst_fwd.pyx index d13f784..db910ad 100644 --- a/src/target/trx_toolkit/burst_fwd.pyx +++ b/src/target/trx_toolkit/burst_fwd.pyx @@ -42,6 +42,7 @@
def __cinit__(self, list trx_list): self.trx_list = trx_list + self.tx_msg = RxMsg()
cdef forward_msg(self, Transceiver src_trx, TxMsg rx_msg): # Originating Transceiver may use frequency hopping, @@ -66,5 +67,13 @@ continue
# Transform from TxMsg to RxMsg and forward - tx_msg = rx_msg.trans(ver = trx.data_if._hdr_ver) + tx_msg = self.tx_msg # reuse tx_msg object instead of allocating it each time + tx_msg._reset() + tx_msg.fn = rx_msg.fn + tx_msg.tn = rx_msg.tn + tx_msg.ver = trx.data_if._hdr_ver + if rx_msg.burst is not None: + tx_msg.burst = RxMsg._ubit2sbit(rx_msg.burst) + tx_msg.nope_ind = (rx_msg.burst is None) + trx.handle_data_msg(src_trx, rx_msg, tx_msg) diff --git a/src/target/trx_toolkit/data_msg.pxd b/src/target/trx_toolkit/data_msg.pxd index 2eb6ed3..2ddd248 100644 --- a/src/target/trx_toolkit/data_msg.pxd +++ b/src/target/trx_toolkit/data_msg.pxd @@ -31,6 +31,7 @@ cdef int CHDR_LEN() noexcept cdef int HDR_LEN(self) except -1
+ cdef _reset(self) cdef append_hdr_to(self, bytearray buf) cdef append_burst_to(self, bytearray buf) cdef parse_hdr(self, bytearray msg) diff --git a/src/target/trx_toolkit/data_msg.pyx b/src/target/trx_toolkit/data_msg.pyx index 304dbdb..07b3d38 100644 --- a/src/target/trx_toolkit/data_msg.pyx +++ b/src/target/trx_toolkit/data_msg.pyx @@ -87,10 +87,15 @@ CHDR_VERSION_MAX = 0b1111 KNOWN_VERSIONS = tuple(range(KNOWN_VERSION_MAX+1))
- def __cinit__(self, int64_t fn = -1, int64_t tn = -1, int ver = 0): + def __init__(self, int64_t fn = -1, int64_t tn = -1, int ver = 0): + self._reset() self.ver = ver self.fn = fn self.tn = tn + cdef _reset(self): + self.ver = 0 + self.fn = -1 + self.tn = -1 self.nope_ind = False
@staticmethod @@ -323,7 +328,8 @@ cdef class TxMsg(Msg): ''' Tx (L1 -> TRX) message coding API. '''
- def __cinit__(self): + cdef _reset(self): + Msg._reset(self) self.burst = None self.pwr = -1
@@ -479,7 +485,9 @@ cdef class RxMsg(Msg): ''' Rx (TRX -> L1) message coding API. '''
- def __cinit__(self): + cdef _reset(self): + Msg._reset(self) + self.burst = None self.rssi = RSSI_UNSET self.toa256 = TOA256_UNSET