init.scm 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ; System entry and exit
  3. ; Entry point from OS executive. Procedures returned by USUAL-RESUMER
  4. ; are suitable for use as the second argument to WRITE-IMAGE.
  5. ;
  6. ; The placement of INITIALIZE-RECORDS! is questionable. Important parts
  7. ; of the system are not in place when it is run.
  8. (define (make-usual-resumer warn-about-undefined-imported-bindings?
  9. entry-point)
  10. ;; The argument list needs to be in sync with
  11. ;; S48-CALL-STARTUP-PROCEDURE in vm/interp/resume.scm, and
  12. ;; MAKE-STARTUP-PROCEDURE in bcomp/comp.scm.
  13. (lambda (resume-arg
  14. in in-encoding out out-encoding error error-encoding
  15. records)
  16. (initialize-rts in in-encoding out out-encoding error error-encoding
  17. (lambda ()
  18. (initialize-os-string-text-codec!)
  19. (run-initialization-thunks)
  20. (initialize-records! records)
  21. (if warn-about-undefined-imported-bindings?
  22. (warn-about-undefined-imported-bindings))
  23. (entry-point
  24. (map byte-vector->os-string
  25. (vector->list resume-arg)))))))
  26. (define (usual-resumer entry-point)
  27. (make-usual-resumer #t entry-point))
  28. (define (warn-about-undefined-imported-bindings)
  29. (let ((undefined-bindings (find-undefined-imported-bindings)))
  30. (do ((size (vector-length undefined-bindings))
  31. (i 0 (+ 1 i)))
  32. ((= i size))
  33. (debug-message "undefined imported binding "
  34. (shared-binding-name (vector-ref undefined-bindings i))))))
  35. (define (initialize-rts in in-encoding out out-encoding error error-encoding
  36. thunk)
  37. (initialize-session-data!)
  38. (initialize-dynamic-state!)
  39. (initialize-exceptions!
  40. (lambda ()
  41. (initialize-interrupts!
  42. spawn-on-root
  43. (lambda ()
  44. (initialize-external-events!)
  45. (let ((in-port (input-channel->port in))
  46. (out-port (output-channel->port out))
  47. (error-port (output-channel->port error 0))) ; zero-length buffer
  48. (set-encoding! in-port in-encoding)
  49. (set-encoding! out-port out-encoding)
  50. (set-encoding! error-port error-encoding)
  51. (initialize-i/o
  52. in-port out-port error-port
  53. (lambda ()
  54. (with-threads
  55. (lambda ()
  56. (root-scheduler thunk
  57. 200 ; thread quantum, in msec
  58. 300))))))))))) ; port-flushing quantum
  59. ; Leave the default if we can't find a suitable codec
  60. (define (set-encoding! port encoding)
  61. (cond
  62. ((find-text-codec encoding) =>
  63. (lambda (codec)
  64. (set-port-text-codec! port codec)))))
  65. ; This is primarily for LOAD-DYNAMIC-EXTERNALS; we don't want to
  66. ; refer to it directly here, because that would increase the size of
  67. ; the image by 100k.
  68. ; Use this with care: no efforts are being made to remove duplicates.
  69. (define *initialization-thunks* '())
  70. (define (add-initialization-thunk! thunk)
  71. (set! *initialization-thunks*
  72. (cons thunk *initialization-thunks*)))
  73. (define (run-initialization-thunks)
  74. (for-each (lambda (thunk) (thunk))
  75. *initialization-thunks*))
  76. ; Add the full/empty buffer handlers.
  77. (initialize-i/o-handlers! define-vm-exception-handler signal-vm-exception)