cachedObject.py (4670B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\net\cachedObject.py 2 import binascii 3 import sys 4 import zlib 5 import blue 6 import uthread 7 import carbon.common.script.net.machobase as macho 8 from carbon.common.script.util.timerstuff import ClockThis 9 10 class CachedObject: 11 __guid__ = 'util.CachedObject' 12 __passbyvalue__ = 1 13 __persistvar__ = ['__objectID__', 14 '__nodeID__', 15 '__objectVersion__', 16 '__shared__'] 17 18 def __init__(self, shared, objectID, cachedObject, objectVersion = None): 19 self.__shared__ = shared 20 self.__objectID__ = objectID 21 self.__nodeID__ = sm.GetService('machoNet').GetNodeID() 22 self.__cachedObject__ = cachedObject 23 self.__compressed__ = 0 24 self.__thePickle__ = None 25 self.__objectVersion__ = (blue.os.GetWallclockTimeNow(), objectVersion) 26 if (self.__shared__ or objectVersion is None) and macho.mode != 'client': 27 self.__thePickle__ = blue.marshal.Save(cachedObject) 28 if len(self.__thePickle__) > 170: 29 try: 30 t = ClockThis('machoNet::util.CachedObject::compress', zlib.compress, self.__thePickle__, 1) 31 except zlib.error as e: 32 raise RuntimeError('Compression Failure: ' + strx(e)) 33 34 if len(t) < len(self.__thePickle__): 35 self.__thePickle__ = t 36 self.__compressed__ = 1 37 if objectVersion is None: 38 self.__objectVersion__ = (self.__objectVersion__[0], binascii.crc_hqx(self.__thePickle__, macho.version + 170472)) 39 40 def __getstate__(self): 41 ret = [ getattr(self, attr) for attr in self.__persistvar__ ] 42 if ret[-1]: 43 ret = ret[:-1] 44 return tuple(ret) 45 46 def __str__(self): 47 try: 48 ret = [] 49 for each in self.__persistvar__ + ['__thePickle__', '__compressed__']: 50 if each == '__thePickle__': 51 ret.append(len(each)) 52 else: 53 ret.append(self.__dict__[each]) 54 55 return '<CachedObject %s>' % str(ret) 56 except Exception: 57 sys.exc_clear() 58 return '<CachedObject ?>' 59 60 def __repr__(self): 61 return str(self) 62 63 def __setstate__(self, state): 64 for i in xrange(len(self.__persistvar__)): 65 if i >= len(state): 66 if self.__persistvar__[i] == '__shared__': 67 setattr(self, self.__persistvar__[i], 1) 68 else: 69 raise RuntimeError('Cached Object format version mismatch') 70 else: 71 setattr(self, self.__persistvar__[i], state[i]) 72 73 self.__cachedObject__ = None 74 self.__thePickle__ = None 75 self.__compressed__ = 0 76 77 def __getattr__(self, key): 78 if key == '__getinitargs__': 79 raise AttributeError(key, "CachedObject's cannot define __getinitargs__") 80 self.__UpdateCache() 81 c = self.__cachedObject__ 82 if c is None: 83 raise ReferenceError('The specified object is no longer available in cache') 84 return getattr(c, key) 85 86 def __getitem__(self, key): 87 self.__UpdateCache() 88 c = self.__cachedObject__ 89 if c is None: 90 raise ReferenceError('The specified object is no longer available in cache') 91 return c[key] 92 93 def __UpdateCache(self): 94 if self.__cachedObject__ is not None: 95 return 96 if '__semaphore__' not in self.__dict__: 97 s = uthread.Semaphore(('cachedObject', 98 self.__objectID__, 99 self.__objectVersion__, 100 self.__nodeID__)) 101 self.__semaphore__ = s 102 with self.__semaphore__: 103 if self.__cachedObject__ is None: 104 self.__cachedObject__ = sm.GetService('objectCaching').GetCachableObject(self.__shared__, self.__objectID__, self.__objectVersion__, self.__nodeID__).GetObject() 105 if '__semaphore__' in self.__dict__: 106 if self.__semaphore__.IsCool(): 107 del self.__semaphore__ 108 109 def GetCachedObject(self): 110 self.__UpdateCache() 111 if self.__cachedObject__ is None: 112 raise ReferenceError('The specified object is no longer available in cache') 113 return self.__cachedObject__ 114 115 def GetObjectID(self): 116 return self.__objectID__ 117 118 def MachoGetCachedObjectGuts(self): 119 return (self.__shared__, 120 self.__objectID__, 121 self.__objectVersion__, 122 self.__nodeID__, 123 self.__cachedObject__, 124 self.__thePickle__, 125 self.__compressed__)