| # SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) | |
| # Copyright (c) 2019, Mellanox Technologies. All rights reserved. | |
| from libc.errno cimport errno | |
| import logging | |
| from pyverbs.pyverbs_error import PyverbsRDMAError | |
| cimport pyverbs.libibverbs as v | |
| def inc_rkey(rkey): | |
| return v.ibv_inc_rkey(rkey) | |
| cpdef PyverbsRDMAErrno(str msg): | |
| return PyverbsRDMAError(msg, errno) | |
| LOG_LEVEL=logging.INFO | |
| LOG_FORMAT='[%(levelname)s] %(asctime)s %(filename)s:%(lineno)s: %(message)s' | |
| logging.basicConfig(format=LOG_FORMAT, level=LOG_LEVEL, datefmt='%d %b %Y %H:%M:%S') | |
| cdef close_weakrefs(iterables): | |
| """ | |
| For each iterable element of iterables, pop each element and | |
| call its close() method. This method is used when an object is being | |
| closed while other objects still hold C references to it; the object | |
| holds weakrefs to such other object, and closes them before trying to | |
| teardown the C resources. | |
| :param iterables: an array of WeakSets | |
| :return: None | |
| """ | |
| # None elements can be present if an object's close() was called more | |
| # than once (e.g. GC and by another object) | |
| for it in iterables: | |
| if it is None: | |
| continue | |
| items = list(it) | |
| it.clear() | |
| for item in items: | |
| if item is not None: | |
| item.close() | |
| cdef class PyverbsObject(object): | |
| def __init__(self): | |
| self.logger = logging.getLogger(self.__class__.__name__) | |
| def set_log_level(self, val): | |
| self.logger.setLevel(val) | |
| cdef class PyverbsCM(PyverbsObject): | |
| """ | |
| This is a base class for pyverbs' context manager objects. It includes | |
| __enter__ and __exit__ functions. | |
| close() is also declared but it should be overridden by each inheriting | |
| class. | |
| """ | |
| def __enter__(self): | |
| return self | |
| def __exit__(self, exc_type, exc_value, traceback): | |
| return self.close() | |
| cpdef close(self): | |
| pass |