aboutsummaryrefslogtreecommitdiff
path: root/ouroboros/_timespec.py
diff options
context:
space:
mode:
Diffstat (limited to 'ouroboros/_timespec.py')
-rw-r--r--ouroboros/_timespec.py51
1 files changed, 23 insertions, 28 deletions
diff --git a/ouroboros/_timespec.py b/ouroboros/_timespec.py
index 2fcf666..1656eb2 100644
--- a/ouroboros/_timespec.py
+++ b/ouroboros/_timespec.py
@@ -1,64 +1,59 @@
#
-# Ouroboros - Copyright (C) 2016 - 2026
-#
-# Internal helpers for translating float seconds <-> struct timespec.
-#
-# Dimitri Staessens <dimitri@ouroboros.rocks>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public License
-# version 2.1 as published by the Free Software Foundation.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., http://www.fsf.org/about/contact/.
+# SPDX-FileCopyrightText: 2016 - 2026 Dimitri Staessens
+# SPDX-License-Identifier: LGPL-2.1-only
#
-"""Shared float-seconds <-> ``struct timespec *`` conversions.
+"""
+Shared float-seconds <-> ``struct timespec *`` conversions.
-The dev and event modules both deal in seconds-as-float timeouts on
-the Python side and pass ``struct timespec *`` to the C library.
-The helpers take the caller's ``ffi`` instance as a parameter so the
-returned CData is bound to the right CFFI module.
+The caller passes its own ``ffi`` instance so the returned CData is
+bound to the right CFFI extension module.
"""
from __future__ import annotations
from math import modf
-from typing import Optional
+from typing import TYPE_CHECKING, Any, Optional
+
+if TYPE_CHECKING:
+ from cffi import FFI
BILLION = 1000 * 1000 * 1000
-def fl_to_timespec(ffi, timeo: Optional[float]):
- """Convert *timeo* (seconds, or None) to a ``struct timespec *``.
+def fl_to_timespec(ffi: FFI, timeo: Optional[float]) -> Any:
+ """
+ Convert *timeo* (seconds, or None) to a ``struct timespec *``.
*None* yields ``ffi.NULL`` (block forever). A non-positive *timeo*
yields a zeroed timespec (async / poll).
"""
+
if timeo is None:
return ffi.NULL
+
if timeo <= 0:
return ffi.new("struct timespec *", [0, 0])
+
frac, whole = modf(timeo)
_timeo = ffi.new("struct timespec *")
_timeo.tv_sec = int(whole)
_timeo.tv_nsec = int(frac * BILLION)
+
return _timeo
-def timespec_to_fl(ffi, _timeo) -> Optional[float]:
- """Convert a ``struct timespec *`` to seconds-as-float.
+def timespec_to_fl(ffi: FFI, _timeo: Any) -> Optional[float]:
+ """
+ Convert a ``struct timespec *`` to seconds-as-float.
``ffi.NULL`` yields *None* (block forever).
"""
+
if _timeo == ffi.NULL:
return None
+
if _timeo.tv_sec <= 0 and _timeo.tv_nsec == 0:
return 0.0
+
return _timeo.tv_sec + _timeo.tv_nsec / BILLION