<html><body><div style="color:#000; background-color:#fff; font-family:garamond, new york, times, serif;font-size:12pt"><div><span>Interesting.  Thanks.</span></div><div><br></div>  <div style="font-family: garamond, new york, times, serif; font-size: 12pt;"> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div dir="ltr"> <hr size="1">  <font size="2" face="Arial"> <b><span style="font-weight:bold;">From:</span></b> "Petersen, Chris" <CPetersen@cw.bc.ca><br> <b><span style="font-weight: bold;">To:</span></b> Steve Graham <jsgrahamus@yahoo.com> <br><b><span style="font-weight: bold;">Cc:</span></b> "gambit-list@iro.umontreal.ca" <gambit-list@iro.umontreal.ca> <br> <b><span style="font-weight: bold;">Sent:</span></b> Tuesday, September 3, 2013 5:12 PM<br> <b><span style="font-weight: bold;">Subject:</span></b> Re: [gambit-list] lambdanative and remote repl<br> </font> </div> <div
 class="y_msg_container"><br><br>Actually it was the other way around; the development of LambdaNative<br>started on OpenBSD. The very first application, a trial of closed loop<br>drug infusion at a hospital in France, ran on a stripped-down OpenBSD<br>ramdisk image. The motivation for that choice was the simplicity of the <br>OS and the proactive systematic code audits that are performed to meet <br>the project goal of security. Soon after followed mobile projects<br>like the phone oximeter, and that's how LambdaNative became cross-platform.<br><br>Chris<br><br><br>On 2013-09-03, at 2:58 PM, Steve Graham <<a ymailto="mailto:jsgrahamus@yahoo.com" href="mailto:jsgrahamus@yahoo.com">jsgrahamus@yahoo.com</a>> wrote:<br><br>> Why did you choose to port it to OpenBSD?<br>> <br>> From: "Petersen, Chris" <<a ymailto="mailto:CPetersen@cw.bc.ca" href="mailto:CPetersen@cw.bc.ca">CPetersen@cw.bc.ca</a>><br>> To: tcl super dude <<a
 ymailto="mailto:tcleval@gmail.com" href="mailto:tcleval@gmail.com">tcleval@gmail.com</a>>; "<a ymailto="mailto:gambit-list@iro.umontreal.ca" href="mailto:gambit-list@iro.umontreal.ca">gambit-list@iro.umontreal.ca</a>" <<a ymailto="mailto:gambit-list@iro.umontreal.ca" href="mailto:gambit-list@iro.umontreal.ca">gambit-list@iro.umontreal.ca</a>> <br>> Sent: Monday, September 2, 2013 8:54 AM<br>> Subject: Re: [gambit-list] lambdanative and remote repl<br>> <br>> <br>> Thanks for reporting this. The gui eventloop was preempting gambit threads on linux and openbsd. I could not reproduce the problem on other platforms. Fixed in lambdanative commit 0db18463.<br>> <br>> In general, if you want to implement a multi-threaded server, you'd be better off working from a non-gui application like DemoConsole, to avoid the rendering overhead. This would essentially be equivalent to generating an executable directly with gsc.<br>>
 <br>> btw please use the lambdanative issue reporting tool on github for bugs/issues specific to lambdanative, as that will help us track and coordinate fixes better.<br>> <br>> Chris <br>> <br>> <br>> ________________________________________<br>> From: <a ymailto="mailto:gambit-list-bounces@iro.umontreal.ca" href="mailto:gambit-list-bounces@iro.umontreal.ca">gambit-list-bounces@iro.umontreal.ca</a> [<a ymailto="mailto:gambit-list-bounces@iro.umontreal.ca" href="mailto:gambit-list-bounces@iro.umontreal.ca">gambit-list-bounces@iro.umontreal.ca</a>] On Behalf Of tcl super dude [<a ymailto="mailto:tcleval@gmail.com" href="mailto:tcleval@gmail.com">tcleval@gmail.com</a>]<br>> Sent: Sunday, September 01, 2013 9:44 PM<br>> To: <a ymailto="mailto:gambit-list@iro.umontreal.ca" href="mailto:gambit-list@iro.umontreal.ca">gambit-list@iro.umontreal.ca</a><br>> Subject: [gambit-list] lambdanative and remote repl<br>> <br>>
 Hi,<br>> <br>> I started a remote repl with the demoredsquare app but the repl get too slow, somehow the app takes forever to process the repl events<br>> <br>> main.scm:<br>> <br>> (include "repl.scm")<br>> <br>> (define gui #f)<br>> <br>> (start-repl-server)<br>> (main<br>> ;; initialization<br>>   (lambda (w h)<br>>     (make-window 320 480)<br>>     (glgui-orientation-set! GUI_PORTRAIT)<br>>     (set! gui (make-glgui))<br>>     (let* ((w (glgui-width-get))<br>>           (h (glgui-height-get))<br>>           (dim (min (/ w 2) (/ h 2))))<br>>       (glgui-box gui (/ (- w dim) 2) (/ (- h dim) 2) dim dim Red))<br>>   )<br>> ;; events<br>>   (lambda (t x y)<br>>     (if (= t EVENT_KEYPRESS) (begin<br>>       (if (= x EVENT_KEYESCAPE)
 (terminate))))<br>>     (glgui-event gui t x y))<br>> ;; termination<br>>   (lambda () #t)<br>> ;; suspend<br>>   (lambda () (glgui-suspend))<br>> ;; resume<br>>   (lambda () (glgui-resume))<br>> )<br>> <br>> ;; eof<br>> <br>> <br>> repl.scm:<br>> <br>> <br>> ;;; $Id: repl.scm,v 1.1 2013/03/10 16:24:54 daniel Exp daniel $<br>>         ;;; $Name: $<br>> <br>> <br>> <br>> <br>>         ;; ------------------remote REPL -------------------------------------------------------------<br>>         (define (ide-repl-pump ide-repl-connection in-port out-port tgroup)<br>> <br>> <br>>         (define m (make-mutex))<br>> <br>> <br>>         (define (process-input)<br>>         (let loop ((state 'normal))<br>>     
    (let ((c (read-char ide-repl-connection)))<br>>         (if (not (eof-object? c))<br>>         (case state<br>>         ((normal)<br>>         (if (char=? c #\xff) ;; telnet IAC (interpret as command) code?<br>>         (loop c)<br>>         (begin<br>>         (mutex-lock! m)<br>>         (if (char=? c #\x04) ;; ctrl-d ?<br>>         (close-output-port out-port)<br>>         (begin<br>>         (write-char c out-port)<br>>         (force-output out-port)))<br>>         (mutex-unlock! m)<br>>         (loop state))))<br>>         ((#\xfb) ;; after WILL command?<br>>         (loop
 'normal))<br>>         ((#\xfc) ;; after WONT command?<br>>         (loop 'normal))<br>>         ((#\xfd) ;; after DO command?<br>>         (if (char=? c #\x06) ;; timing-mark option?<br>>         (begin ;; send back WILL timing-mark<br>>         (mutex-lock! m)<br>>         (write-char #\xff ide-repl-connection)<br>>         (write-char #\xfb ide-repl-connection)<br>>         (write-char #\x06 ide-repl-connection)<br>>         (force-output ide-repl-connection)<br>>         (mutex-unlock! m)))<br>>         (loop 'normal))<br>>         ((#\xfe) ;; after DONT command?<br>>         (loop 'normal))<br>>        
 ((#\xff) ;; after IAC command?<br>>         (case c<br>>         ((#\xf4) ;; telnet IP (interrupt process) command?<br>>         (for-each<br>>         ##thread-interrupt!<br>>         (thread-group->thread-list tgroup))<br>>         (loop 'normal))<br>>         ((#\xfb #\xfc #\xfd #\xfe) ;; telnet WILL/WONT/DO/DONT command?<br>>         (loop c))<br>>         (else<br>>         (loop 'normal))))<br>>         (else<br>>         (loop 'normal)))))))<br>> <br>> <br>>         (define (process-output)<br>>         (let loop ()<br>>         (let ((c (read-char in-port)))<br>>         (if
 (not (eof-object? c))<br>>         (begin<br>>         (mutex-lock! m)<br>>         (write-char c ide-repl-connection)<br>>         (force-output ide-repl-connection)<br>>         (mutex-unlock! m)<br>>         (loop))))))<br>> <br>> <br>>         (let ((tgroup (make-thread-group 'repl-pump #f)))<br>>         (thread-start! (make-thread process-input #f tgroup))<br>>         (thread-start! (make-thread process-output #f tgroup))))<br>> <br>> <br>>         (define (make-ide-repl-ports ide-repl-connection tgroup)<br>>         (receive (in-rd-port in-wr-port) (open-string-pipe '(direction: input permanent-close: #f))<br>>         (receive (out-wr-port out-rd-port)
 (open-string-pipe '(direction: output))<br>>         (begin<br>> <br>> <br>>         ;; Hack... set the names of the ports for usage with gambit.el<br>>         (##vector-set! in-rd-port 4 (lambda (port) '(stdin)))<br>>         (##vector-set! out-wr-port 4 (lambda (port) '(stdout)))<br>> <br>> <br>>         (ide-repl-pump ide-repl-connection out-rd-port in-wr-port tgroup)<br>>         (values in-rd-port out-wr-port)))))<br>> <br>> <br>>         (define repl-channel-table (make-table test: eq?))<br>> <br>> <br>>         (set! ##thread-make-repl-channel<br>>         (lambda (thread)<br>>         (let ((tgroup (thread-thread-group thread)))<br>>         (or (table-ref
 repl-channel-table tgroup #f)<br>>         (##default-thread-make-repl-channel thread)))))<br>> <br>> <br>>         (define (setup-ide-repl-channel ide-repl-connection tgroup)<br>>         (receive (in-port out-port) (make-ide-repl-ports ide-repl-connection tgroup)<br>>         (let ((repl-channel (##make-repl-channel-ports in-port out-port)))<br>>         (table-set! repl-channel-table tgroup repl-channel))))<br>> <br>> <br>>         (define (start-ide-repl)<br>>         (##repl-debug-main))<br>> <br>> <br>>         (define repl-server-address "*:7000")<br>> <br>> <br>>         (define (repl-server)<br>>         (let ((server<br>>         (open-tcp-server<br>>   
      (list server-address: repl-server-address<br>>         reuse-address: #t))))<br>>         (let loop ()<br>>         (let* ((ide-repl-connection<br>>         (read server))<br>>         (tgroup<br>>         (make-thread-group 'repl-service #f))<br>>         (thread<br>>         (make-thread<br>>         (lambda ()<br>>         (setup-ide-repl-channel ide-repl-connection tgroup)<br>>         (start-ide-repl))<br>>         'repl<br>>         tgroup)))<br>>         (thread-start! thread)<br>>         (loop)))))<br>> <br>> <br>>         (define
 (start-repl-server)<br>>         (thread-start! (make-thread (lambda () (repl-server)))))<br>> <br>> <br>>         ;-----------------------------------------------------------------------------------------------------------------<br>> <br>> <br>> <br>> <br>> _______________________________________________<br>> Gambit-list mailing list<br>> <a ymailto="mailto:Gambit-list@iro.umontreal.ca" href="mailto:Gambit-list@iro.umontreal.ca">Gambit-list@iro.umontreal.ca</a><br>> <a href="https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list" target="_blank">https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list</a><br>> <br>> <br>> _______________________________________________<br>> Gambit-list mailing list<br>> <a ymailto="mailto:Gambit-list@iro.umontreal.ca" href="mailto:Gambit-list@iro.umontreal.ca">Gambit-list@iro.umontreal.ca</a><br>> <a
 href="https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list" target="_blank">https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list</a><br><br><br></div> </div> </div>  </div></body></html>