experimented to support SyncSocket
This commit is contained in:
parent
ca12fc082f
commit
53739821b2
@ -82,7 +82,7 @@ class HttpConnReg(Object)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class HttpSocket(Socket)
|
class HttpSocket(SyncSocket)
|
||||||
{
|
{
|
||||||
var(#get) server := nil.
|
var(#get) server := nil.
|
||||||
var(#get) rid := -1.
|
var(#get) rid := -1.
|
||||||
@ -110,6 +110,28 @@ class HttpSocket(Socket)
|
|||||||
self.server := server.
|
self.server := server.
|
||||||
self.rid := rid.
|
self.rid := rid.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
method _run_service
|
||||||
|
{
|
||||||
|
| buf |
|
||||||
|
buf := ByteArray new: 128.
|
||||||
|
'IM RUNNING SERVICE...............' dump.
|
||||||
|
|
||||||
|
self timeout: 10.
|
||||||
|
self readBytes: buf.
|
||||||
|
buf dump.
|
||||||
|
self readBytes: buf.
|
||||||
|
buf dump.
|
||||||
|
self close.
|
||||||
|
}
|
||||||
|
|
||||||
|
method runService
|
||||||
|
{
|
||||||
|
[ self _run_service ] on: Exception do: [:ex |
|
||||||
|
self close.
|
||||||
|
('EXCEPTION IN HttpSocket ' & ex messageText) dump
|
||||||
|
].
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class HttpListener(ServerSocket)
|
class HttpListener(ServerSocket)
|
||||||
@ -133,6 +155,11 @@ clisck dump.
|
|||||||
if (self.server notNil)
|
if (self.server notNil)
|
||||||
{
|
{
|
||||||
server addConnection: clisck.
|
server addConnection: clisck.
|
||||||
|
'QQQQQQQQQQQQqqq' dump.
|
||||||
|
if (clisck isKindOf: SyncSocket)
|
||||||
|
{
|
||||||
|
[clisck runService] fork.
|
||||||
|
}
|
||||||
}.
|
}.
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ class(#byte) SocketAddress(Object) from 'sck.addr'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SocketCore(Object) from 'sck'
|
class CoreSocket(Object) from 'sck'
|
||||||
{
|
{
|
||||||
## the handle must be the first field in this object to match
|
## the handle must be the first field in this object to match
|
||||||
## the internal representation used by various modules. (e.g. sck)
|
## the internal representation used by various modules. (e.g. sck)
|
||||||
@ -247,9 +247,134 @@ class SocketCore(Object) from 'sck'
|
|||||||
method(#primitive) readBytes: bytes offset: offset length: length.
|
method(#primitive) readBytes: bytes offset: offset length: length.
|
||||||
method(#primitive) _writeBytes: bytes.
|
method(#primitive) _writeBytes: bytes.
|
||||||
method(#primitive) _writeBytes: bytes offset: offset length: length.
|
method(#primitive) _writeBytes: bytes offset: offset length: length.
|
||||||
|
|
||||||
|
|
||||||
|
method close
|
||||||
|
{
|
||||||
|
('CLOSING Socket HANDLE ' & (self.handle asString)) dump.
|
||||||
|
if (self.handle >= 0)
|
||||||
|
{
|
||||||
|
('REALLY CLOSING Socket HANDLE ' & (self.handle asString)) dump.
|
||||||
|
self _close.
|
||||||
|
self.handle := -1.
|
||||||
|
self onSocketClosed.
|
||||||
|
}.
|
||||||
|
}
|
||||||
|
|
||||||
|
method onSocketClosed
|
||||||
|
{
|
||||||
|
## do nothing.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Socket(SocketCore)
|
class SyncSocket(CoreSocket)
|
||||||
|
{
|
||||||
|
var iosem, tmoutsem, sg.
|
||||||
|
var tmoutsecs, tmoutnsecs.
|
||||||
|
|
||||||
|
method(#class) new { self messageProhibited: #new }
|
||||||
|
method(#class) new: size { self messageProhibited: #new: }
|
||||||
|
|
||||||
|
method(#class) __with: handle
|
||||||
|
{
|
||||||
|
###self addToBeFinalized.
|
||||||
|
^(self _basicNew initialize) __open(handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
method(#class) family: family type: type
|
||||||
|
{
|
||||||
|
###self addToBeFinalized.
|
||||||
|
|
||||||
|
## new is prohibited. so use _basicNew with initialize.
|
||||||
|
##^(self new) open(family, type, 0)
|
||||||
|
^(self _basicNew initialize) open(family, type, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
method initialize
|
||||||
|
{
|
||||||
|
super initialize.
|
||||||
|
|
||||||
|
self.iosem := Semaphore new.
|
||||||
|
self.tmoutsem := Semaphore new.
|
||||||
|
|
||||||
|
self.sg := SemaphoreGroup new.
|
||||||
|
self.sg addSemaphore: self.iosem.
|
||||||
|
self.sg addSemaphore: self.tmoutsem.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
method beWatched
|
||||||
|
{
|
||||||
|
## do nothing. i don't want to be watched.
|
||||||
|
}
|
||||||
|
|
||||||
|
method timeout: secs
|
||||||
|
{
|
||||||
|
self.tmoutsecs := secs.
|
||||||
|
self.tmoutnsecs := 0.
|
||||||
|
}
|
||||||
|
|
||||||
|
method readBytes: bytes
|
||||||
|
{
|
||||||
|
| n s |
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
n := super readBytes: bytes.
|
||||||
|
if (n >= 0) { ^n }.
|
||||||
|
if (self.tmoutsecs notNil) { System signal: self.tmoutsem afterSecs: self.tmoutsecs nanosecs: self.tmoutnsecs }.
|
||||||
|
System signal: self.iosem onInput: self.handle.
|
||||||
|
s := self.sg wait.
|
||||||
|
System unsignal: self.iosem.
|
||||||
|
if (self.tmoutsecs notNil) { System unsignal: self.tmoutsem }.
|
||||||
|
if (s == self.tmoutsem) { Exception signal: 'timed out' }.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
method readBytes: bytes offset: offset length: length
|
||||||
|
{
|
||||||
|
| n |
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
n := super readBytes: bytes offset: offset length: length.
|
||||||
|
if (n >= 0) { ^n }.
|
||||||
|
|
||||||
|
System signal: self.iosem onInput: self.handle.
|
||||||
|
self.sg wait.
|
||||||
|
System unsignal: self.iosem.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
method writeBytes: bytes
|
||||||
|
{
|
||||||
|
| n |
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
n := super _writeBytes: bytes.
|
||||||
|
if (n >= 0) { ^n }.
|
||||||
|
|
||||||
|
System signal: self.iosem onOutput: self.handle.
|
||||||
|
self.sg wait.
|
||||||
|
System unsignal: self.iosem.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
method writeBytes: bytes offset: offset length: length
|
||||||
|
{
|
||||||
|
| n |
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
n := super _writeBytes: bytes offset: offset length: length.
|
||||||
|
if (n >= 0) { ^n }.
|
||||||
|
|
||||||
|
System signal: self.iosem onOutput: self.handle.
|
||||||
|
self.sg wait.
|
||||||
|
System unsignal: self.iosem.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Socket(CoreSocket)
|
||||||
{
|
{
|
||||||
var pending_bytes, pending_offset, pending_length.
|
var pending_bytes, pending_offset, pending_length.
|
||||||
var outreadysem, outdonesem, inreadysem.
|
var outreadysem, outdonesem, inreadysem.
|
||||||
@ -282,6 +407,7 @@ extend Socket
|
|||||||
method(#class) family: family type: type
|
method(#class) family: family type: type
|
||||||
{
|
{
|
||||||
###self addToBeFinalized.
|
###self addToBeFinalized.
|
||||||
|
|
||||||
## new is prohibited. so use _basicNew with initialize.
|
## new is prohibited. so use _basicNew with initialize.
|
||||||
##^(self new) open(family, type, 0)
|
##^(self new) open(family, type, 0)
|
||||||
^(self _basicNew initialize) open(family, type, 0)
|
^(self _basicNew initialize) open(family, type, 0)
|
||||||
@ -370,12 +496,7 @@ extend Socket
|
|||||||
self.inreadysem := nil.
|
self.inreadysem := nil.
|
||||||
}.
|
}.
|
||||||
|
|
||||||
if (self.handle >= 0)
|
^super close.
|
||||||
{
|
|
||||||
self _close.
|
|
||||||
self.handle := -1.
|
|
||||||
self onSocketClosed.
|
|
||||||
}.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
method beWatched
|
method beWatched
|
||||||
@ -429,9 +550,9 @@ extend Socket
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
method onSocketClosed
|
##method onSocketClosed
|
||||||
{
|
##{
|
||||||
}
|
##}
|
||||||
|
|
||||||
method onSocketDataIn
|
method onSocketDataIn
|
||||||
{
|
{
|
||||||
@ -508,8 +629,6 @@ class ClientSocket(Socket)
|
|||||||
|
|
||||||
class ServerSocket(Socket)
|
class ServerSocket(Socket)
|
||||||
{
|
{
|
||||||
var(#get) acceptedEventAction.
|
|
||||||
|
|
||||||
method initialize
|
method initialize
|
||||||
{
|
{
|
||||||
'Server Socket initialize...........' dump.
|
'Server Socket initialize...........' dump.
|
||||||
@ -563,6 +682,8 @@ class ServerSocket(Socket)
|
|||||||
|
|
||||||
method onSocketAccepted: clisck from: cliaddr
|
method onSocketAccepted: clisck from: cliaddr
|
||||||
{
|
{
|
||||||
|
## close the accepted client socket immediately.
|
||||||
|
## a subclass must override this to avoid it.
|
||||||
clisck close.
|
clisck close.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user