From d2c31cb8a475817da9ce79380017761ca18cd0da Mon Sep 17 00:00:00 2001 From: Yury Kavaliou Date: Wed, 17 Feb 2016 23:58:24 +0300 Subject: [PATCH 1/2] Added file handle cache --- ev3/ev3dev.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ev3/ev3dev.py b/ev3/ev3dev.py index 5d36577..37f9f7d 100755 --- a/ev3/ev3dev.py +++ b/ev3/ev3dev.py @@ -180,28 +180,33 @@ def get_battery_percentage(): class Ev3Dev(object): - def __init__(self): self.sys_path = "" + self.fd_cache = {} - def read_value(self, name): - attr_file = os.path.join(self.sys_path, name) - if os.path.isfile(attr_file): - with open(attr_file) as f: - value = f.read().strip() - return value - else: - return None + def __del__(self): + for _, fd in self.fd_cache.iteritems(): + fd.close() - def write_value(self, name, value, flush = False): + def file_desc(self, name): attr_file = os.path.join(self.sys_path, name) - if os.path.isfile(attr_file): - with open(attr_file, 'w') as f: - f.write(str(value)) - if flush: - f.flush() - else: - return + try: + fd = self.fd_cache[attr_file] + fd.seek(0) + except KeyError as m: + fd = open(attr_file, "r+") + self.fd_cache[attr_file] = fd + + return fd + + def read_value(self, name): + return self.file_desc(name).read().strip() + + def write_value(self, name, value, flush=False): + fd = self.file_desc(name) + fd.write(str(value)) + if flush: + fd.flush() @create_ev3_property( From 226538a7b080df0c3ff17e4885a9549faabf5f02 Mon Sep 17 00:00:00 2001 From: Yury Kavaliou Date: Wed, 17 Feb 2016 23:58:24 +0300 Subject: [PATCH 2/2] Added file handle cache --- ev3/ev3dev.py | 53 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/ev3/ev3dev.py b/ev3/ev3dev.py index 5d36577..6a16186 100755 --- a/ev3/ev3dev.py +++ b/ev3/ev3dev.py @@ -4,6 +4,7 @@ import logging import re import atexit +from stat import S_IRGRP, S_IWGRP logger = logging.getLogger(__name__) @@ -180,28 +181,48 @@ def get_battery_percentage(): class Ev3Dev(object): - def __init__(self): self.sys_path = "" + self.fd_cache = {} - def read_value(self, name): - attr_file = os.path.join(self.sys_path, name) - if os.path.isfile(attr_file): - with open(attr_file) as f: - value = f.read().strip() - return value - else: - return None + def __del__(self): + for fd in self.fd_cache.values(): + fd.close() - def write_value(self, name, value, flush = False): + def file_descriptor(self, name): attr_file = os.path.join(self.sys_path, name) - if os.path.isfile(attr_file): - with open(attr_file, 'w') as f: - f.write(str(value)) - if flush: - f.flush() + try: + fd = self.fd_cache[attr_file] + fd.seek(0) + except KeyError as m: + fd = open(attr_file, self.get_mode(attr_file)) + self.fd_cache[attr_file] = fd + + return fd + + @staticmethod + def get_mode(name): + mode = os.stat(name).st_mode + read = mode & S_IRGRP + write = mode & S_IWGRP + + if read and write: + open_mode = "r+" + elif write: + open_mode = "w" else: - return + open_mode = "r" + + return open_mode + + def read_value(self, name): + return self.file_descriptor(name).read().strip() + + def write_value(self, name, value, flush=False): + fd = self.file_descriptor(name) + fd.write(value) + if flush: + fd.flush() @create_ev3_property(