From: Ian Kent <raven@themaw.net>
To: Yu Ning <ning.yu@ubuntu.com>
Cc: autofs mailing list <autofs@vger.kernel.org>
Subject: [PATCH v5 2/8] autofs-5.1.1 - use monotonic clock for alarm thread condition wait
Date: Fri, 18 Sep 2015 17:34:34 +0800 [thread overview]
Message-ID: <20150918093433.29311.80065.stgit@pluto.fritz.box> (raw)
In-Reply-To: <20150918092704.29311.84246.stgit@pluto.fritz.box>
From: Yu Ning <ning.yu@ubuntu.com>
The time returned by gettimeofday() is affected by discontinuous jumps
in the system time, so it causes an issue that autofs may not auto
unmount a mount point if system time is manually changed by the system
administrator.
To fix the issue we need to convert to using a monotonic clock source
instead of the clock source used by gettimeofday().
Convert the alarm_handler() to use a monotonic clock source.
Signed-off-by: Yu Ning <ning.yu@ubuntu.com>
---
CHANGELOG | 1 +
lib/alarm.c | 28 ++++++++++++++++++++++------
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 6eb4daf..c7cbc0f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@
- fix error handling of is_mounted().
- Add a mode option for master map entries.
- define monotonic clock helper functions.
+- use monotonic clock for alarm thread condition wait.
21/04/2015 autofs-5.1.1
=======================
diff --git a/lib/alarm.c b/lib/alarm.c
index 0f04ef8..e6a880b 100755
--- a/lib/alarm.c
+++ b/lib/alarm.c
@@ -23,7 +23,7 @@ struct alarm {
};
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+static pthread_cond_t cond;
static LIST_HEAD(alarms);
#define alarm_lock() \
@@ -46,7 +46,7 @@ int alarm_add(struct autofs_point *ap, time_t seconds)
struct list_head *head;
struct list_head *p;
struct alarm *new;
- time_t now = time(NULL);
+ time_t now = monotonic_time(NULL);
time_t next_alarm = 0;
unsigned int empty = 1;
int status;
@@ -175,17 +175,18 @@ static void *alarm_handler(void *arg)
first = list_entry(head->next, struct alarm, list);
- now = time(NULL);
+ now = monotonic_time(NULL);
if (first->time > now) {
- struct timeval usecs;
+ struct timespec nsecs;
+
/*
* Wait for alarm to trigger or a new alarm
* to be added.
*/
- gettimeofday(&usecs, NULL);
+ clock_gettime(CLOCK_MONOTONIC, &nsecs);
expire.tv_sec = first->time;
- expire.tv_nsec = usecs.tv_usec * 1000;
+ expire.tv_nsec = nsecs.tv_nsec;
status = pthread_cond_timedwait(&cond, &mutex, &expire);
if (status && status != ETIMEDOUT)
@@ -212,6 +213,7 @@ int alarm_start_handler(void)
pthread_t thid;
pthread_attr_t attrs;
pthread_attr_t *pattrs = &attrs;
+ pthread_condattr_t condattrs;
int status;
status = pthread_attr_init(pattrs);
@@ -224,8 +226,22 @@ int alarm_start_handler(void)
#endif
}
+ status = pthread_condattr_init(&condattrs);
+ if (status)
+ fatal(status);
+
+ status = pthread_condattr_setclock(&condattrs, CLOCK_MONOTONIC);
+ if (status)
+ fatal(status);
+
+ status = pthread_cond_init(&cond, &condattrs);
+ if (status)
+ fatal(status);
+
status = pthread_create(&thid, pattrs, alarm_handler, NULL);
+ pthread_condattr_destroy(&condattrs);
+
if (pattrs)
pthread_attr_destroy(pattrs);
--
To unsubscribe from this list: send the line "unsubscribe autofs" in
next prev parent reply other threads:[~2015-09-18 9:34 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-18 9:34 [PATCH v5 0/8] Series to change autofs to using a monotonic clock Ian Kent
2015-09-18 9:34 ` [PATCH v5 1/8] autofs-5.1.1 - define monotonic clock helper functions Ian Kent
2015-09-18 9:34 ` Ian Kent [this message]
2015-09-18 9:34 ` [PATCH v5 3/8] autofs-5.1.1 - define pending condition init helper function Ian Kent
2015-09-18 9:34 ` [PATCH v5 4/8] autofs-5.1.1 - use monotonic clock for direct mount condition Ian Kent
2015-09-18 9:34 ` [PATCH v5 5/8] autofs-5.1.1 - use monotonic clock for indirect " Ian Kent
2015-09-18 9:35 ` [PATCH v5 6/8] autofs-5.1.1 - change remaining gettimeofday() to use clock_gettime() Ian Kent
2015-09-18 9:35 ` [PATCH v5 7/8] autofs-5.1.1 - change time() to use monotonic_clock() Ian Kent
2015-09-18 10:12 ` Ning Yu
2015-09-20 2:12 ` Ian Kent
2015-09-18 9:35 ` [PATCH v5 8/8] autofs-5.1.1 - remove unused function elapsed() Ian Kent
2015-09-21 5:25 ` Ning Yu
2015-09-21 8:45 ` Ian Kent
2015-09-18 10:18 ` [PATCH v5 0/8] Series to change autofs to using a monotonic clock Ning Yu
2015-09-20 2:15 ` Ian Kent
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150918093433.29311.80065.stgit@pluto.fritz.box \
--to=raven@themaw.net \
--cc=autofs@vger.kernel.org \
--cc=ning.yu@ubuntu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.