0.8.18.14:
[sbcl.git] / src / code / cold-init.lisp
index acf20fb..db603e9 100644 (file)
@@ -49,7 +49,7 @@
 \f
 ;;;; putting ourselves out of our misery when things become too much to bear
 
-(declaim (ftype (function (simple-string) nil) critically-unreachable))
+(declaim (ftype (function (simple-string) nil) !cold-lose))
 (defun !cold-lose (msg)
   (%primitive print msg)
   (%primitive print "too early in cold init to recover from errors")
@@ -92,8 +92,7 @@
   ;; !UNIX-COLD-INIT. And *TYPE-SYSTEM-INITIALIZED* could be changed to
   ;; *TYPE-SYSTEM-INITIALIZED-WHEN-BOUND* so that it doesn't need to
   ;; be explicitly set in order to be meaningful.
-  (setf *gc-notify-stream* nil
-        *before-gc-hooks* nil
+  (setf *before-gc-hooks* nil
         *after-gc-hooks* nil
        *gc-inhibit* 1
        *need-to-collect-garbage* nil
   ;; this to be initialized, so we initialize it right away.
   (show-and-call !random-cold-init)
 
+  (show-and-call !character-database-cold-init)
+
+  (show-and-call !early-package-cold-init)
   (show-and-call !package-cold-init)
   
   ;; All sorts of things need INFO and/or (SETF INFO).
   (show-and-call !policy-cold-init-or-resanify)
   (/show0 "back from !POLICY-COLD-INIT-OR-RESANIFY")
 
+  (show-and-call !early-proclaim-cold-init)
+  
   ;; KLUDGE: Why are fixups mixed up with toplevel forms? Couldn't
   ;; fixups be done separately? Wouldn't that be clearer and better?
   ;; -- WHN 19991204
            (setf (svref *!load-time-values* (third toplevel-thing))
                  (funcall (second toplevel-thing))))
           (:load-time-value-fixup
-           (setf (sap-ref-32 (second toplevel-thing) 0)
+           (setf (sap-ref-word (second toplevel-thing) 0)
                  (get-lisp-obj-address
                   (svref *!load-time-values* (third toplevel-thing)))))
-          #!+(and x86 gencgc)
+          #!+(and (or x86 x86-64) gencgc)
           (:load-time-code-fixup
            (sb!vm::!envector-load-time-code-fixup (second toplevel-thing)
                                                   (third  toplevel-thing)
   ;; DEFTYPEs are.
   (setf *type-system-initialized* t)
 
+  ;; now that the type system is definitely initialized, fixup UNKNOWN
+  ;; types that have crept in.
+  (show-and-call !fixup-type-cold-init)
+  ;; run the PROCLAIMs.
+  (show-and-call !late-proclaim-cold-init)
+  
   (show-and-call os-cold-init-or-reinit)
 
   (show-and-call stream-cold-init-or-reset)
   (show-and-call !loader-cold-init)
+  (show-and-call !foreign-cold-init)
   (show-and-call signal-cold-init-or-reinit)
+  (/show0 "enabling internal errors")
   (setf (sb!alien:extern-alien "internal_errors_enabled" boolean) t)
 
   ;; FIXME: This list of modes should be defined in one place and
   ;; explicitly shared between here and REINIT.
 
-  ;; Why was this marked #!+alpha?  CMUCL does it here on all architectures
-  (set-floating-point-modes :traps '(:overflow :invalid :divide-by-zero))
+  ;; FIXME: For some unknown reason, NetBSD/x86 won't run with the
+  ;; :invalid trap enabled. That should be fixed, but not today...
+  ;; PEM -- April 5, 2004
+  (set-floating-point-modes
+   :traps '(:overflow #!-netbsd :invalid :divide-by-zero))
 
   (show-and-call !class-finalize)
 
   ;; The show is on.
   (terpri)
   (/show0 "going into toplevel loop")
-  (handling-end-of-the-world 
+  (handling-end-of-the-world
+    (thread-init-or-reinit)
     (toplevel-init)
     (critically-unreachable "after TOPLEVEL-INIT")))
 
-(defun quit (&key recklessly-p
-                 (unix-code 0 unix-code-p)
-                 (unix-status unix-code))
+(defun quit (&key recklessly-p (unix-status 0))
   #!+sb-doc
-  "Terminate the current Lisp. Things are cleaned up (with UNWIND-PROTECT
-  and so forth) unless RECKLESSLY-P is non-NIL. On UNIX-like systems,
-  UNIX-STATUS is used as the status code."
-  (declare (type (signed-byte 32) unix-status unix-code))
+  "Terminate the current Lisp. Things are cleaned up (with
+UNWIND-PROTECT and so forth) unless RECKLESSLY-P is non-NIL. On
+UNIX-like systems, UNIX-STATUS is used as the status code."
+  (declare (type (signed-byte 32) unix-status))
   (/show0 "entering QUIT")
-  ;; FIXME: UNIX-CODE was deprecated in sbcl-0.6.8, after having been
-  ;; around for less than a year. It should be safe to remove it after
-  ;; a year.
-  (when unix-code-p
-    (warn "The UNIX-CODE argument is deprecated. Use the UNIX-STATUS argument
-instead (which is another name for the same thing)."))
   (if recklessly-p
       (sb!unix:unix-exit unix-status)
       (throw '%end-of-the-world unix-status))
@@ -270,10 +278,14 @@ instead (which is another name for the same thing)."))
 \f
 ;;;; initialization functions
 
+(defun thread-init-or-reinit ()
+  (sb!thread::init-job-control)
+  (sb!thread::get-foreground))
+
 (defun reinit ()
   (without-interrupts
     (without-gcing
-      (os-cold-init-or-reinit)
+       (os-cold-init-or-reinit)
       (stream-reinit)
       (signal-cold-init-or-reinit)
       (setf (sb!alien:extern-alien "internal_errors_enabled" boolean) t)
@@ -281,19 +293,20 @@ instead (which is another name for the same thing)."))
       ;; LEAST-NEGATIVE-SINGLE-FLOAT, so the :UNDERFLOW exceptions are
       ;; disabled by default. Joe User can explicitly enable them if
       ;; desired.
-      (set-floating-point-modes :traps '(:overflow :invalid :divide-by-zero))
-
-      ;; Clear pseudo atomic in case this core wasn't compiled with
-      ;; support.
       ;;
-      ;; FIXME: In SBCL our cores are always compiled with support. So
-      ;; we don't need to do this, do we? At least not for this
-      ;; reason.. (Perhaps we should do it anyway in case someone
-      ;; manages to save an image from within a pseudo-atomic-atomic
-      ;; operation?)
-      #!+x86 (setf *pseudo-atomic-atomic* 0)))
-  (gc-on)
-  (gc))
+      ;; see also comment at the previous SET-FLOATING-POINT-MODES
+      ;; call site.
+      (set-floating-point-modes
+       :traps '(:overflow #!-netbsd :invalid :divide-by-zero))
+      (sb!thread::maybe-install-futex-functions)))
+  (thread-init-or-reinit)
+  (gc-reinit)
+  ;; make sure TIME works correctly from saved cores
+  (setf *internal-real-time-base-seconds* nil)
+  (foreign-reinit)
+  (dolist (hook *init-hooks*)
+    (with-simple-restart (continue "Skip this initialization hook.")
+      (funcall hook))))
 \f
 ;;;; some support for any hapless wretches who end up debugging cold
 ;;;; init code
@@ -304,7 +317,7 @@ instead (which is another name for the same thing)."))
 (defun hexstr (thing)
   (/noshow0 "entering HEXSTR")
   (let ((addr (get-lisp-obj-address thing))
-       (str (make-string 10)))
+       (str (make-string 10 :element-type 'base-char)))
     (/noshow0 "ADDR and STR calculated")
     (setf (char str 0) #\0
          (char str 1) #\x)