summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRyan Wilson <wryan@nicira.com>2014-06-02 22:47:15 -0700
committerYAMAMOTO Takashi <yamamoto@valinux.co.jp>2014-06-05 02:34:56 +0900
commit50a1a1d2cc2b8fb573076ff6ee0e4f790919118b (patch)
tree11c87d16e644fa6f71e88f64a3bde0c39f6000e5 /python
parent348f828214d9660a69ba0730ff1c96b61a3ab7ca (diff)
downloadopenvswitch-50a1a1d2cc2b8fb573076ff6ee0e4f790919118b.tar.gz
timeval: Add monotonic time functionality for NetBSD and FreeBSD.
This patch also checks the system platform as clock_gettime could exist on different platforms but with different values of CLOCK_MONOTONIC and different definitions of 'struct timespec'. In this case, the system call would be expected to catch the error, which is dangerous. This patch ensures Linux, NetBSD and FreeBSD platforms use clock_gettime with their corresponding correct values and definitions. All other platforms use time.time(). Signed-off-by: Ryan Wilson <wryan@nicira.com> Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Diffstat (limited to 'python')
-rw-r--r--python/ovs/timeval.py34
1 files changed, 27 insertions, 7 deletions
diff --git a/python/ovs/timeval.py b/python/ovs/timeval.py
index 4463e8769..a16bf60d4 100644
--- a/python/ovs/timeval.py
+++ b/python/ovs/timeval.py
@@ -12,22 +12,41 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import sys
import time
-LIBRT = 'librt.so.1'
-CLOCK_MONOTONIC = 1
-
try:
import ctypes
+ LIBRT = 'librt.so.1'
+ clock_gettime_name = 'clock_gettime'
+
+ if sys.platform.startswith("linux"):
+ CLOCK_MONOTONIC = 1
+ time_t = ctypes.c_long
+ elif sys.platform.startswith("netbsd"):
+ # NetBSD uses function renaming for ABI versioning. While the proper
+ # way to get the appropriate version is of course "#include <time.h>",
+ # it is difficult with ctypes. The following is appropriate for
+ # recent versions of NetBSD, including NetBSD-6.
+ LIBRT = 'libc.so.12'
+ clock_gettime_name = '__clock_gettime50'
+ CLOCK_MONOTONIC = 3
+ time_t = ctypes.c_int64
+ elif sys.platform.startswith("freebsd"):
+ CLOCK_MONOTONIC = 4
+ time_t = ctypes.c_int64
+ else:
+ raise Exception
+
class timespec(ctypes.Structure):
_fields_ = [
- ('tv_sec', ctypes.c_long),
+ ('tv_sec', time_t),
('tv_nsec', ctypes.c_long),
]
librt = ctypes.CDLL(LIBRT)
- clock_gettime = librt.clock_gettime
+ clock_gettime = getattr(librt, clock_gettime_name)
clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]
except:
# Librt shared library could not be loaded
@@ -48,8 +67,9 @@ if not hasattr(time, 'monotonic'):
time.monotonic = monotonic
def msec():
- """Returns the current time, as the amount of time since the epoch, in
- milliseconds, as a float."""
+ """ Returns the system's monotonic time if possible, otherwise returns the
+ current time as the amount of time since the epoch, in milliseconds, as a
+ float."""
return time.monotonic() * 1000.0