'From Squeak3.6beta of ''4 July 2003'' [latest update: #5373] on 30 July 2003 at 6:18:34 pm'! "Change Set: socketacceptfix Date: 30 July 2003 Author: Stephen Pair md: made a real changeset... Per Michael's request...I'm re-submitting this as a fix. It should be put into the update stream and the network rewrite packages. - Stephen Stephen Pair wrote: > It appears that Socket>>waitForAcceptFor: and friends are not working > in the latest 3.6 image. Attached is a change set that fixes it and > also adds a couple of related convenience methods. > > Also, in 3.6 there appear to be a number of changes relating to method > contexts and such...I keep encountering 'Block cannot return' errors > during process unwinding (on termination)...these errors are happening > in code that worked fine in previous releases (specifically it's > happening when stopping a Service in KomServices). Has anyone > experienced this? > > - Stephen"! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:12'! waitForAcceptFor: timeout "Wait and accept an incoming connection" self waitForConnectionFor: timeout. ^self accept! ! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:23'! waitForAcceptFor: timeout ifTimedOut: timeoutBlock "Wait and accept an incoming connection" self waitForConnectionFor: timeout ifTimedOut: [^timeoutBlock value]. ^self accept! ! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:18'! waitForConnectionFor: timeout "Wait up until the given deadline for a connection to be established. Return true if it is established by the deadline, false if not." ^self waitForConnectionFor: timeout ifTimedOut: [ConnectionTimedOut signal: (NetNameResolver stringFromAddress: self remoteAddress)] ! ! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:01'! waitForConnectionFor: timeout ifTimedOut: timeoutBlock "Wait up until the given deadline for a connection to be established. Return true if it is established by the deadline, false if not." | status deadline | deadline := Socket deadlineSecs: timeout. status _ self primSocketConnectionStatus: socketHandle. [(status = WaitingForConnection) and: [Time millisecondClockValue < deadline]] whileTrue: [ semaphore waitTimeoutMSecs: (deadline - Time millisecondClockValue). status _ self primSocketConnectionStatus: socketHandle]. status = Connected ifFalse: [^timeoutBlock value] ! ! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:18'! waitForDataFor: timeout "Wait for the given nr of seconds for data to arrive. Signal a time out or connection close exception if either happens before data becomes available." ^self waitForDataFor: timeout ifClosed: [ConnectionClosed signal: 'Connection closed while waiting for data.'] ifTimedOut: [ConnectionTimedOut signal: 'Data receive timed out.'] ! ! !Socket methodsFor: 'waiting' stamp: 'svp 7/27/2003 00:16'! waitForDataFor: timeout ifClosed: closedBlock ifTimedOut: timedOutBlock "Wait for the given nr of seconds for data to arrive." | deadline | deadline := Socket deadlineSecs: timeout. [Time millisecondClockValue < deadline] whileTrue: [ (self primSocketReceiveDataAvailable: socketHandle) ifTrue: [^self]. self isConnected ifFalse: [^closedBlock value]. self readSemaphore waitTimeoutMSecs: (deadline - Time millisecondClockValue)]. (self primSocketReceiveDataAvailable: socketHandle) ifFalse: [ self isConnected ifTrue: [^timedOutBlock value] ifFalse: [^closedBlock value]]! !