[movitz-cvs] CVS update: movitz/losp/lib/threading.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Thu May 5 15:21:59 UTC 2005


Update of /project/movitz/cvsroot/movitz/losp/lib
In directory common-lisp.net:/tmp/cvs-serv24227

Modified Files:
	threading.lisp 
Log Message:
*** empty log message ***
Date: Thu May  5 17:21:59 2005
Author: ffjeld

Index: movitz/losp/lib/threading.lisp
diff -u movitz/losp/lib/threading.lisp:1.1 movitz/losp/lib/threading.lisp:1.2
--- movitz/losp/lib/threading.lisp:1.1	Fri Apr 29 00:05:02 2005
+++ movitz/losp/lib/threading.lisp	Thu May  5 17:21:59 2005
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Thu Apr 28 08:30:01 2005
 ;;;;                
-;;;; $Id: threading.lisp,v 1.1 2005/04/28 22:05:02 ffjeld Exp $
+;;;; $Id: threading.lisp,v 1.2 2005/05/05 15:21:59 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -18,11 +18,16 @@
 
 (defpackage threading
   (:use cl muerte)
-  (:export make-thread
+  (:export thread
+	   make-thread
 	   yield
 	   ))
 
-(in-package threading)
+(in-package muerte)
+
+(defclass thread (run-time-context)
+  ()
+  (:metaclass run-time-context-class))
 
 (defmacro control-stack-ebp (stack)
   `(stack-frame-ref ,stack 0 0))
@@ -46,6 +51,18 @@
     (control-stack-push function stack))
   stack)
 
+(defun control-stack-fixate (stack)
+  (let ((stack-base (+ 2 (object-location stack))))
+    (do ((frame (control-stack-ebp stack)))
+	((zerop (stack-frame-uplink stack frame)))
+      (assert (typep (stack-frame-funobj stack frame) 'function))
+      (let ((previous-frame frame))
+	(setf frame (stack-frame-uplink stack frame))
+	(incf (stack-frame-ref stack previous-frame 0)
+	      stack-base)))
+    (values (+ (control-stack-ebp stack) stack-base)
+	    (+ (control-stack-esp stack) stack-base))))	       
+
 (defun stack-bootstrapper (&rest ignore)
   "Control stacks are initialized with this function as their initial frame."
   (declare (ignore ignore))
@@ -57,7 +74,7 @@
       (check-type args list)
       (apply function args)))
   (error "Nothing left to do for ~S." (current-run-time-context))
-  (loop (halt-cpu)))
+  (loop (halt-cpu)))			; just to make sure
 
 (defun control-stack-init-for-yield (stack function args)
   "Make it so that a yield to stack will cause function to be applied to args."
@@ -79,7 +96,7 @@
   (let* ((fs-index 8) ; a vacant spot in the global segment descriptor table..
 	 (fs (* 8 fs-index))
 	 (thread (muerte::clone-run-time-context :name name))
-	 (segment-descriptor-table (symbol-value 'muerte.init::*segment-descriptor-table*)))
+	 (segment-descriptor-table nil #+ignore (symbol-value 'muerte.init::*segment-descriptor-table*)))
     (setf (segment-descriptor segment-descriptor-table fs-index)
       (segment-descriptor segment-descriptor-table (truncate (segment-register :fs) 8)))
     (setf (segment-descriptor-base-location segment-descriptor-table fs-index)
@@ -114,8 +131,8 @@
 	  (ebp (control-stack-ebp target-stack)))
       (assert (location-in-object-p target-stack esp))
       (assert (location-in-object-p target-stack ebp))
-      (assert (eq (stack-frame-funobj nil ebp)
-		  (asm-register :esi)) ()
+      (assert (eq (muerte::stack-frame-funobj nil ebp)
+		  (muerte::asm-register :esi)) ()
 	"Will not yield to a non-yield frame.")
       ;; Push eflags for later..
       (setf (memref (decf esp) 0) (eflags))
@@ -124,8 +141,8 @@
 	    (%run-time-context-slot 'scratch2 target-rtc) esp)
       ;; Enable someone to yield back here..
       (setf (control-stack-fs my-stack) (segment-register :fs)
-	    (control-stack-ebp my-stack) (asm-register :ebp)
-	    (control-stack-esp my-stack) (asm-register :esp))
+	    (control-stack-ebp my-stack) (muerte::asm-register :ebp)
+	    (control-stack-esp my-stack) (muerte::asm-register :esp))
       (with-inline-assembly (:returns :eax)
 	(:load-lexical (:lexical-binding fs) :untagged-fixnum-ecx)
 	(:load-lexical (:lexical-binding value) :eax)
@@ -133,4 +150,4 @@
 	(:movw :cx :fs)
 	(:locally (:movl (:edi (:edi-offset scratch1)) :ebp))
 	(:locally (:movl (:edi (:edi-offset scratch2)) :esp))
-	(:popfl)))))
\ No newline at end of file
+	(:popfl)))))




More information about the Movitz-cvs mailing list