Commit bd3d134f authored by Olivier Tilmans's avatar Olivier Tilmans Committed by Brenden Blanco

python: Avoid unnecessary pointer object creations

Use ctypes.byref() instead of ctypes.pointer() in cases where we do not
need the actual pointer object itself as it is much lighter.
No related merge requests found
......@@ -68,11 +68,11 @@ class SymbolCache(object):
address as the offset.
"""
sym = bcc_symbol()
psym = ct.pointer(sym)
if demangle:
res = lib.bcc_symcache_resolve(self.cache, addr, psym)
res = lib.bcc_symcache_resolve(self.cache, addr, ct.byref(sym))
else:
res = lib.bcc_symcache_resolve_no_demangle(self.cache, addr, psym)
res = lib.bcc_symcache_resolve_no_demangle(self.cache, addr,
ct.byref(sym))
if res < 0:
if sym.module and sym.offset:
return (None, sym.offset,
......@@ -80,7 +80,7 @@ class SymbolCache(object):
return (None, addr, None)
if demangle:
name_res = sym.demangle_name.decode()
lib.bcc_symbol_free_demangle_name(psym)
lib.bcc_symbol_free_demangle_name(ct.byref(sym))
else:
name_res = sym.name.decode()
return (name_res, sym.offset,
......@@ -90,7 +90,7 @@ class SymbolCache(object):
addr = ct.c_ulonglong()
if lib.bcc_symcache_resolve_name(
self.cache, module.encode("ascii") if module else None,
name.encode("ascii"), ct.pointer(addr)) < 0:
name.encode("ascii"), ct.byref(addr)) < 0:
return -1
return addr.value
......@@ -172,7 +172,7 @@ class BPF(object):
CLOCK_MONOTONIC constant. The time returned is in nanoseconds.
"""
t = cls.timespec()
if cls._clock_gettime(cls.CLOCK_MONOTONIC, ct.pointer(t)) != 0:
if cls._clock_gettime(cls.CLOCK_MONOTONIC, ct.byref(t)) != 0:
errno = ct.get_errno()
raise OSError(errno, os.strerror(errno))
return t.tv_sec * 1e9 + t.tv_nsec
......@@ -611,13 +611,12 @@ class BPF(object):
@classmethod
def _check_path_symbol(cls, module, symname, addr, pid):
sym = bcc_symbol()
psym = ct.pointer(sym)
c_pid = 0 if pid == -1 else pid
if lib.bcc_resolve_symname(
module.encode("ascii"), symname.encode("ascii"),
addr or 0x0, c_pid,
ct.cast(None, ct.POINTER(bcc_symbol_option)),
psym,
ct.byref(sym),
) < 0:
raise Exception("could not determine address of symbol %s" % symname)
module_path = ct.cast(sym.module, ct.c_char_p).value.decode()
......
......@@ -160,58 +160,47 @@ class TableBase(MutableMapping):
self._cbs = {}
def key_sprintf(self, key):
key_p = ct.pointer(key)
buf = ct.create_string_buffer(ct.sizeof(self.Key) * 8)
res = lib.bpf_table_key_snprintf(self.bpf.module, self.map_id,
buf, len(buf), key_p)
res = lib.bpf_table_key_snprintf(self.bpf.module, self.map_id, buf,
len(buf), ct.byref(key))
if res < 0:
raise Exception("Could not printf key")
return buf.value
def leaf_sprintf(self, leaf):
leaf_p = ct.pointer(leaf)
buf = ct.create_string_buffer(ct.sizeof(self.Leaf) * 8)
res = lib.bpf_table_leaf_snprintf(self.bpf.module, self.map_id,
buf, len(buf), leaf_p)
res = lib.bpf_table_leaf_snprintf(self.bpf.module, self.map_id, buf,
len(buf), ct.byref(leaf))
if res < 0:
raise Exception("Could not printf leaf")
return buf.value
def key_scanf(self, key_str):
key = self.Key()
key_p = ct.pointer(key)
res = lib.bpf_table_key_sscanf(self.bpf.module, self.map_id,
key_str, key_p)
res = lib.bpf_table_key_sscanf(self.bpf.module, self.map_id, key_str,
ct.byref(key))
if res < 0:
raise Exception("Could not scanf key")
return key
def leaf_scanf(self, leaf_str):
leaf = self.Leaf()
leaf_p = ct.pointer(leaf)
res = lib.bpf_table_leaf_sscanf(self.bpf.module, self.map_id,
leaf_str, leaf_p)
res = lib.bpf_table_leaf_sscanf(self.bpf.module, self.map_id, leaf_str,
ct.byref(leaf))
if res < 0:
raise Exception("Could not scanf leaf")
return leaf
def __getitem__(self, key):
key_p = ct.pointer(key)
leaf = self.Leaf()
leaf_p = ct.pointer(leaf)
res = lib.bpf_lookup_elem(self.map_fd,
ct.cast(key_p, ct.c_void_p),
ct.cast(leaf_p, ct.c_void_p))
res = lib.bpf_lookup_elem(self.map_fd, ct.byref(key), ct.byref(leaf))
if res < 0:
raise KeyError
return leaf
def __setitem__(self, key, leaf):
key_p = ct.pointer(key)
leaf_p = ct.pointer(leaf)
res = lib.bpf_update_elem(self.map_fd,
ct.cast(key_p, ct.c_void_p),
ct.cast(leaf_p, ct.c_void_p), 0)
res = lib.bpf_update_elem(self.map_fd, ct.byref(key), ct.byref(leaf),
0)
if res < 0:
errstr = os.strerror(ct.get_errno())
raise Exception("Could not update table: %s" % errstr)
......@@ -273,17 +262,13 @@ class TableBase(MutableMapping):
def next(self, key):
next_key = self.Key()
next_key_p = ct.pointer(next_key)
if key is None:
res = lib.bpf_get_first_key(self.map_fd,
ct.cast(next_key_p, ct.c_void_p),
ct.sizeof(self.Key))
res = lib.bpf_get_first_key(self.map_fd, ct.byref(next_key),
ct.sizeof(self.Key))
else:
key_p = ct.pointer(key)
res = lib.bpf_get_next_key(self.map_fd,
ct.cast(key_p, ct.c_void_p),
ct.cast(next_key_p, ct.c_void_p))
res = lib.bpf_get_next_key(self.map_fd, ct.byref(key),
ct.byref(next_key))
if res < 0:
raise StopIteration()
......@@ -386,8 +371,7 @@ class HashTable(TableBase):
return i
def __delitem__(self, key):
key_p = ct.pointer(key)
res = lib.bpf_delete_elem(self.map_fd, ct.cast(key_p, ct.c_void_p))
res = lib.bpf_delete_elem(self.map_fd, ct.byref(key))
if res < 0:
raise KeyError
......@@ -425,14 +409,11 @@ class ArrayBase(TableBase):
def __delitem__(self, key):
key = self._normalize_key(key)
key_p = ct.pointer(key)
# Deleting from array type maps does not have an effect, so
# zero out the entry instead.
leaf = self.Leaf()
leaf_p = ct.pointer(leaf)
res = lib.bpf_update_elem(self.map_fd, ct.cast(key_p, ct.c_void_p),
ct.cast(leaf_p, ct.c_void_p), 0)
res = lib.bpf_update_elem(self.map_fd, ct.byref(key), ct.byref(leaf),
0)
if res < 0:
raise Exception("Could not clear item")
......@@ -473,8 +454,7 @@ class ProgArray(ArrayBase):
def __delitem__(self, key):
key = self._normalize_key(key)
key_p = ct.pointer(key)
res = lib.bpf_delete_elem(self.map_fd, ct.cast(key_p, ct.c_void_p))
res = lib.bpf_delete_elem(self.map_fd, ct.byref(key))
if res < 0:
raise Exception("Could not delete item")
......@@ -494,8 +474,7 @@ class PerfEventArray(ArrayBase):
return
# Delete entry from the array
c_key = self._normalize_key(key)
key_p = ct.pointer(c_key)
lib.bpf_delete_elem(self.map_fd, ct.cast(key_p, ct.c_void_p))
lib.bpf_delete_elem(self.map_fd, ct.byref(c_key))
key_id = (id(self), key)
if key_id in self.bpf.open_kprobes:
# The key is opened for perf ring buffer
......@@ -729,8 +708,7 @@ class StackTrace(TableBase):
return i
def __delitem__(self, key):
key_p = ct.pointer(key)
res = lib.bpf_delete_elem(self.map_fd, ct.cast(key_p, ct.c_void_p))
res = lib.bpf_delete_elem(self.map_fd, ct.byref(key))
if res < 0:
raise KeyError
......
......@@ -89,7 +89,7 @@ class USDTProbeLocation(object):
def get_argument(self, index):
arg = bcc_usdt_argument()
res = lib.bcc_usdt_get_argument(self.probe.context, self.probe.name,
self.index, index, ct.pointer(arg))
self.index, index, ct.byref(arg))
if res != 0:
raise USDTException(
"error retrieving probe argument %d location %d" %
......@@ -116,7 +116,7 @@ class USDTProbe(object):
def get_location(self, index):
loc = bcc_usdt_location()
res = lib.bcc_usdt_get_location(self.context, self.name,
index, ct.pointer(loc))
index, ct.byref(loc))
if res != 0:
raise USDTException("error retrieving probe location %d" % index)
return USDTProbeLocation(self, index, loc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment