[armedbear-cvs] r12059 - trunk/abcl/src/org/armedbear/lisp

Erik Huelsmann ehuelsmann at common-lisp.net
Fri Jul 24 22:05:37 UTC 2009


Author: ehuelsmann
Date: Fri Jul 24 18:05:31 2009
New Revision: 12059

Log:
Lisp-side implementation for ThreadLock and Mailbox,
both put in threads.lisp.

Added:
   trunk/abcl/src/org/armedbear/lisp/threads.lisp   (contents, props changed)
Removed:
   trunk/abcl/src/org/armedbear/lisp/Mailbox.java
   trunk/abcl/src/org/armedbear/lisp/ThreadLock.java
   trunk/abcl/src/org/armedbear/lisp/with-thread-lock.lisp
Modified:
   trunk/abcl/src/org/armedbear/lisp/Autoload.java
   trunk/abcl/src/org/armedbear/lisp/autoloads.lisp

Modified: trunk/abcl/src/org/armedbear/lisp/Autoload.java
==============================================================================
--- trunk/abcl/src/org/armedbear/lisp/Autoload.java	(original)
+++ trunk/abcl/src/org/armedbear/lisp/Autoload.java	Fri Jul 24 18:05:31 2009
@@ -492,11 +492,6 @@
         autoload(PACKAGE_EXT, "file-directory-p", "probe_file", true);
         autoload(PACKAGE_EXT, "gc", "gc", true);
         autoload(PACKAGE_EXT, "get-floating-point-modes", "FloatFunctions", true);
-        autoload(PACKAGE_EXT, "mailbox-empty-p", "Mailbox", true);
-        autoload(PACKAGE_EXT, "mailbox-peek", "Mailbox", true);
-        autoload(PACKAGE_EXT, "mailbox-read", "Mailbox", true);
-        autoload(PACKAGE_EXT, "mailbox-send", "Mailbox", true);
-        autoload(PACKAGE_EXT, "make-mailbox", "Mailbox", true);
         autoload(PACKAGE_EXT, "make-slime-input-stream", "SlimeInputStream", true);
         autoload(PACKAGE_EXT, "make-slime-output-stream", "SlimeOutputStream", true);
         autoload(PACKAGE_EXT, "probe-directory", "probe_file", true);
@@ -673,9 +668,6 @@
         autoload(PACKAGE_THREADS, "make-mutex", "Mutex", true);
         autoload(PACKAGE_THREADS, "get-mutex", "Mutex", true);
         autoload(PACKAGE_THREADS, "release-mutex", "Mutex", true);
-        autoload(PACKAGE_THREADS, "make-thread-lock", "ThreadLock", true);
-        autoload(PACKAGE_THREADS, "thread-lock", "ThreadLock", true);
-        autoload(PACKAGE_THREADS, "thread-unlock", "ThreadLock", true);
 
         autoload(Symbol.COPY_LIST, "copy_list");
 

Modified: trunk/abcl/src/org/armedbear/lisp/autoloads.lisp
==============================================================================
--- trunk/abcl/src/org/armedbear/lisp/autoloads.lisp	(original)
+++ trunk/abcl/src/org/armedbear/lisp/autoloads.lisp	Fri Jul 24 18:05:31 2009
@@ -291,6 +291,26 @@
 (export 'socket-peer-address)
 (autoload 'socket-peer-address "socket")
 
+(in-package "THREADS")
+(sys::export '(mailbox-send mailbox-empty-p mailbox-read mailbox-peek))
+(sys::autoload '(mailbox-send mailbox-empty-p mailbox-read mailbox-peek)
+    "threads")
+
+(sys::export '(make-thread-lock thread-lock thread-unlock with-thread-lock))
+(sys::autoload '(make-thread-lock thread-lock thread-unlock) "threads")
+(sys::autoload-macro 'with-thread-lock "threads")
+
+;; block to be removed at 0.22
+
+(in-package "EXTENSIONS")
+
+(export '(mailbox-send mailbox-empty-p mailbox-read mailbox-peek))
+(export '(make-thread-lock thread-lock thread-unlock with-thread-lock))
+
+;; end of 0.22 block
+
+(in-package "EXTENSIONS")
+
 (export '(grovel-java-definitions compile-system))
 (autoload '(grovel-java-definitions compile-system) "compile-system")
 (export 'aver)

Added: trunk/abcl/src/org/armedbear/lisp/threads.lisp
==============================================================================
--- (empty file)
+++ trunk/abcl/src/org/armedbear/lisp/threads.lisp	Fri Jul 24 18:05:31 2009
@@ -0,0 +1,103 @@
+;;; threads.lisp
+;;;
+;;; Copyright (C) 2009 Erik Huelsmann <ehuelsmann at common-lisp.net>
+;;;
+;;; $Id$
+;;;
+;;; 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
+;;; of the License, 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+;;;
+;;; As a special exception, the copyright holders of this library give you
+;;; permission to link this library with independent modules to produce an
+;;; executable, regardless of the license terms of these independent
+;;; modules, and to copy and distribute the resulting executable under
+;;; terms of your choice, provided that you also meet, for each linked
+;;; independent module, the terms and conditions of the license of that
+;;; module.  An independent module is a module which is not derived from
+;;; or based on this library.  If you modify this library, you may extend
+;;; this exception to your version of the library, but you are not
+;;; obligated to do so.  If you do not wish to do so, delete this
+;;; exception statement from your version.
+
+(in-package #:threads)
+
+
+;;
+;; Mailbox implementation
+;;
+
+;; this export statement is also in autoloads.lisp
+(export '(mailbox-send mailbox-empty-p mailbox-read mailbox-peek))
+
+(defstruct mailbox
+  queue)
+
+(defun mailbox-send (mailbox item)
+  "Sends an item into the mailbox, notifying 1 waiter
+to wake up for retrieval of that object."
+  (threads:synchronized-on mailbox
+     (push (mailbox-queue mailbox) item)
+     (threads:object-notify mailbox)))
+
+(defun mailbox-empty-p (mailbox)
+  "Returns non-NIL if the mailbox can be read from, NIL otherwise."
+  ;; Because we're just checking the value of an object reference,
+  ;; (which are atomically gotten and set) we don't need to lock
+  ;; the mailbox before operating on it.
+  (null (mailbox-queue mailbox)))
+
+(defun mailbox-read (mailbox)
+  "Blocks on the mailbox until an item is available for reading.
+When an item is available, it is returned."
+  (threads:synchronized-on mailbox
+     (loop
+        (unless (mailbox-empty-p mailbox)
+          (return))
+        (object-wait mailbox))
+     (pop (mailbox-queue mailbox))))
+
+(defun mailbox-peek (mailbox)
+  "Returns two values. The second returns non-NIL when the mailbox
+is empty. The first is the next item to be read from the mailbox
+if the first is NIL.
+
+Note that due to multi-threading, the first value returned upon
+peek, may be different from the one returned upon next read in the
+calling thread."
+  (threads:synchronized-on mailbox
+     (values (car (mailbox-queue mailbox))
+             (null (mailbox-queue mailbox)))))
+
+
+
+;;
+;; Lock implementation
+;;
+
+(defun make-thread-lock ()
+  "Returns an object to be used with the `with-thread-lock' macro."
+  (gensym))
+
+(defmacro with-thread-lock ((lock) &body body)
+  (let ((glock (gensym)))
+    `(let ((,glock ,lock))
+       (synchronized-on ,glock
+          , at body))))
+
+(defun thread-lock (lock)
+  "Deprecated; due for removal in 0.22"
+  (declare (ignore lock)))
+(defun thread-unlock (lock)
+  "Deprecated; due for removal in 0.22"
+  (declare (ignore lock)))




More information about the armedbear-cvs mailing list