[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 4733d1e 001/187: Initial revision
From: |
Michael Albinus |
Subject: |
[elpa] master 4733d1e 001/187: Initial revision |
Date: |
Wed, 30 Dec 2015 11:49:19 +0000 |
branch: master
commit 4733d1e426f16190a8f5281dbcea0c90294fdfad
Author: John Wiegley <address@hidden>
Commit: John Wiegley <address@hidden>
Initial revision
---
README.md | 14 +++++++++
emacs-async.el | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+), 0 deletions(-)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2793ae4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+# emacs-async
+
+Adds the ability to process Lisp concurrently, with a very simple syntax:
+
+ (emacs-async-fork
+ ;; What to do in the child process
+ (lambda ()
+ (message "This is a test")
+ (sleep-for 3)
+ async-sample-variable)
+
+ ;; What to do when it finishes
+ (lambda (result)
+ (message "Async process done, result should be 222: %d" result)))
diff --git a/emacs-async.el b/emacs-async.el
new file mode 100644
index 0000000..d3af622
--- /dev/null
+++ b/emacs-async.el
@@ -0,0 +1,88 @@
+;;; -*- lexical-binding: t -*-
+;;; emacs-async --- True asynchronous processing in Emacs
+
+;; Copyright (C) 2012 John Wiegley
+
+;; Author: John Wiegley <address@hidden>
+;; Created: 18 Jun 2012
+;; Version: 1.0
+;; Keywords: async
+;; X-URL: https://github.com/jwiegley/emacs-async
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Adds the ability to process Lisp concurrently, with a very simple syntax:
+;;
+;; (emacs-async-fork
+;; ;; What to do in the child process
+;; (lambda ()
+;; (message "This is a test")
+;; (sleep-for 3)
+;; async-sample-variable)
+;;
+;; ;; What to do when it finishes
+;; (lambda (result)
+;; (message "Async process done, result should be 222: %d" result)))
+
+(defgroup emacs-async nil
+ "Simple asynchronous processing in Emacs"
+ :group 'emacs)
+
+(defvar emacs-async-callback)
+
+(defun emacs-async-when-done (proc &optional change)
+ (when (eq 'exit (process-status proc))
+ (if (= 0 (process-exit-status proc))
+ (with-current-buffer (process-buffer proc)
+ (goto-char (point-max))
+ (backward-sexp)
+ (funcall emacs-async-callback (read (current-buffer)))
+ ;;(kill-buffer (current-buffer))
+ )
+ (error "Async Emacs process failed with exit code %d"
+ (process-exit-status proc)))))
+
+(defun emacs-async-batch-invoke ()
+ (with-temp-buffer
+ (insert (nth 5 command-line-args))
+ (goto-char (point-min))
+ ;; Strip out the binding to `buf', as it is unreadable
+ (while (re-search-forward "(buf \\. #<[^)]+)" nil t)
+ (delete-region (match-beginning 0) (match-end 0)))
+ (goto-char (point-min))
+ (prin1 (funcall (eval (read (current-buffer)))))))
+
+(defmacro emacs-async-fork (start-func &optional finish-func)
+ (let ((bufvar (make-symbol "buf"))
+ (procvar (make-symbol "proc")))
+ (require 'find-func)
+ `(let* ((,bufvar (generate-new-buffer "*emacs*"))
+ (,procvar
+ (start-process "emacs" ,bufvar
+ (expand-file-name invocation-name
+ invocation-directory)
+ "-Q" "-l" (find-library-name "emacs-async")
+ "-batch" "-f" "emacs-async-batch-invoke"
+ (prin1-to-string (list 'quote ,start-func)))))
+ (with-current-buffer ,bufvar
+ (set (make-local-variable 'emacs-async-callback) ,finish-func)
+ (set-process-sentinel ,procvar #'emacs-async-when-done)))))
+
+(provide 'emacs-async)
+
+;;; emacs-async.el ends here
- [elpa] master updated (e053cef -> ef4a542), Michael Albinus, 2015/12/30
- [elpa] master 6647749 002/187: Small change, Michael Albinus, 2015/12/30
- [elpa] master 8d37c00 004/187: Added note to README, Michael Albinus, 2015/12/30
- [elpa] master 4733d1e 001/187: Initial revision,
Michael Albinus <=
- [elpa] master 3d388c6 007/187: Added support for signal propagation, Michael Albinus, 2015/12/30
- [elpa] master 0a7f3dd 008/187: Added async-inject-environment, Michael Albinus, 2015/12/30
- [elpa] master 954c865 006/187: Updated README, Michael Albinus, 2015/12/30
- [elpa] master a8ac820 003/187: Renamed emacs-async.el to async.el, Michael Albinus, 2015/12/30
- [elpa] master 63fe7ee 010/187: Updated README, Michael Albinus, 2015/12/30
- [elpa] master c48d3db 009/187: Added smtpmail-async.el, Michael Albinus, 2015/12/30
- [elpa] master 728e791 005/187: Added dired-async, Michael Albinus, 2015/12/30
- [elpa] master 628a295 014/187: Send data over a pipe, rather than in an argument, Michael Albinus, 2015/12/30
- [elpa] master 190a040 012/187: Fixed async-smtpmail-send-it, Michael Albinus, 2015/12/30
- [elpa] master 4fb51ce 013/187: Corrected a problem with async deletions, Michael Albinus, 2015/12/30