> 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 <wr...@nicira.com>

Acked-by: YAMAMOTO Takashi <yamam...@valinux.co.jp>

> 
> ---
> v2: Added Yamamoto's diff to fix NetBSD case
> ---
>  python/ovs/timeval.py |   34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/python/ovs/timeval.py b/python/ovs/timeval.py
> index 4463e87..a16bf60 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
>  
>  
> -- 
> 1.7.9.5
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to