[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 975893b: Don’t assume timersub and gettimeofday
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master 975893b: Don’t assume timersub and gettimeofday |
Date: |
Sat, 23 Feb 2019 17:12:54 -0500 (EST) |
branch: master
commit 975893b229072aa1b5565cc1a73987fa83ed5b21
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Don’t assume timersub and gettimeofday
POSIX does not specify timersub, and marks gettimeofday as
obsolescent. Avoid porting problems by using timespec.h
functions instead.
* src/editfns.c: Include systime.h instead of sys/time.h.
(EXTRA_CONTEXT_FIELDS): Replace start and max_secs with
time_limit. All uses changed. This removes the need to call
gettimeofday or timersub.
* src/term.c (timeval_to_Time): Remove. Replace all uses with ...
(current_Time): ... this new function, removing the need to
call gettimeofday.
---
src/editfns.c | 27 ++++++++++++++++-----------
src/term.c | 20 +++++++-------------
2 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/src/editfns.c b/src/editfns.c
index 8f21f8a..b349bd5 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -20,7 +20,6 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
#include <config.h>
#include <sys/types.h>
-#include <sys/time.h>
#include <stdio.h>
#ifdef HAVE_PWD_H
@@ -48,6 +47,7 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
#include "composite.h"
#include "intervals.h"
#include "ptr-bounds.h"
+#include "systime.h"
#include "character.h"
#include "buffer.h"
#include "window.h"
@@ -1935,8 +1935,7 @@ static unsigned short rbc_quitcounter;
or inserted. */ \
unsigned char *deletions; \
unsigned char *insertions; \
- struct timeval start; \
- double max_secs; \
+ struct timespec time_limit; \
unsigned int early_abort_tests;
#define NOTE_DELETE(ctx, xoff) set_bit ((ctx)->deletions, (xoff))
@@ -2037,6 +2036,17 @@ nil. */)
else
CHECK_FIXNUM (max_costs);
+ struct timespec time_limit = make_timespec (0, -1);
+ if (!NILP (max_secs))
+ {
+ struct timespec
+ tlim = timespec_add (current_timespec (),
+ lisp_time_argument (max_secs)),
+ tmax = make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
+ if (timespec_cmp (tlim, tmax) < 0)
+ time_limit = tlim;
+ }
+
/* Micro-optimization: Casting to size_t generates much better
code. */
ptrdiff_t del_bytes = (size_t) size_a / CHAR_BIT + 1;
@@ -2054,13 +2064,12 @@ nil. */)
.bdiag = buffer + diags + size_b + 1,
.heuristic = true,
.too_expensive = XFIXNUM (max_costs),
- .max_secs = FLOATP (max_secs) ? XFLOAT_DATA (max_secs) : -1.0,
+ .time_limit = time_limit,
.early_abort_tests = 0
};
memclear (ctx.deletions, del_bytes);
memclear (ctx.insertions, ins_bytes);
- gettimeofday (&ctx.start, NULL);
/* compareseq requires indices to be zero-based. We add BEGV back
later. */
bool early_abort = compareseq (0, size_a, 0, size_b, false, &ctx);
@@ -2213,13 +2222,9 @@ buffer_chars_equal (struct context *ctx,
static bool
compareseq_early_abort (struct context *ctx)
{
- if (ctx->max_secs < 0.0)
+ if (ctx->time_limit.tv_nsec < 0)
return false;
-
- struct timeval now, diff;
- gettimeofday (&now, NULL);
- timersub (&now, &ctx->start, &diff);
- return diff.tv_sec + diff.tv_usec / 1000000.0 > ctx->max_secs;
+ return timespec_cmp (ctx->time_limit, current_timespec ()) < 0;
}
diff --git a/src/term.c b/src/term.c
index 7255f56..60ee861 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2435,15 +2435,14 @@ term_mouse_movement (struct frame *frame, Gpm_Event
*event)
return 0;
}
-/* Return the Time that corresponds to T. Wrap around on overflow. */
+/* Return the current time, as a Time value. Wrap around on overflow. */
static Time
-timeval_to_Time (struct timeval const *t)
+current_Time (void)
{
- Time s_1000, ms;
-
- s_1000 = t->tv_sec;
+ struct timespec now = current_timespec ();
+ Time s_1000 = now.tv_sec;
s_1000 *= 1000;
- ms = t->tv_usec / 1000;
+ Time ms = now.tv_nsec / 1000000;
return s_1000 + ms;
}
@@ -2465,8 +2464,6 @@ term_mouse_position (struct frame **fp, int insist,
Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x,
Lisp_Object *y, Time *timeptr)
{
- struct timeval now;
-
*fp = SELECTED_FRAME ();
(*fp)->mouse_moved = 0;
@@ -2475,8 +2472,7 @@ term_mouse_position (struct frame **fp, int insist,
Lisp_Object *bar_window,
XSETINT (*x, last_mouse_x);
XSETINT (*y, last_mouse_y);
- gettimeofday(&now, 0);
- *timeptr = timeval_to_Time (&now);
+ *timeptr = current_Time ();
}
/* Prepare a mouse-event in *RESULT for placement in the input queue.
@@ -2488,7 +2484,6 @@ static Lisp_Object
term_mouse_click (struct input_event *result, Gpm_Event *event,
struct frame *f)
{
- struct timeval now;
int i, j;
result->kind = GPM_CLICK_EVENT;
@@ -2499,8 +2494,7 @@ term_mouse_click (struct input_event *result, Gpm_Event
*event,
break;
}
}
- gettimeofday(&now, 0);
- result->timestamp = timeval_to_Time (&now);
+ result->timestamp = current_Time ();
if (event->type & GPM_UP)
result->modifiers = up_modifier;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 975893b: Don’t assume timersub and gettimeofday,
Paul Eggert <=