def myroutine(): ds = DataSource('data.xtc') for nevent, evt in enumerate(ds.events()): if nevent == 0: dgrambytes_event0 = evt.dgrams[0]._dgrambytes elif nevent == 1: dgram_event1 = evt.dgrams[0] # be sure you know what you are doing before you change # these reference count numbers. - cpo dgrambytes_event1 = dgram_event1._dgrambytes # 4 for arrays, 1 for dgram, 1 for getref, 1 for dgrambytes_event1 assert getref(dgrambytes_event1) == 7 # event0 dgram is deleted, so only 1 for dgrambytes_event0 and 1 for getref assert getref(dgrambytes_event0) == 2 return dgram_event1, ds._configs[0]
def refcnt_test(fname, nsegments, cydgram): ds = DataSource(files=fname) for nevent, evt in enumerate(ds.events()): if nevent == 0: dgrambytes_event0 = evt._dgrams[0]._dgrambytes elif nevent == 1: dgram_event1 = evt._dgrams[0] # be sure you know what you are doing before you change # these reference count numbers. - cpo dgrambytes_event1 = dgram_event1._dgrambytes # 4 arrays per segment, 1 for dgram, 1 for getref, 1 for dgrambytes_event1 # cydgram test eliminates 3 of these arrays however (a hack since # the xpphsd detector has unsupported cydgram types of charstr/enum) if cydgram: assert getref(dgrambytes_event1) == 1 * nsegments + 3 else: assert getref(dgrambytes_event1) == 4 * nsegments + 3 # event0 dgram is deleted, so only 1 for dgrambytes_event0 and 1 for getref assert getref(dgrambytes_event0) == 2 return dgram_event1, ds._configs[0]
def myroutine2(): d = Dgram() assert getref(d) == 2 arr1 = d.array0 #increase refcount of d assert getref(d) == 3 assert getref(arr1) == 2 s1 = arr1[2:4] #increase refcount of arr1 assert s1.base is arr1 assert getref(arr1) == 3 assert getref(s1) == 2 arr2 = d.array0 #increase refcount of d assert getref(d) == 4 s2 = arr2[3:5] # increase refcount of arr2 assert getref(d) == 4 assert getref(arr2) == 3 return s1, d # destroys arr2 and s2, should decrement d refcnt by 1
def myroutine1(): s1, d = myroutine2() assert getref(d) == 3 assert getref(s1) == 2 return d # should decrement d refcnt by 1 since s1 is now gone
assert getref(s1) == 2 arr2 = d.array0 #increase refcount of d assert getref(d) == 4 s2 = arr2[3:5] # increase refcount of arr2 assert getref(d) == 4 assert getref(arr2) == 3 return s1, d # destroys arr2 and s2, should decrement d refcnt by 1 def myroutine1(): s1, d = myroutine2() assert getref(d) == 3 assert getref(s1) == 2 return d # should decrement d refcnt by 1 since s1 is now gone d = myroutine1() assert getref(d) == 2 assert d.float0 == 0.0 assert d.float1 == 1000.0 assert d.int0 == 1 assert d.int1 == 1001 #this seems to crash the test. need to fix. #print(dir(d)) assert d.fexint1 == 42 assert d.fexfloat1 == 41.0 print('dgram test complete')