[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/sweeprolog 77846f0441 05/12: ADDED: new command for signal
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/sweeprolog 77846f0441 05/12: ADDED: new command for signaling Prolog top-level threads |
Date: |
Thu, 6 Oct 2022 02:59:33 -0400 (EDT) |
branch: elpa/sweeprolog
commit 77846f044122520f4e6c97fd8c48294280e71311
Author: Eshel Yaron <me@eshelyaron.com>
Commit: Eshel Yaron <me@eshelyaron.com>
ADDED: new command for signaling Prolog top-level threads
* sweep.pl: sweep_thread_signal/2: new predicate.
* sweeprolog.el:
- sweeprolog-signal-thread: new function, Elisp interface for
sweep_thread_signal/2.
- sweeprolog-top-level-thread-id: new buffer-local variable in
sweeprolog-top-level buffers.
- sweeprolog-top-level-signal: new command.
- sweeprolog-top-level-mode: signal top-level thread with
thread_exit/1 when buffer is killed.
---
sweep.pl | 10 ++++++++++
sweeprolog.el | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/sweep.pl b/sweep.pl
index b119f9c5ae..4a1d376101 100644
--- a/sweep.pl
+++ b/sweep.pl
@@ -56,6 +56,7 @@
sweep_op_info/2,
sweep_imenu_index/2,
sweep_module_path/2,
+ sweep_thread_signal/2,
sweep_top_level_server/2,
sweep_top_level_threads/2,
sweep_accept_top_level_client/2,
@@ -842,5 +843,14 @@ sweep_top_level_client(InStream, OutStream, _) :-
thread_property(Self, id(Id)),
retractall(sweep_top_level_thread_buffer(Id, _)).
+%! sweep_accept_top_level_client(+Buffer, -Result) is det.
+%
+% Signal the top-level server thread to accept a new TCP connection
+% from buffer Buffer.
+
sweep_accept_top_level_client(Buffer, _) :-
thread_send_message(sweep_top_level_server, accept(Buffer)).
+
+sweep_thread_signal([ThreadId|Goal0], _) :-
+ term_string(Goal, Goal0),
+ thread_signal(ThreadId, Goal).
diff --git a/sweeprolog.el b/sweeprolog.el
index c6c1cb4c94..bd9a9b78fc 100644
--- a/sweeprolog.el
+++ b/sweeprolog.el
@@ -1541,6 +1541,45 @@ Interactively, a prefix arg means to prompt for BUFFER."
(comint-send-input)))))
(defvar-local sweeprolog-top-level-timer nil "Buffer-local timer.")
+(defvar-local sweeprolog-top-level-thread-id nil
+ "Prolog top-level thread ID corresponding to this buffer.")
+
+(defun sweeprolog-top-level--populate-thread-id ()
+ (sweeprolog-open-query "user"
+ "sweep"
+ "sweep_top_level_thread_buffer"
+ (buffer-name)
+ t)
+ (let ((sol (sweeprolog-next-solution)))
+ (sweeprolog-close-query)
+ (when (sweeprolog-true-p sol)
+ (setq sweeprolog-top-level-thread-id (cdr sol)))))
+
+(defun sweeprolog-signal-thread (tid goal)
+ (sweeprolog-open-query "user"
+ "sweep"
+ "sweep_thread_signal"
+ (cons tid goal))
+ (let ((sol (sweeprolog-next-solution)))
+ (sweeprolog-close-query)
+ sol))
+
+(defun sweeprolog-top-level-signal (buffer goal)
+ "Signal the top-level thread corresponding to BUFFER to run GOAL."
+ (interactive
+ (list (read-buffer "Top-level buffer: "
+ nil t
+ (lambda (b)
+ (let ((bb (or (and (consp b) (car b)) b)))
+ (with-current-buffer bb
+ (and (derived-mode-p 'sweeprolog-top-level-mode)
+ sweeprolog-top-level-thread-id)))
+ (eq 'sweeprolog-top-level-mode
+ (buffer-local-value 'major-mode b))))
+ (read-string "Signal goal: ?- ")))
+ (sweeprolog-signal-thread (buffer-local-value 'sweeprolog-top-level-thread-id
+ buffer)
+ goal))
;;;###autoload
(define-derived-mode sweeprolog-top-level-mode comint-mode "sweep Top-level"
@@ -1554,14 +1593,21 @@ Interactively, a prefix arg means to prompt for BUFFER."
(length s)))
comint-delimiter-argument-list '(?,)
comment-start "%")
+ (add-hook 'comint-exec-hook #'sweeprolog-top-level--populate-thread-id nil t)
(add-hook 'post-self-insert-hook
#'sweeprolog-top-level--post-self-insert-function nil t)
(setq sweeprolog-buffer-module "user")
(add-hook 'completion-at-point-functions
#'sweeprolog-completion-at-point-function nil t)
(setq sweeprolog-top-level-timer (run-with-idle-timer 0.2 t
#'sweeprolog-colourise-query (current-buffer)))
+ (add-hook 'kill-buffer-hook
+ (lambda ()
+ (sweeprolog-top-level-signal (current-buffer)
+ "thread_exit(0)"))
+ nil t)
(add-hook 'kill-buffer-hook
(lambda ()
(when (timerp sweeprolog-top-level-timer)
- (cancel-timer sweeprolog-top-level-timer)))))
+ (cancel-timer sweeprolog-top-level-timer)))
+ nil t))
(sweeprolog--ensure-module)
(when sweeprolog-init-on-load (sweeprolog-init))
- [nongnu] elpa/sweeprolog updated (c1eac3d1ac -> 47cec7fd85), ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 5fda5e16bd 02/12: NEWS.org: announce sweeprolog-document-predicate-at-point, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 6d8659a1ff 03/12: ADDED: sweep Top-level Menu for listing Prolog top-levels, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 5913f010b6 07/12: ADDED: new command for signaling the current top-level, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 77846f0441 05/12: ADDED: new command for signaling Prolog top-level threads,
ELPA Syncer <=
- [nongnu] elpa/sweeprolog c0d8189056 06/12: FIXED: top-level buffer to thread synchronization, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog e82fd5ce12 01/12: README.org: fix typos, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 9773817648 11/12: Announce recent changes in NEWS.org, bump version to 0.5.0, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 47cec7fd85 12/12: DOC: add manual sections "Contributing" and "Things to do", ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog f40dcff155 04/12: FIXED: reverse args modes in sweeprolog-document-predicate-at-point, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 51139ad178 08/12: ADDED: new command for signaling a top-level from the Top-level Menu, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 39bab049b1 10/12: DOC: describe the Top-level Menu and signaling in the manual, ELPA Syncer, 2022/10/06
- [nongnu] elpa/sweeprolog 4754971669 09/12: ADDED: key and menu bindings for sweeprolog-list-top-levels, ELPA Syncer, 2022/10/06