unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Alexey Abramov <levenson@mmer.org>
To: guile-user <guile-user@gnu.org>
Subject: 8sync error in procedure select
Date: Mon, 03 May 2021 17:57:46 +0200	[thread overview]
Message-ID: <87zgxbn72d.fsf@delta.lan> (raw)

[-- Attachment #1: Type: text/plain, Size: 1672 bytes --]

Hi,

I am trying to test an actor I wrote with 8sync. I created a probe actor
which sends messages to the main one. A problem I am having is that when
I want to send a *cleanup* to the main (server) actor from the probe, I
am getting the following backtrace:

--8<---------------cut here---------------start------------->8---
λ guile --debug -s tests/test.scm
Backtrace:
In ice-9/boot-9.scm:
  1736:10 11 (with-exception-handler _ _ #:unwind? _ # _)
In unknown file:
          10 (apply-smob/0 #<thunk 7fac09a7b9a0>)
In ice-9/boot-9.scm:
    718:2  9 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
    619:8  8 (_ #(#(#<directory (guile-user) 7fac096a0f00>)))
In ice-9/boot-9.scm:
   2806:4  7 (save-module-excursion _)
  4351:12  6 (_)
In 8sync/actors.scm:
    812:6  5 (run-hive #<<hive> 7fac08bdd0c0> _ #:cleanup _ # _)
In ice-9/control.scm:
    91:24  4 (call-with-escape-continuation _)
In 8sync/agenda.scm:
    569:6  3 (run-agenda #<<agenda> queue: (() . #f) prompt-tag: ("…> …)
    470:7  2 (update-agenda-from-select! #<<agenda> queue: (() . #f)…>)
In ice-9/boot-9.scm:
  1731:15  1 (with-exception-handler #<procedure 7fac08bbd240 at ic…> …)
In unknown file:
           0 (select (#<closed: file 7fac07ff6460>) () () #f #f)

ERROR: In procedure select:
In procedure select: Wrong type argument in position 1: #<closed: file 7fac07ff6460>
--8<---------------cut here---------------end--------------->8---

I have attached a simple snippet to reproduce the problem, and also a
naive patch I did. I am not sure if it is me doing the shutdown wrong, or
it's a bug.

-- 
Alexey


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-agenda-Honor-closed-ports.patch --]
[-- Type: text/x-patch, Size: 1143 bytes --]

From 020cdb7f7915876ff808b37430846a26dfab702b Mon Sep 17 00:00:00 2001
From: Alexey Abramov <levenson@mmer.org>
Date: Mon, 3 May 2021 16:53:04 +0200
Subject: [PATCH] agenda: Honor closed ports

* 8sync/agenda.scm (update-agenda-from-select!)[ports-to-select?]:
Cleanup ports which have been closed, before monitoring them with
select.
---
 8sync/agenda.scm | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/8sync/agenda.scm b/8sync/agenda.scm
index e91487e..6b851a8 100644
--- a/8sync/agenda.scm
+++ b/8sync/agenda.scm
@@ -514,6 +514,13 @@ Also handles sleeping when all we have to do is wait on the schedule."
       (not (= (hash-count (const #t)
                           (selector agenda))
               0)))
+    (define (drop-closed-ports! table)
+      (for-each (lambda (port)
+                  (when (port-closed? port)
+                    (hash-remove! table port)))
+                (hash-keys table)))
+    (drop-closed-ports! (agenda-write-port-map agenda))
+    (drop-closed-ports! (agenda-read-port-map agenda))
     (or (has-items? agenda-read-port-map)
         (has-items? agenda-write-port-map)))
 
-- 
2.31.1


[-- Attachment #3: test.scm --]
[-- Type: application/octet-stream, Size: 1503 bytes --]

;;; 

(use-modules (oop goops)
             (ice-9 match)
             (8sync actors)
             (8sync ports)
             (8sync repl))

(define (make-server-socket)
  (let ((s (socket PF_INET SOCK_STREAM 0)))
    (setsockopt s SOL_SOCKET SO_REUSEADDR 1)
    (bind s AF_INET INADDR_LOOPBACK 4545)
    (set-port-nonblocking! s)
    s))

(define-actor <server> (<actor>)
  ((*init* (lambda (server message)
             (listen (server-socket server) 5)
             (while #t
               (match (accept (server-socket server))
                 (#f
                  (close (server-socket server)))
                 ((client . _)
                  (set-port-nonblocking! client)
                  (format client "S: hello~%")
                  (close client))))))
   (*cleanup* (lambda (server message)
                (false-if-exception
                 (close (server-socket server))))))
  (server-socket
   #:init-value #f
   #:init-keyword #:server-socket
   #:getter server-socket))

(define-actor <probe> (<actor>)
  ((*init* (lambda (probe message)
             (let ((target (create-actor* probe <server> "server"
                                          #:server-socket (make-server-socket))))
               (slot-set! probe 'target target)
               (<- target '*cleanup*)))))
  (target
   #:init-value #f
   #:getter target))

(let* ((hive (make-hive))
       ;; (repl (bootstrap-actor hive <repl-manager>))
       (probe (bootstrap-actor hive <probe>)))
  (run-hive hive '()))


             reply	other threads:[~2021-05-03 15:57 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-03 15:57 Alexey Abramov [this message]
2021-05-04 18:58 ` 8sync error in procedure select Christopher Lemmer Webber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zgxbn72d.fsf@delta.lan \
    --to=levenson@mmer.org \
    --cc=guile-user@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).