# FILE: autoload/conque_term/conque_sole_shared_memory.py {{{ # AUTHOR: Nico Raffo # WEBSITE: http://conque.googlecode.com # MODIFIED: 2010-11-15 # VERSION: 2.0, for Vim 7.0 # LICENSE: # Conque - Vim terminal/console emulator # Copyright (C) 2009-2010 Nico Raffo # # MIT License # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. }}} """Wrapper class for shared memory between Windows python processes""" import mmap import sys if sys.version_info[0] == 2: CONQUE_PYTHON_VERSION = 2 else: CONQUE_PYTHON_VERSION = 3 if CONQUE_PYTHON_VERSION == 2: import cPickle as pickle else: import pickle class ConqueSoleSharedMemory(): # **************************************************************************** # class properties # {{{ # is the data being stored not fixed length fixed_length = False # fill memory with this character when clearing and fixed_length is true fill_char = ' ' # serialize and unserialize data automatically serialize = False # size of shared memory, in bytes / chars mem_size = None # size of shared memory, in bytes / chars mem_type = None # unique key, so multiple console instances are possible mem_key = None # mmap instance shm = None # character encoding, dammit encoding = 'ascii' # pickle terminator TERMINATOR = None # }}} # **************************************************************************** # constructor I guess def __init__(self, mem_size, mem_type, mem_key, fixed_length=False, fill_char=' ', serialize=False, encoding='ascii'): # {{{ self.mem_size = mem_size self.mem_type = mem_type self.mem_key = mem_key self.fixed_length = fixed_length self.fill_char = fill_char self.serialize = serialize self.encoding = encoding self.TERMINATOR = str(chr(0)).encode(self.encoding) # }}} # **************************************************************************** # create memory block def create(self, access='write'): # {{{ if access == 'write': mmap_access = mmap.ACCESS_WRITE else: mmap_access = mmap.ACCESS_READ name = "conque_%s_%s" % (self.mem_type, self.mem_key) self.shm = mmap.mmap(0, self.mem_size, name, mmap_access) if not self.shm: return False else: return True # }}} # **************************************************************************** # read data def read(self, chars=1, start=0): # {{{ # invalid reads if self.fixed_length and (chars == 0 or start + chars > self.mem_size): return '' # go to start position self.shm.seek(start) if not self.fixed_length: chars = self.shm.find(self.TERMINATOR) if chars == 0: return '' shm_str = self.shm.read(chars) # return unpickled byte object if self.serialize: return pickle.loads(shm_str) # decode byes in python 3 if CONQUE_PYTHON_VERSION == 3: return str(shm_str, self.encoding) # encoding if self.encoding != 'ascii': shm_str = unicode(shm_str, self.encoding) return shm_str # }}} # **************************************************************************** # write data def write(self, text, start=0): # {{{ # simple scenario, let pickle create bytes if self.serialize: if CONQUE_PYTHON_VERSION == 3: tb = pickle.dumps(text, 0) else: tb = pickle.dumps(text, 0).encode(self.encoding) else: tb = text.encode(self.encoding, 'replace') self.shm.seek(start) # write to memory if self.fixed_length: self.shm.write(tb) else: self.shm.write(tb + self.TERMINATOR) # }}} # **************************************************************************** # clear def clear(self, start=0): # {{{ self.shm.seek(start) if self.fixed_length: self.shm.write(str(self.fill_char * self.mem_size).encode(self.encoding)) else: self.shm.write(self.TERMINATOR) # }}} # **************************************************************************** # close def close(self): self.shm.close() # vim:foldmethod=marker