diff options
| author | Philipp Stephani | 2020-03-26 17:22:25 +0100 |
|---|---|---|
| committer | Philipp Stephani | 2020-03-26 21:47:25 +0100 |
| commit | d28b00476890f791a89b65007e5f20682b3eaa0d (patch) | |
| tree | 3bb04c984ed5b74e661291b71579fe8d04070f69 /test/src | |
| parent | 934b3c9ecc2b91723b9e5826080424ec1a90f264 (diff) | |
| download | emacs-d28b00476890f791a89b65007e5f20682b3eaa0d.tar.gz emacs-d28b00476890f791a89b65007e5f20682b3eaa0d.zip | |
Add a module function to open a file descriptor connected to a pipe.
A common complaint about the module API is that modules can't
communicate asynchronously with Emacs. While it isn't possible to
call arbitrary Emacs functions asynchronously, writing to a pipe
should always be fine and is a pretty low-hanging fruit.
This patch implements a function that adapts an existing pipe
process. That way, users can use familiar tools like process filters
or 'accept-process-output'.
* src/module-env-28.h: Add 'open_channel' module function.
* src/emacs-module.c (module_open_channel): Provide definition for
'open_channel'.
(initialize_environment): Use it.
* src/process.c (open_channel_for_module): New helper function.
(syms_of_process): Define necessary symbol.
* test/src/emacs-module-tests.el (module/async-pipe): New unit test.
* test/data/emacs-module/mod-test.c (signal_system_error): New helper
function.
(signal_errno): Use it.
(write_to_pipe): New function running in the background.
(Fmod_test_async_pipe): New test module function.
(emacs_module_init): Export it.
* doc/lispref/internals.texi (Module Misc): Document new module
function.
* doc/lispref/processes.texi (Asynchronous Processes): New anchor
for pipe processes.
* etc/NEWS: Document 'open_channel' function.
Diffstat (limited to 'test/src')
| -rw-r--r-- | test/src/emacs-module-tests.el | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index 48d2e86a605..1f91795e1e6 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el | |||
| @@ -424,4 +424,18 @@ See Bug#36226." | |||
| 424 | ;; but at least one. | 424 | ;; but at least one. |
| 425 | (should (> valid-after valid-before))))) | 425 | (should (> valid-after valid-before))))) |
| 426 | 426 | ||
| 427 | (ert-deftest module/async-pipe () | ||
| 428 | "Check that writing data from another thread works." | ||
| 429 | (with-temp-buffer | ||
| 430 | (let ((process (make-pipe-process :name "module/async-pipe" | ||
| 431 | :buffer (current-buffer) | ||
| 432 | :coding 'utf-8-unix | ||
| 433 | :noquery t))) | ||
| 434 | (unwind-protect | ||
| 435 | (progn | ||
| 436 | (mod-test-async-pipe process) | ||
| 437 | (should (accept-process-output process 1)) | ||
| 438 | (should (equal (buffer-string) "data from thread"))) | ||
| 439 | (delete-process process))))) | ||
| 440 | |||
| 427 | ;;; emacs-module-tests.el ends here | 441 | ;;; emacs-module-tests.el ends here |