Source code for scalib.tools

"""General non-SCA tools that come handy when using SCALib.

Reference
---------

.. currentmodule:: scalib.tools

.. autosummary::
   :toctree:
   :recursive:
   :nosignatures:

   ContextExecutor
"""

__all__ = ["ContextExecutor"]

from concurrent.futures import ThreadPoolExecutor
import contextvars


def restore_context(context):
    for var, value in context.items():
        var.set(value)


[docs]class ContextExecutor(ThreadPoolExecutor): """concurrent.futures.ThreadPoolExecutor with automatic propagation of contextvars. The context is captured at the creation of the executor. """ def __init__(self, *args, **kwargs): context = contextvars.copy_context() super().__init__(*args, **kwargs, initializer=lambda: restore_context(context))