Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/adjtime.c: Use ADJ_OFFSET_SS_READ if
Browse files Browse the repository at this point in the history
	possible.
	* sysdeps/unix/sysv/linux/kernel-features.h
	(__ASSUME_ADJ_OFFSET_SS_READ): Define for 2.6.24.
	* sysdeps/unix/sysv/linux/sys/timex.h (ADJ_OFFSET_SS_READ): Define.
  • Loading branch information
Ulrich Drepper committed Dec 10, 2007
1 parent b4354cf commit ae18718
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2007-12-10 Ulrich Drepper <drepper@redhat.com>

* sysdeps/unix/sysv/linux/adjtime.c: Use ADJ_OFFSET_SS_READ if
possible.
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_ADJ_OFFSET_SS_READ): Define for 2.6.24.
* sysdeps/unix/sysv/linux/sys/timex.h (ADJ_OFFSET_SS_READ): Define.

2007-12-08 Ulrich Drepper <drepper@redhat.com>

[BZ #5424]
Expand Down
24 changes: 21 additions & 3 deletions sysdeps/unix/sysv/linux/adjtime.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997, 1998, 2002, 2004
/* Copyright (C) 1995, 1996, 1997, 1998, 2002, 2004, 2007
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Expand All @@ -22,6 +22,8 @@
#include <sys/time.h>
#include <sys/timex.h>

#include <kernel-features.h>

#define MAX_SEC (INT_MAX / 1000000L - 2)
#define MIN_SEC (INT_MIN / 1000000L + 2)

Expand Down Expand Up @@ -69,13 +71,29 @@ ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv)
return -1;
}
tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L;
#ifdef ADJ_OFFSET_SS_READ
tntx.modes = ADJ_OFFSET_SS_READ;
#else
tntx.modes = ADJ_OFFSET_SINGLESHOT;
#endif
}
else
tntx.modes = 0;

if (ADJTIMEX (&tntx) < 0)
return -1;
#if defined ADJ_OFFSET_SS_READ && !defined __ASSUME_ADJ_OFFSET_SS_READ
again:
#endif
if (__builtin_expect (ADJTIMEX (&tntx) < 0, 0))
{
#if defined ADJ_OFFSET_SS_READ && !defined __ASSUME_ADJ_OFFSET_SS_READ
if (itv && errno == EINVAL && tntx.modes == ADJ_OFFSET_SS_READ)
{
tntx.modes = ADJ_OFFSET_SINGLESHOT;
goto again;
}
#endif
return -1;
}

if (otv)
{
Expand Down
5 changes: 5 additions & 0 deletions sysdeps/unix/sysv/linux/kernel-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -487,3 +487,8 @@
|| (__LINUX_KERNEL_VERSION >= 0x020618 && defined __s390__))
# define __ASSUME_FALLOCATE 1
#endif

/* Support for ADJ_OFFSET_SS_READ was added in 2.6.24. */
#if __LINUX_KERNEL_VERSION >= 0x020618
# define __ASSUME_ADJ_OFFSET_SS_READ 1
#endif
3 changes: 2 additions & 1 deletion sysdeps/unix/sysv/linux/sys/timex.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1995, 1996, 1997, 1999, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Expand Down Expand Up @@ -69,6 +69,7 @@ struct timex
#define ADJ_TIMECONST 0x0020 /* pll time constant */
#define ADJ_TICK 0x4000 /* tick value */
#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime */
#define ADJ_OFFSET_SS_READ 0xa001 /* read-only adjtime */

/* xntp 3.4 compatibility names */
#define MOD_OFFSET ADJ_OFFSET
Expand Down

0 comments on commit ae18718

Please sign in to comment.