[racket-users] Re: set a timeout to tcp-connect

2015-07-17 Thread mazert

Le 17/07/2015 17:06, George Neuner a écrit :

Won't the connection attempt eventually time out and cause an exception
when the TCP stack closes the socket?  I know the default connect
timeout is rather long though (150 seconds?).


Yes it will close for sure but after a long time (maybe 150 sec as you 
said). Also it can server side maybe...


I'm not a TCP/IP specialist so surely there is a better way to follow. 
One day I'll read a little the book mentionned in racket doc :


TCP/IP Illustrated, Volume 1 by W. Richard Stevens
http://www.jtbookyard.com/uploads/6/2/9/3/6293106/tcp_ip_illustrated_volume_1_the_protocols_2nd_edit.pdf

--
You received this message because you are subscribed to the Google Groups "Racket 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[racket-users] Re: set a timeout to tcp-connect

2015-07-17 Thread mazert

Le 17/07/2015 17:08, Matthew Flatt a écrit :

It's possible (but unlikely) for the thread bound to `a` to complete
and try to kill `b` before the variable `b` is initialized.


Ah ok, yes that is risky in this case, plus we didn't close the tcp 
connection.


Here's what I'd do:

  * Create a custodian to manage the thread, and shut the custodian down
instead of killing the thread. That way, in addition to killing the
thread, any network resources are also released.

  * Instead of starting a timer thread, use `sync/timeout`.

(define (foo)
   (define c (make-custodian))
   (define t (parameterize ([current-custodian c])
   (thread
(λ ()
  (let-values ([(p-in p-out)
(tcp-connect "smtp.gmail.com" 5887)])
(printf "Server port is good"))
   (displayln `(hello world))
   (unless (sync/timeout 2 t) ; produces #f on timeout
 (printf "Server port is not good")
 (custodian-shutdown-all c)))


That is an elegant solution :) . So I read the doc about custodian with 
parameterize to know more, but it is always a little mysterious for me.


when : (parameterize ([current-custodian c])
We say that we run the code in the 'body' part with a c parameter that 
contain an empty custodian.
But we never added something to c, how the connections are 'linked' to 
c, when we use custodian-shutdown-all ? It is automatic for all 
thread/network/streams etc... functions in the 'body' part of 
(parameterize) ?


When we bind the (parameterize) to a variable, the type is the type of 
last result in the 'body' part in (parameterize) ? , So as a thread is 
an evt, we can use it in sync/timeout.


--
You received this message because you are subscribed to the Google Groups "Racket 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: [racket-users] Re: set a timeout to tcp-connect

2015-07-17 Thread Matthew Flatt
At Fri, 17 Jul 2015 16:58:50 +0200, mazert wrote:
> Le 17/07/2015 16:16, Matthias Felleisen a écrit :
> > This actually works. But I am not sure why you'd want to do something like 
> that.
> 
> Ah yes, letrec is what I was looking for :) . The goal was to test a 
> port with a specific timeout (here I set it to two for dev purposes, but 
> 10 is better). I rewrited foo with better comments below.
> 
> Just to be sure, I cant have the prompt return without using a 
> (thread-wait thd) function ?
> 
> 1) The port is not good so b kills a, then b ends. The program continue.
> 2) But if I set (thread-wait a), b kills a, then b ends. As a was 
> killed, it is considered as terminated so it is the same as 1) ?


Yes.

Beware, though, that there's a race condition here:

> #lang racket
> 
> (define (foo)
>(letrec ([a (thread (λ ()
>  (let-values ([(p-in p-out) (tcp-connect 
> "smtp.gmail.com" 5887)])
>(printf "Server port is good")
>(kill-thread b]
> [b (thread (λ ()
>  (displayln `(hello world))
>  (sleep 2)
>  (printf "Server port is not good")
>  (kill-thread a)))])
>  (thread-wait b)))

It's possible (but unlikely) for the thread bound to `a` to complete
and try to kill `b` before the variable `b` is initialized.

Here's what I'd do:

 * Create a custodian to manage the thread, and shut the custodian down
   instead of killing the thread. That way, in addition to killing the
   thread, any network resources are also released.

 * Instead of starting a timer thread, use `sync/timeout`.

(define (foo)
  (define c (make-custodian))
  (define t (parameterize ([current-custodian c])
  (thread 
   (λ ()
 (let-values ([(p-in p-out)
   (tcp-connect "smtp.gmail.com" 5887)])
   (printf "Server port is good"))
  (displayln `(hello world))
  (unless (sync/timeout 2 t) ; produces #f on timeout
(printf "Server port is not good")
(custodian-shutdown-all c)))


-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[racket-users] Re: set a timeout to tcp-connect

2015-07-17 Thread mazert

Le 17/07/2015 16:16, Matthias Felleisen a écrit :

This actually works. But I am not sure why you'd want to do something like that.


Ah yes, letrec is what I was looking for :) . The goal was to test a 
port with a specific timeout (here I set it to two for dev purposes, but 
10 is better). I rewrited foo with better comments below.


Just to be sure, I cant have the prompt return without using a 
(thread-wait thd) function ?


1) The port is not good so b kills a, then b ends. The program continue.
2) But if I set (thread-wait a), b kills a, then b ends. As a was 
killed, it is considered as terminated so it is the same as 1) ?




#lang racket

(define (foo)
  (letrec ([a (thread (λ ()
(let-values ([(p-in p-out) (tcp-connect 
"smtp.gmail.com" 5887)])

  (printf "Server port is good")
  (kill-thread b]
   [b (thread (λ ()
(displayln `(hello world))
(sleep 2)
(printf "Server port is not good")
(kill-thread a)))])
(thread-wait b)))


--
You received this message because you are subscribed to the Google Groups "Racket 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.