changed Socket to work in the edge trigger mode
This commit is contained in:
@ -234,6 +234,7 @@ class Socket(Object) from 'sck'
|
||||
var inwc := 0, outwc := 0. ## input watcher count and ouput watcher count
|
||||
var insem, outsem.
|
||||
var(#get,#set) inputAction, outputAction.
|
||||
var(#get) inputReady := false, outputReady := false.
|
||||
|
||||
method(#primitive) open(domain, type, proto).
|
||||
method(#primitive) _close.
|
||||
@ -339,9 +340,20 @@ extend Socket
|
||||
{
|
||||
| old_output_action |
|
||||
|
||||
if (self.outputReady)
|
||||
{
|
||||
if ((self _writeBytes: bytes) >= 0) { ^self }.
|
||||
self.outputReady := false.
|
||||
}.
|
||||
|
||||
old_output_action := self.outputAction.
|
||||
self.outputAction := [ :sck :state |
|
||||
self _writeBytes: bytes.
|
||||
if ((self _writeBytes: bytes) <= -1)
|
||||
{
|
||||
## EAGAIN
|
||||
self.outputReady := false.
|
||||
^self.
|
||||
}.
|
||||
## TODO: handle _writeBytes may not write in full.
|
||||
|
||||
## restore the output action block before executing the previous
|
||||
@ -364,9 +376,13 @@ extend Socket
|
||||
if (self.insem isNil)
|
||||
{
|
||||
self.insem := Semaphore new.
|
||||
self.insem signalAction: [:sem | self.inputAction value: self value: true].
|
||||
self.insem signalAction: [:sem |
|
||||
self.inputReady := true.
|
||||
self.inputAction value: self value: true
|
||||
].
|
||||
System addAsyncSemaphore: self.insem.
|
||||
}.
|
||||
self.inputReady := false.
|
||||
System signal: self.insem onInput: self.handle
|
||||
}.
|
||||
self.inwc := self.inwc + 1.
|
||||
@ -392,9 +408,13 @@ extend Socket
|
||||
if (self.outsem isNil)
|
||||
{
|
||||
self.outsem := Semaphore new.
|
||||
self.outsem signalAction: [:sem | self.outputAction value: self value: true].
|
||||
self.outsem signalAction: [:sem |
|
||||
self.outputReady := true.
|
||||
self.outputAction value: self value: true
|
||||
].
|
||||
System addAsyncSemaphore: self.outsem.
|
||||
}.
|
||||
self.outputReady := false.
|
||||
System signal: self.outsem onOutput: self.handle.
|
||||
}.
|
||||
self.outwc := self.outwc + 1.
|
||||
|
Reference in New Issue
Block a user