'''ctype_stressor.py -- stress ctypes memory leak? usage: python ctype_stressor.py [args] args are: -h print this help and exit -v be more verbose -N nreport report every nreport loops (100000) -L datalen ctype array length (8192) ''' import sys import time import ctypes as C import resource def getmaxresidentmem(): whom = resource.RUSAGE_SELF page_size = resource.getpagesize() usage = resource.getrusage(whom) resident_bytes = page_size * usage.ru_maxrss return resident_bytes def ctype_actions(datalen = 8192): samples = (C.c_double * datalen)() sptr = C.cast(samples, C.POINTER(C.c_double)) return samples class Usage(Exception): def __init__(self, msg): self.msg = msg def main(argv=None): import getopt if argv is None: argv = sys.argv verbose = 0 optstring = "vhN:L:" reports = 100000 datalen = 8192 try: try: opts, args = getopt.getopt(argv[1:], optstring, ["help"]) except getopt.error as msg: raise Usage(msg) # process options for o, a in opts: if o in ("-h", "--help"): print >> sys.stderr, __doc__ return 0 elif o == "-v": verbose += 1 elif o == "-L": datalen = int(a) elif o == "-N": reports = int(a) else: raise Usage("can't handle option " + o) passes = 0 ctype_actions() basemem = getmaxresidentmem() while True: ctype_actions() passes += 1 if passes == 1 or passes % reports == 0: currentmem = getmaxresidentmem() fmem = (currentmem - basemem)/float(basemem) print("%8d %12.7e %12.7e" % (passes, fmem, currentmem)) return 0 except KeyboardInterrupt: return 0 except Exception as e: print(e) return 2 if __name__ == "__main__": sys.exit(main())