[RFC,v1,12/15] dts: merge DTS framework/serializer.py to DPDK

Message ID 20220406145606.2913834-13-juraj.linkes@pantheon.tech (mailing list archive)
State RFC, archived
Delegated to: Thomas Monjalon
Headers
Series merge DTS core files to DPDK |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Juraj Linkeš April 6, 2022, 2:56 p.m. UTC
  ---
 dts/framework/serializer.py | 115 ++++++++++++++++++++++++++++++++++++
 1 file changed, 115 insertions(+)
 create mode 100644 dts/framework/serializer.py
  

Patch

diff --git a/dts/framework/serializer.py b/dts/framework/serializer.py
new file mode 100644
index 0000000000..0ffa16a592
--- /dev/null
+++ b/dts/framework/serializer.py
@@ -0,0 +1,115 @@ 
+# BSD LICENSE
+#
+# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""
+Wrapper class for serializer module
+"""
+import os
+import pickle
+
+
+class Singleton(type):
+    _instances = {}
+
+    def __call__(self, *args, **kwargs):
+        if self not in self._instances:
+            self._instances[self] = super(Singleton, self).__call__(*args, **kwargs)
+        return self._instances[self]
+
+
+class Serializer(object):
+
+    """
+    Two-levels cache implementation for storing/retrieving any kind of object
+    using using a key-value model. It uses the pickle module to store objects
+    into a file.
+    This class implements the Singleton pattern. Everytime its constructor
+    is called it will return a reference to the same instance.
+    """
+
+    def __init__(self):
+        self.volatile_cache = {}
+        self.filename = "serializer.cache"
+
+    def save(self, object_name, object_to_save):
+        """
+        Saves an object into the volatile dictionary cache - which
+        resides in memory.
+        """
+        self.volatile_cache[object_name] = object_to_save
+
+    def load(self, object_name):
+        """
+        Loads and returns an object from the volatile cache.
+        """
+        return self.volatile_cache.get(object_name, None)
+
+    def set_serialized_filename(self, filename):
+        """
+        Sets the name of the non-volatile cache file to be used in the future
+        """
+        self.filename = filename
+
+    def save_to_file(self):
+        """
+        Saves the volatile cache to a file (non-volatile) using the pickle
+        module. Returns True in case everything went OK, False otherwise.
+        """
+        try:
+            serialized_file = open(self.filename, "w")
+            pickle.dump(self.volatile_cache, serialized_file)
+            serialized_file.close()
+            return True
+        except:
+            return False
+
+    def load_from_file(self):
+        """
+        Reads from a pickle-like file using pickle module and populates the
+        volatile cache. Returns True in case everything went OK, False
+        otherwise.
+        """
+        try:
+            serialized_file = open(self.filename, "r")
+            self.volatile_cache = pickle.load(serialized_file)
+            serialized_file.close()
+            return True
+        except:
+            self.volatile_cache.clear()
+            return False
+
+    def discard_cache(self):
+        """
+        Discards both volatile and non-volatile cache.
+        """
+        self.volatile_cache.clear()
+        if os.path.exists(self.filename):
+            os.remove(self.filename)