Improve time stamp handling, and be more consistent about it.
This implements a suggestion made in: http://lists.gnu.org/archive/html/emacs-devel/2014-10/msg00587.html Among other things, this means timer.el no longer needs to autoload the time-date module. * doc/lispref/os.texi (Time of Day, Time Conversion, Time Parsing) (Processor Run Time, Time Calculations): Document the new behavior, plus be clearer about the old behavior. (Idle Timers): Take advantage of new functionality. * etc/NEWS: Document the changes. * lisp/allout-widgets.el (allout-elapsed-time-seconds): Doc fix. * lisp/arc-mode.el (archive-ar-summarize): * lisp/calendar/time-date.el (seconds-to-time, days-to-time, time-since): * lisp/emacs-lisp/timer.el (timer-relative-time, timer-event-handler) (run-at-time, with-timeout-suspend, with-timeout-unsuspend): * lisp/net/tramp.el (tramp-time-less-p, tramp-time-subtract): * lisp/proced.el (proced-time-lessp): * lisp/timezone.el (timezone-time-from-absolute): * lisp/type-break.el (type-break-schedule, type-break-time-sum): Simplify by using new functionality. * lisp/calendar/cal-dst.el (calendar-next-time-zone-transition): Do not return time values in obsolete and undocumented (HI . LO) format; use (HI LO) instead. * lisp/calendar/time-date.el (with-decoded-time-value): Treat 'nil' as current time. This is mostly for XEmacs. (encode-time-value, with-decoded-time-value): Obsolete. (time-add, time-subtract, time-less-p): Use no-op autoloads, for XEmacs. Define only if XEmacs, as they're now C builtins in Emacs. * lisp/ldefs-boot.el: Update to match new time-date.el * lisp/proced.el: Do not require time-date. * src/editfns.c (invalid_time): New function. Use it instead of 'error ("Invalid time specification")'. (time_add, time_subtract, time_arith, Ftime_add, Ftime_less_p) (decode_float_time, lisp_to_timespec, lisp_time_struct): New functions. (make_time_tail, make_time): Remove. All uses changed to use new functions or plain list4i. (disassemble_lisp_time): Return effective length if successful. Check that LOW is an integer, if it's combined with other components. (decode_time_components): Decode into struct lisp_time, not struct timespec, so that we can support a wide set of times regardless of whether time_t is signed. Decode plain numbers as seconds since the Epoch, and nil as the current time. (lisp_time_argument, lisp_seconds_argument, Ffloat_time): Reimplement in terms of new functions. (Fencode_time): Just use list2i. (syms_of_editfns): Add time-add, time-subtract, time-less-p. * src/keyboard.c (decode_timer): Don't allow the new formats (floating point or nil) in timers. * src/systime.h (LO_TIME_BITS): New constant. Use it everywhere in place of the magic number '16'. (struct lisp_time): New type. (decode_time_components): Use it. (lisp_to_timespec): New decl.
This commit is contained in:
parent
058f56d24f
commit
0921dbc3ab
19 changed files with 548 additions and 327 deletions
|
@ -125,9 +125,7 @@ of SECS seconds since the epoch. SECS may be a fraction."
|
|||
"Advance TIME by SECS seconds and optionally USECS microseconds
|
||||
and PSECS picoseconds. SECS may be either an integer or a
|
||||
floating point number."
|
||||
(let ((delta (if (floatp secs)
|
||||
(seconds-to-time secs)
|
||||
(list (floor secs 65536) (mod secs 65536)))))
|
||||
(let ((delta secs))
|
||||
(if (or usecs psecs)
|
||||
(setq delta (time-add delta (list 0 0 (or usecs 0) (or psecs 0)))))
|
||||
(time-add time delta)))
|
||||
|
@ -307,8 +305,8 @@ This function is called, by name, directly by the C code."
|
|||
;; perhaps because Emacs was suspended for a long time,
|
||||
;; limit how many times things get repeated.
|
||||
(if (and (numberp timer-max-repeats)
|
||||
(< 0 (timer-until timer (current-time))))
|
||||
(let ((repeats (/ (timer-until timer (current-time))
|
||||
(< 0 (timer-until timer nil)))
|
||||
(let ((repeats (/ (timer-until timer nil)
|
||||
(timer--repeat-delay timer))))
|
||||
(if (> repeats timer-max-repeats)
|
||||
(timer-inc-time timer (* (timer--repeat-delay timer)
|
||||
|
@ -374,13 +372,13 @@ This function returns a timer object which you can use in `cancel-timer'."
|
|||
|
||||
;; Handle numbers as relative times in seconds.
|
||||
(if (numberp time)
|
||||
(setq time (timer-relative-time (current-time) time)))
|
||||
(setq time (timer-relative-time nil time)))
|
||||
|
||||
;; Handle relative times like "2 hours 35 minutes"
|
||||
(if (stringp time)
|
||||
(let ((secs (timer-duration time)))
|
||||
(if secs
|
||||
(setq time (timer-relative-time (current-time) secs)))))
|
||||
(setq time (timer-relative-time nil secs)))))
|
||||
|
||||
;; Handle "11:23pm" and the like. Interpret it as meaning today
|
||||
;; which admittedly is rather stupid if we have passed that time
|
||||
|
@ -486,7 +484,7 @@ The value is a list that the debugger can pass to `with-timeout-unsuspend'
|
|||
when it exits, to make these timers start counting again."
|
||||
(mapcar (lambda (timer)
|
||||
(cancel-timer timer)
|
||||
(list timer (time-subtract (timer--time timer) (current-time))))
|
||||
(list timer (time-subtract (timer--time timer) nil)))
|
||||
with-timeout-timers))
|
||||
|
||||
(defun with-timeout-unsuspend (timer-spec-list)
|
||||
|
@ -495,7 +493,7 @@ The argument should be a value previously returned by `with-timeout-suspend'."
|
|||
(dolist (elt timer-spec-list)
|
||||
(let ((timer (car elt))
|
||||
(delay (cadr elt)))
|
||||
(timer-set-time timer (time-add (current-time) delay))
|
||||
(timer-set-time timer (time-add nil delay))
|
||||
(timer-activate timer))))
|
||||
|
||||
(defun y-or-n-p-with-timeout (prompt seconds default-value)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue