From: Ethan Jackson Date: Thu, 31 Mar 2011 20:46:04 +0000 (-0700) Subject: lib: Create new timer library. X-Git-Tag: v1.1.0~29 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=8650b075065d03db50dac26f33bb0ec3c485d044;p=sliver-openvswitch.git lib: Create new timer library. Scattered throughout the code base we use long integers to implement timers. When the result of timer_msec() is greater than the time stored, we preform some action. This commit creates a new timer library intended to replace these manually managed timers. Code using the timer library will be more obviously correct, and more consistent with other code using the library. --- diff --git a/lib/automake.mk b/lib/automake.mk index 297e89c45..78a45ea23 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -144,6 +144,8 @@ lib_libopenvswitch_a_SOURCES = \ lib/table.h \ lib/tag.c \ lib/tag.h \ + lib/timer.c \ + lib/timer.h \ lib/timeval.c \ lib/timeval.h \ lib/type-props.h \ diff --git a/lib/timer.c b/lib/timer.c new file mode 100644 index 000000000..b640a7be8 --- /dev/null +++ b/lib/timer.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2011 Nicira Networks. + * + * 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. + */ + +#include + +#include "timer.h" + +#include "poll-loop.h" +#include "timeval.h" + +/* Returns the number of milliseconds until 'timer' expires. */ +long long int +timer_msecs_until_expired(const struct timer *timer) +{ + switch (timer->t) { + case LLONG_MAX: return LLONG_MAX; + case LLONG_MIN: return 0; + default: return timer->t - time_msec(); + } +} + +/* Causes poll_block() to wake when 'timer' expires. */ +void +timer_wait(const struct timer *timer) +{ + if (timer->t < LLONG_MAX) { + poll_timer_wait_until(timer->t); + } +} diff --git a/lib/timer.h b/lib/timer.h new file mode 100644 index 000000000..d2bfd86b0 --- /dev/null +++ b/lib/timer.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011 Nicira Networks. + * + * 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. + */ + +#ifndef TIMER_H +#define TIMER_H 1 + +#include + +#include "timeval.h" + +struct timer { + long long int t; +}; + +long long int timer_msecs_until_expired(const struct timer *); +void timer_wait(const struct timer *); + +/* Causes 'timer' to expire when 'duration' milliseconds have passed. + * + * May be used to initialize 'timer'. */ +static inline void +timer_set_duration(struct timer *timer, long long int duration) +{ + timer->t = time_msec() + duration; +} + +/* Causes 'timer' never to expire. + * + * May be used to initialize 'timer'. */ +static inline void +timer_set_infinite(struct timer *timer) +{ + timer->t = LLONG_MAX; +} + +/* Causes 'timer' to expire immediately. + * + * May be used to initialize 'timer'. */ +static inline void +timer_set_expired(struct timer *timer) +{ + timer->t = LLONG_MIN; +} + +/* True if 'timer' had (or will have) expired at 'time'. */ +static inline bool +timer_expired_at(const struct timer *timer, long long int time) +{ + return time >= timer->t; +} + +/* True if 'timer' has expired. */ +static inline bool +timer_expired(const struct timer *timer) +{ + return timer_expired_at(timer, time_msec()); +} + +/* Returns ture if 'timer' will never expire. */ +static inline bool +timer_is_infinite(const struct timer *timer) +{ + return timer->t == LLONG_MAX; +} + +#endif /* timer.h */