X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=ricxappframe%2Frmr%2Frmrclib%2Frmrclib.py;h=c26ffe1bec94ad720165e6a1aea37c6e84df83a6;hb=refs%2Ftags%2F3.2.2;hp=6150e237026cbbb7adf3c813fd6e633e0ddba0cf;hpb=ab881ae80afeee1ce99802dd6a50530ad7378268;p=ric-plt%2Fxapp-frame-py.git diff --git a/ricxappframe/rmr/rmrclib/rmrclib.py b/ricxappframe/rmr/rmrclib/rmrclib.py index 6150e23..c26ffe1 100644 --- a/ricxappframe/rmr/rmrclib/rmrclib.py +++ b/ricxappframe/rmr/rmrclib/rmrclib.py @@ -16,6 +16,7 @@ # ================================================================================== import ctypes import json +from contextlib import contextmanager # Subpackage that creates and publishes a reference to the C shared library. # Intended to be private; RMR-python and xapp-frame-py users should not need this. @@ -34,6 +35,15 @@ _rmr_free_consts.argtypes = [ctypes.POINTER(ctypes.c_char)] _rmr_free_consts.restype = None +@contextmanager +def _rmr_get_consts_decorator(): + ptr = _rmr_get_consts() + try: + yield ptr + finally: + _rmr_free_consts(ptr) + + def get_constants(cache={}): """ Gets constants published by RMR and caches for subsequent calls. @@ -42,10 +52,11 @@ def get_constants(cache={}): if cache: return cache - ptr = _rmr_get_consts() # read char pointer - js = ctypes.cast(ptr, ctypes.c_char_p).value # cast to json string - cache = json.loads(str(js.decode())) # create constants value object as a hash - _rmr_free_consts(ptr) + # read pointer to json data + with _rmr_get_consts_decorator() as ptr: + js = ctypes.cast(ptr, ctypes.c_char_p).value # cast it to python string + cache = json.loads(str(js.decode())) # create constants value object as a hash + return cache @@ -86,9 +97,13 @@ def get_mapping_dict(cache={}): def state_to_status(stateno): """ - Converts a msg state integer to a status string. + Converts a msg state integer to a status string and caches for subsequent calls. Returns "UNKNOWN STATE" if the int value is not known. """ - sdict = get_mapping_dict() - return sdict.get(stateno, "UNKNOWN STATE") + try: + return state_to_status.sdict.get(stateno, "UNKNOWN STATE") + except AttributeError: # sdict does not exist on first call + state_to_status.sdict = get_mapping_dict() + + return state_to_status.sdict.get(stateno, "UNKNOWN STATE")