I've pushed some changes to a separate branch "SelectPoll" in the
Poly/ML Git repository. Could you try it out and let me know if it
seems to solve your problem? It combines the calls and also increases
the time-out to 1 second. How exactly did you get the trace of system
calls? Which operating system are you using?
You could change your signal handler to interrupt the select by using
Thread.Thread.interrupt. That will raise Thread.Thread.interrupt in the
"select" calls. To be safe you should probably set the main thread to
use InterruptSynch.
David
On 13/12/2018 15:40, Kostirya wrote:
Thanks.
So will you combine
select(1024,{ 3 },{ },{ },{ 0.000000 })
select(1024,{ },{ },{ },{ 0.010000 })
in
select(1024,{ 3 },{ },{ },{ 0.010000 })
?
And
select(1024,{ },{ },{ },{ 0.010000 })
poll({ 3/POLLIN },1,0)
in
poll({ 3/POLLIN },1, 0.010000)
?
And will you make this time (0.010000) adjustable also?
And one more question.
Please tell me, how to do it better.
I want cancel Socket.accept (Socket.recvVec, ...) call by signal or timeout.
For this I use loop select with 1 second timeout and check signal
flag. See code below.
It is duplication with repeatedly polling of PolyML.
Is it possible to make some kind of flag to tell to PolyML to cancel
repeatedly polling?
val stop = ref false
val _ = Signal.signal (Posix.Signal.term, Signal.SIG_HANDLE (fn _ =>
stop := true))
fun accept socket =
let
val t = Time.fromSeconds 1
val sd = Socket.sockDesc socket
fun doit socket = case Socket.select { rds = [sd], wrs = [], exs =
[], timeout = SOME t } of
{ rds = [sd], wrs = [], exs = [] } =>
(case Socket.acceptNB socket of NONE (* Other worker was first
*) => doit socket | r => r)
| _ => if !stop then NONE else doit socket
in
doit socket
end
(* return "" if timeout or stop *)
fun read (socket, chunksize, (timeout:Time.time option)) =
let
val t = Time.fromSeconds 1
val sd = Socket.sockDesc socket
fun doit timeout = case Socket.select { rds = [sd], wrs = [], exs
= [], timeout = SOME t } of
{ rds = [sd], wrs = [], exs = [] } => Byte.bytesToString
(Socket.recvVec (socket, chunksize))
| _ => (
case timeout of
NONE => doit NONE
| SOME tt => if Time.>(tt, t) then doit (SOME (Time.-(tt, t))) else
""
)
in
doit timeout handle OS.SysErr ("Interrupted system call", _) => if
!stop then "" else doit timeout | exc => raise exc
end
чт, 13 дек. 2018 г. в 16:54, David Matthews <david.matth...@prolingua.co.uk>:
What you are seeing is Poly/ML repeatedly polling then blocking for a
short while. It doesn't use a blocking call or a long time-out because
with multi-threading there's the possibility that another thread might
interrupt it, perhaps as the result of a console interrupt.
Actually, looking at the code I think it could be improved. I'll have a
look at it.
David
On 13/12/2018 09:01, Kostirya wrote:
Hello.
My application use select or poll before accept socket.
I trace system calls and found that too many select or poll calls occur.
When I use select:
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
select(1024,{ 3 },{ },{ },{ 0.000000 }) = 0 (0x0)
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
select(1024,{ 3 },{ },{ },{ 0.000000 }) = 0 (0x0)
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
...
select(1024,{ 3 },{ },{ },{ 0.000000 }) = 1 (0x1)
accept(3,{ AF_INET 127.0.0.1:54121 },0xbb9f9c5c) = 4 (0x4)
When I use poll and do *not* select:
poll({ 3/POLLIN },1,0) = 0 (0x0)
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
poll({ 3/POLLIN },1,0) = 0 (0x0)
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
poll({ 3/POLLIN },1,0) = 0 (0x0)
select(1024,{ },{ },{ },{ 0.010000 }) = 0 (0x0)
poll({ 3/POLLIN },1,0) = 1 (0x1)
...
accept(3,{ AF_INET 127.0.0.1:48659 },0xbb9f9c5c) = 4 (0x4)
My application wait incoming connection and do nothing but use 1-2% CPU.
What is it and why it is?
By the way.
When I use kevent (epoll on linux) via FFI it is all right.
Nick.
_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml