8 __doc__ =
"log the vmem usage at each dso being dlopen'd"
9 __version__ =
"$Revision: 1.3 $"
10 __author__ =
"Sebastien Binet <binet@cern.ch>"
16 from os.path
import realpath
as _realpath
17 from os.path
import basename
as _basename
21 (
'fname', ctypes.c_char_p),
22 (
'step', ctypes.c_int),
28 """log Dso loading by calling-back into `cb_fct`
30 if `cb_fct` is None we use a default callback function which logs
34 self.
lib = ctypes.cdll.LoadLibrary (
"libAthDSoCallBacks.so")
39 self._cb_fct_type = ctypes.CFUNCTYPE(ctypes.c_int,
40 ctypes.POINTER(DsoEvent),
42 fct = self.lib.ath_dso_cbk_register
43 fct.argtypes = [self._cb_fct_type, ctypes.c_void_p]
44 fct.restype = ctypes.c_int
46 fct = self.lib.ath_dso_cbk_unregister
47 fct.argtypes = [self._cb_fct_type]
48 fct.restype = ctypes.c_int
50 from collections
import defaultdict
51 self._data = defaultdict(dict)
53 from AthenaCommon.Logging
import logging
54 self.msg = logging.getLogger (
"AthDsoLogger")
55 self.msg.setLevel (logging.INFO)
58 cb_fct = self.default_cb_fct
60 self.msg.info (
"creating the C-callback function")
61 self.cb_fct = self._cb_fct_type(cb_fct)
66 fname =
'vmem-dso.csv'
67 if os.path.exists (fname):
69 self._fd = open (fname,
'w')
70 self.out = csv.writer (self._fd, delimiter=
';')
71 map (self.out.writerow,
72 [ [
'master-pid', os.getpid()],
74 'vmem-start (kb)',
'vmem-stop (kb)',
'dvmem (kb)'],
78 self.msg.info (
"initializing the C-dlopen-logger")
86 if sys.platform !=
'darwin':
88 libname = evt.contents.fname
89 step = evt.contents.step
93 n = _basename (_realpath (libname))
97 from os
import sysconf
98 PAGE_SIZE = sysconf (
'SC_PAGE_SIZE')
100 from string
import split
as ssplit
102 with open(
'/proc/self/statm')
as f:
103 m =
int(ssplit (f.readlines()[0])[0])
107 self._data[pid][n] = [vmem(),
None]
109 data = self._data[pid][n]
111 vmem_start = data[0]/1024.
112 vmem_stop = data[1]/1024.
113 dvmem = vmem_stop - vmem_start
115 "[%d] loading lib: vmem=(%10.1f + %10.1f) kb [%s]",
116 pid, vmem_start, dvmem, n
118 self.out.writerow ([pid, n, vmem_start, vmem_stop, dvmem])
128 n = _basename (_realpath (libname))
132 from os
import sysconf
133 PAGE_SIZE = sysconf (
'SC_PAGE_SIZE')
137 self._data[pid][n] = [vmem(),
None]
139 data = self._data[pid][n]
141 vmem_start = data[0]/1024.
142 vmem_stop = data[1]/1024.
143 dvmem = vmem_stop - vmem_start
145 "[%d] loading lib: vmem=(%10.1f + %10.1f) kb [%s]",
146 pid, vmem_start, dvmem, n
148 self.out.writerow ([pid, n, vmem_start, vmem_stop, dvmem])