diff options
author | Donghoon Shin <dhs.shin@samsung.com> | 2016-09-19 17:38:58 +0900 |
---|---|---|
committer | Donghoon Shin <dhs.shin@samsung.com> | 2016-09-19 17:38:58 +0900 |
commit | 55f6c58c9283b7f04999fe4c9b996ef4f35cb2b2 (patch) | |
tree | 01dcd0ffad230a8cafb9d9e1a4c65721609a5a82 | |
parent | e1889cebcc484e84ffcfa1284b7d08ed09f4bd0f (diff) | |
download | monotonic-master.tar.gz monotonic-master.tar.bz2 monotonic-master.zip |
Update initial source codesHEADsubmit/trunk/20191101.102136submit/trunk/20191030.112603submit/trunk/20191017.233826submit/trunk/20191017.111201submit/trunk/20190927.012842accepted/tools/devbase/tools/legacy/20240424.050615accepted/tools/devbase/tools/legacy/20240423.040633accepted/tools/devbase/tools/legacy/20240422.110742accepted/tizen/devbase/tools/20190927.0448110.6release-20160930masterdevelaccepted/tools_devbase_tools_legacyaccepted/tizen_devbase_tools
Change-Id: Iba7b62ce8800b1f961a14d24b4f2890f0f4ae9dd
-rw-r--r-- | LICENSE | 202 | ||||
-rw-r--r-- | MANIFEST.in | 1 | ||||
-rw-r--r-- | README.md | 43 | ||||
-rw-r--r-- | debian/changelog | 31 | ||||
-rw-r--r-- | debian/compat | 1 | ||||
-rw-r--r-- | debian/control | 52 | ||||
-rw-r--r-- | debian/copyright | 27 | ||||
-rw-r--r-- | debian/files | 2 | ||||
-rw-r--r-- | debian/gbp.conf | 9 | ||||
-rwxr-xr-x | debian/rules | 36 | ||||
-rw-r--r-- | debian/source/format | 1 | ||||
-rw-r--r-- | debian/source/options | 1 | ||||
-rw-r--r-- | debian/watch | 3 | ||||
-rw-r--r-- | monotonic.py | 164 | ||||
-rw-r--r-- | setup.py | 49 |
15 files changed, 622 insertions, 0 deletions
@@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..cc0d116 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include LICENSE
\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..236ec03 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +monotonic +========= +This module provides a ``monotonic()`` function which returns the +value (in fractional seconds) of a clock which never goes backwards. +It is compatible with Python 2 and Python 3. + +On Python 3.3 or newer, ``monotonic`` will be an alias of +[``time.monotonic``][0] from the standard library. On older versions, +it will fall back to an equivalent implementation: + + OS | Implementation +-------------|------------------------- + Linux, *BSD | [clock_gettime][1] + Windows | [GetTickCount[64]][2] + OS X | [mach_absolute_time][3] + +If no suitable implementation exists for the current platform, +attempting to import this module (or to import from it) will +cause a RuntimeError exception to be raised. + +monotonic is available via the Python Cheese Shop (PyPI): + https://pypi.python.org/pypi/monotonic/ + +License +------- +Copyright 2014 Ori Livneh <ori@wikimedia.org> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +[0]: https://docs.python.org/3/library/time.html#time.monotonic +[1]: http://linux.die.net/man/3/clock_gettime +[2]: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724411 +[3]: https://developer.apple.com/library/mac/qa/qa1398/ diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..f66b5a8 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,31 @@ +python-monotonic (0.6-2) unstable; urgency=medium + + * Uploading to unstable. + + -- Thomas Goirand <zigo@debian.org> Mon, 04 Apr 2016 08:30:46 +0000 + +python-monotonic (0.6-1) experimental; urgency=medium + + [ Corey Bryant ] + * New upstream release. + + [ Ondřej Nový ] + * Fixed VCS URLs (https). + + [ Thomas Goirand ] + * Fixed debian/copyright ordering. + * Standards-Version: 3.9.7 (no change). + + -- Thomas Goirand <zigo@debian.org> Wed, 02 Mar 2016 10:12:20 +0000 + +python-monotonic (0.3-1) unstable; urgency=medium + + * New upstream release. + + -- Thomas Goirand <zigo@debian.org> Wed, 02 Sep 2015 21:35:29 +0000 + +python-monotonic (0.2-1) unstable; urgency=medium + + * Initial release. (Closes: #789918) + + -- Thomas Goirand <zigo@debian.org> Thu, 25 Jun 2015 10:28:31 +0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..60cf71c --- /dev/null +++ b/debian/control @@ -0,0 +1,52 @@ +Source: python-monotonic +Section: python +Priority: optional +Maintainer: PKG OpenStack <openstack-devel@lists.alioth.debian.org> +Uploaders: Thomas Goirand <zigo@debian.org>, +Build-Depends: debhelper (>= 9), + openstack-pkg-tools, + dh-python, + python-all, + python-setuptools, + python3-all, + python3-setuptools, +Standards-Version: 3.9.7 +Vcs-Browser: https://anonscm.debian.org/cgit/openstack/python-monotonic.git/ +Vcs-Git: https://anonscm.debian.org/git/openstack/python-monotonic.git +Homepage: https://github.com/atdt/monotonic + +Package: python-monotonic +Architecture: all +Depends: ${misc:Depends}, + ${python:Depends}, +Description: implementation of time.monotonic() - Python 2.x + This module provides a monotonic() function which returns the value (in + fractional seconds) of a clock which never goes backwards. On Python 3.3 or + newer, monotonic will be an alias of time.monotonic from the standard library. + On older versions, it will fall back to an equivalent implementation: + GetTickCount64 on Windows, mach_absolute_time on OS X, and clock_gettime(3) + on Linux/BSD. + . + If no suitable implementation exists for the current platform, attempting to + import this module (or to import from it) will cause a RuntimeError exception + to be raised. + . + This package contains the Python 2.x module. + +Package: python3-monotonic +Architecture: all +Depends: ${misc:Depends}, + ${python3:Depends}, +Description: implementation of time.monotonic() - Python 3.x + This module provides a monotonic() function which returns the value (in + fractional seconds) of a clock which never goes backwards. On Python 3.3 or + newer, monotonic will be an alias of time.monotonic from the standard library. + On older versions, it will fall back to an equivalent implementation: + GetTickCount64 on Windows, mach_absolute_time on OS X, and clock_gettime(3) + on Linux/BSD. + . + If no suitable implementation exists for the current platform, attempting to + import this module (or to import from it) will cause a RuntimeError exception + to be raised. + . + This package contains the Python 3.x module. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..05466d5 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,27 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: monotonic +Source: https://github.com/atdt/monotonic + +Files: * +Copyright: (c) 2014-2016, Ori Livneh <ori@wikimedia.org> +License: Apache-2 + +Files: debian/* +Copyright: (c) 2015-2016, Thomas Goirand <zigo@debian.org> +License: Apache-2 + +License: Apache-2 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + . + On Debian-based systems the full text of the Apache version 2.0 license + can be found in /usr/share/common-licenses/Apache-2.0. diff --git a/debian/files b/debian/files new file mode 100644 index 0000000..e0cdbc6 --- /dev/null +++ b/debian/files @@ -0,0 +1,2 @@ +python-monotonic_0.6-2_all.deb python optional +python3-monotonic_0.6-2_all.deb python optional diff --git a/debian/gbp.conf b/debian/gbp.conf new file mode 100644 index 0000000..10f9500 --- /dev/null +++ b/debian/gbp.conf @@ -0,0 +1,9 @@ +[DEFAULT] +upstream-branch = master +debian-branch = debian/unstable +upstream-tag = %(version)s +compression = xz + +[buildpackage] +export-dir = ../build-area/ + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..c7dc9ae --- /dev/null +++ b/debian/rules @@ -0,0 +1,36 @@ +#!/usr/bin/make -f + +PYTHONS:=$(shell pyversions -vr) +PYTHON3S:=$(shell py3versions -vr) + +UPSTREAM_GIT = git://github.com/atdt/monotonic.git +include /usr/share/openstack-pkg-tools/pkgos.make + +%: + dh $@ --buildsystem=python_distutils --with python2,python3 + +override_dh_install: + set -e ; for pyvers in $(PYTHONS); do \ + python$$pyvers setup.py install --install-layout=deb \ + --root $(CURDIR)/debian/python-monotonic; \ + done + set -e ; for pyvers in $(PYTHON3S); do \ + python$$pyvers setup.py install --install-layout=deb \ + --root $(CURDIR)/debian/python3-monotonic; \ + done + rm -rf $(CURDIR)/debian/python*-monotonic/usr/lib/python*/dist-packages/*.pth + +override_dh_clean: + dh_clean -O--buildsystem=python_distutils + rm -rf build + +# Commands not to run +override_dh_installcatalogs: +override_dh_installemacsen override_dh_installifupdown: +override_dh_installinfo override_dh_installmenu override_dh_installmime: +override_dh_installmodules override_dh_installlogcheck: +override_dh_installpam override_dh_installppp override_dh_installudev override_dh_installwm: +override_dh_installxfonts override_dh_gconf override_dh_icons override_dh_perl override_dh_usrlocal: +override_dh_installcron override_dh_installdebconf: +override_dh_installlogrotate override_dh_installgsettings: +
\ No newline at end of file diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/source/options b/debian/source/options new file mode 100644 index 0000000..cb61fa5 --- /dev/null +++ b/debian/source/options @@ -0,0 +1 @@ +extend-diff-ignore = "^[^/]*[.]egg-info/" diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..84cfebe --- /dev/null +++ b/debian/watch @@ -0,0 +1,3 @@ +version=3 +opts="uversionmangle=s/\.(b|rc)/~$1/" \ +https://github.com/atdt/monotonic/tags .*/(\d[\d\.]+)\.tar\.gz diff --git a/monotonic.py b/monotonic.py new file mode 100644 index 0000000..a3552c0 --- /dev/null +++ b/monotonic.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +""" + monotonic + ~~~~~~~~~ + + This module provides a ``monotonic()`` function which returns the + value (in fractional seconds) of a clock which never goes backwards. + + On Python 3.3 or newer, ``monotonic`` will be an alias of + ``time.monotonic`` from the standard library. On older versions, + it will fall back to an equivalent implementation: + + +-------------+--------------------+ + | Linux, BSD | clock_gettime(3) | + +-------------+--------------------+ + | Windows | GetTickCount[64] | + +-------------+--------------------+ + | OS X | mach_absolute_time | + +-------------+--------------------+ + + If no suitable implementation exists for the current platform, + attempting to import this module (or to import from it) will + cause a RuntimeError exception to be raised. + + + Copyright 2014 Ori Livneh <ori@wikimedia.org> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +""" +import ctypes +import ctypes.util +import os +import sys +import time +import threading + + +__all__ = ('monotonic',) + + +try: + monotonic = time.monotonic +except AttributeError: + try: + if sys.platform == 'darwin': # OS X, iOS + # See Technical Q&A QA1398 of the Mac Developer Library: + # <https://developer.apple.com/library/mac/qa/qa1398/> + libc = ctypes.CDLL('/usr/lib/libc.dylib', use_errno=True) + + class mach_timebase_info_data_t(ctypes.Structure): + """System timebase info. Defined in <mach/mach_time.h>.""" + _fields_ = (('numer', ctypes.c_uint32), + ('denom', ctypes.c_uint32)) + + mach_absolute_time = libc.mach_absolute_time + mach_absolute_time.restype = ctypes.c_uint64 + + timebase = mach_timebase_info_data_t() + libc.mach_timebase_info(ctypes.byref(timebase)) + ticks_per_second = timebase.numer / timebase.denom * 1.0e9 + + def monotonic(): + """Monotonic clock, cannot go backward.""" + return mach_absolute_time() / ticks_per_second + + elif sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): + if sys.platform.startswith('cygwin'): + # Note: cygwin implements clock_gettime (CLOCK_MONOTONIC = 4) since + # version 1.7.6. Using raw WinAPI for maximum version compatibility. + + # Ugly hack using the wrong calling convention (in 32-bit mode) + # because ctypes has no windll under cygwin (and it also seems that + # the code letting you select stdcall in _ctypes doesn't exist under + # the preprocessor definitions relevant to cygwin). + # This is 'safe' because: + # 1. The ABI of GetTickCount and GetTickCount64 is identical for + # both calling conventions because they both have no parameters. + # 2. libffi masks the problem because after making the call it doesn't + # touch anything through esp and epilogue code restores a correct + # esp from ebp afterwards. + kernel32 = ctypes.cdll.kernel32 + else: + kernel32 = ctypes.windll.kernel32 + + GetTickCount64 = getattr(kernel32, 'GetTickCount64', None) + if GetTickCount64: + # Windows Vista / Windows Server 2008 or newer. + GetTickCount64.restype = ctypes.c_ulonglong + + def monotonic(): + """Monotonic clock, cannot go backward.""" + return GetTickCount64() / 1000.0 + + else: + # Before Windows Vista. + GetTickCount = kernel32.GetTickCount + GetTickCount.restype = ctypes.c_uint32 + + get_tick_count_lock = threading.Lock() + get_tick_count_last_sample = 0 + get_tick_count_wraparounds = 0 + + def monotonic(): + """Monotonic clock, cannot go backward.""" + global get_tick_count_last_sample + global get_tick_count_wraparounds + + with get_tick_count_lock: + current_sample = GetTickCount() + if current_sample < get_tick_count_last_sample: + get_tick_count_wraparounds += 1 + get_tick_count_last_sample = current_sample + + final_milliseconds = get_tick_count_wraparounds << 32 + final_milliseconds += get_tick_count_last_sample + return final_milliseconds / 1000.0 + + else: + try: + clock_gettime = ctypes.CDLL(ctypes.util.find_library('c'), + use_errno=True).clock_gettime + except AttributeError: + clock_gettime = ctypes.CDLL(ctypes.util.find_library('rt'), + use_errno=True).clock_gettime + + class timespec(ctypes.Structure): + """Time specification, as described in clock_gettime(3).""" + _fields_ = (('tv_sec', ctypes.c_long), + ('tv_nsec', ctypes.c_long)) + + if sys.platform.startswith('linux'): + CLOCK_MONOTONIC = 1 + elif sys.platform.startswith('freebsd'): + CLOCK_MONOTONIC = 4 + elif sys.platform.startswith('sunos5'): + CLOCK_MONOTONIC = 4 + elif 'bsd' in sys.platform: + CLOCK_MONOTONIC = 3 + + def monotonic(): + """Monotonic clock, cannot go backward.""" + ts = timespec() + if clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(ts)): + errno = ctypes.get_errno() + raise OSError(errno, os.strerror(errno)) + return ts.tv_sec + ts.tv_nsec / 1.0e9 + + # Perform a sanity-check. + if monotonic() - monotonic() > 0: + raise ValueError('monotonic() is not monotonic!') + + except Exception: + raise RuntimeError('no suitable implementation for this system') diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2f97dc9 --- /dev/null +++ b/setup.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +""" +monotonic +~~~~~~~~~ + +This module provides a ``monotonic()`` function which returns the +value (in fractional seconds) of a clock which never goes backwards. + +On Python 3.3 or newer, ``monotonic`` will be an alias of +``time.monotonic`` from the standard library. On older versions, +it will fall back to an equivalent implementation: + ++-------------+--------------------+ +| Linux, BSD | clock_gettime(3) | ++-------------+--------------------+ +| Windows | GetTickCount[64] | ++-------------+--------------------+ +| OS X | mach_absolute_time | ++-------------+--------------------+ + +If no suitable implementation exists for the current platform, +attempting to import this module (or to import from it) will +cause a RuntimeError exception to be raised. + +""" +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + + +setup( + name='monotonic', + version='0.6', + license='Apache', + author='Ori Livneh', + author_email='ori@wikimedia.org', + url='https://github.com/atdt/monotonic', + description='An implementation of time.monotonic() for Python 2 & < 3.3', + long_description=__doc__, + classifiers=( + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + 'Topic :: Software Development :: Libraries :: Python Modules', + ), + py_modules=('monotonic',), +) |