RFB broken (was: Re: [squeak-dev] The Inbox: Network-ul.114.mcz)
Levente Uzonyi
leves at elte.hu
Thu May 5 14:51:53 UTC 2011
These changes broke RFB, because RFBSocket subclasses Socket and still
references the variable primitiveOnlySupportsOneSemaphore from
#waitForSendDoneFor:. The solution is to remove this method from
RFBSocket.
Levente
On Wed, 20 Apr 2011, commits at source.squeak.org wrote:
> A new version of Network was added to project The Inbox:
> http://source.squeak.org/inbox/Network-ul.114.mcz
>
> ==================== Summary ====================
>
> Name: Network-ul.114
> Author: ul
> Time: 20 April 2011, 2:00:42.697 am
> UUID: 6d5a1d3d-1749-a646-a7be-72d65cb73dd6
> Ancestors: Network-nice.113
>
> - removed support for single semaphore sockets
> - use [ ... ] repeat instead of [ true ] whileTrue: [ ... ]
>
> =============== Diff against Network-nice.113 ===============
>
> Item was changed:
> Object subclass: #Socket
> + instanceVariableNames: 'semaphore socketHandle readSemaphore writeSemaphore'
> - instanceVariableNames: 'semaphore socketHandle readSemaphore writeSemaphore primitiveOnlySupportsOneSemaphore'
> classVariableNames: 'Connected DeadServer InvalidSocket OtherEndClosed Registry RegistryThreshold TCPSocketType ThisEndClosed UDPSocketType Unconnected WaitingForConnection'
> poolDictionaries: ''
> category: 'Network-Kernel'!
>
> !Socket commentStamp: 'gk 12/13/2005 00:43' prior: 0!
> A Socket represents a network connection point. Current sockets are designed to support the TCP/IP and UDP protocols. Sockets are the lowest level of networking object in Squeak and are not normally used directly. SocketStream is a higher level object wrapping a Socket in a stream like protocol.
>
> ProtocolClient and subclasses are in turn wrappers around a SocketStream to provide support for specific network protocols such as POP, NNTP, HTTP, and FTP.!
>
> Item was changed:
> ----- Method: Socket>>acceptFrom: (in category 'initialize-destroy') -----
> acceptFrom: aSocket
> "Initialize a new socket handle from an accept call"
> | semaIndex readSemaIndex writeSemaIndex |
>
> - primitiveOnlySupportsOneSemaphore := false.
> semaphore := Semaphore new.
> readSemaphore := Semaphore new.
> writeSemaphore := Semaphore new.
> semaIndex := Smalltalk registerExternalObject: semaphore.
> readSemaIndex := Smalltalk registerExternalObject: readSemaphore.
> writeSemaIndex := Smalltalk registerExternalObject: writeSemaphore.
> socketHandle := self primAcceptFrom: aSocket socketHandle
> receiveBufferSize: 8000
> sendBufSize: 8000
> semaIndex: semaIndex
> readSemaIndex: readSemaIndex
> writeSemaIndex: writeSemaIndex.
> socketHandle
> ifNotNil: [ self register ]
> ifNil: [ "socket creation failed"
> Smalltalk unregisterExternalObject: semaphore.
> Smalltalk unregisterExternalObject: readSemaphore.
> Smalltalk unregisterExternalObject: writeSemaphore.
> readSemaphore := writeSemaphore := semaphore := nil ]
> !
>
> Item was changed:
> ----- Method: Socket>>initialize: (in category 'initialize-destroy') -----
> initialize: socketType
> "Initialize a new socket handle. If socket creation fails, socketHandle will be set to nil."
> | semaIndex readSemaIndex writeSemaIndex |
>
> - primitiveOnlySupportsOneSemaphore := false.
> semaphore := Semaphore new.
> readSemaphore := Semaphore new.
> writeSemaphore := Semaphore new.
> semaIndex := Smalltalk registerExternalObject: semaphore.
> readSemaIndex := Smalltalk registerExternalObject: readSemaphore.
> writeSemaIndex := Smalltalk registerExternalObject: writeSemaphore.
> socketHandle :=
> self primSocketCreateNetwork: 0
> type: socketType
> receiveBufferSize: 8000
> sendBufSize: 8000
> semaIndex: semaIndex
> readSemaIndex: readSemaIndex
> writeSemaIndex: writeSemaIndex.
>
> socketHandle
> ifNotNil: [ self register ]
> ifNil: [ "socket creation failed"
> Smalltalk unregisterExternalObject: semaphore.
> Smalltalk unregisterExternalObject: readSemaphore.
> Smalltalk unregisterExternalObject: writeSemaphore.
> readSemaphore := writeSemaphore := semaphore := nil ]
> !
>
> Item was changed:
> ----- Method: Socket>>primAcceptFrom:receiveBufferSize:sendBufSize:semaIndex:readSemaIndex:writeSemaIndex: (in category 'primitives') -----
> primAcceptFrom: aHandle receiveBufferSize: rcvBufSize sendBufSize: sndBufSize semaIndex: semaIndex readSemaIndex: aReadSema writeSemaIndex: aWriteSema
> "Create and return a new socket handle based on accepting the connection from the given listening socket"
> +
> <primitive: 'primitiveSocketAccept3Semaphores' module: 'SocketPlugin'>
> + self primitiveFailed!
> - primitiveOnlySupportsOneSemaphore := true.
> - ^self primAcceptFrom: aHandle receiveBufferSize: rcvBufSize sendBufSize: sndBufSize semaIndex: semaIndex !
>
> Item was changed:
> ----- Method: Socket>>primSocketCreateNetwork:type:receiveBufferSize:sendBufSize:semaIndex:readSemaIndex:writeSemaIndex: (in category 'primitives') -----
> primSocketCreateNetwork: netType type: socketType receiveBufferSize: rcvBufSize sendBufSize: sendBufSize semaIndex: semaIndex readSemaIndex: aReadSema writeSemaIndex: aWriteSema
> + "See comment in primSocketCreateNetwork: with one semaIndex. However you should know that some implementations ignore the buffer size and this interface supports three semaphores, one for open/close/listen and the other two for reading and writing"
> - "See comment in primSocketCreateNetwork: with one semaIndex. However you should know that some implementations
> - ignore the buffer size and this interface supports three semaphores, one for open/close/listen and the other two for
> - reading and writing"
>
> <primitive: 'primitiveSocketCreate3Semaphores' module: 'SocketPlugin'>
> + self primitiveFailed!
> - primitiveOnlySupportsOneSemaphore := true.
> - ^ self primSocketCreateNetwork: netType
> - type: socketType
> - receiveBufferSize: rcvBufSize
> - sendBufSize: sendBufSize
> - semaIndex: semaIndex!
>
> Item was changed:
> ----- Method: Socket>>primitiveOnlySupportsOneSemaphore (in category 'accessing') -----
> primitiveOnlySupportsOneSemaphore
> +
> + self deprecated: 'All sockets have 3 semaphores.'.
> + ^false!
> - ^primitiveOnlySupportsOneSemaphore!
>
> Item was changed:
> ----- Method: Socket>>readSemaphore (in category 'accessing') -----
> readSemaphore
> +
> - primitiveOnlySupportsOneSemaphore ifTrue: [^semaphore].
> ^readSemaphore!
>
> Item was changed:
> ----- Method: Socket>>receiveDataInto:fromHost:port: (in category 'datagrams') -----
> receiveDataInto: aStringOrByteArray fromHost: hostAddress port: portNumber
> | datagram |
> "Receive a UDP packet from the given hostAddress/portNumber, storing the data in the given buffer, and return the number of bytes received. Note the given buffer may be only partially filled by the received data."
>
> + [
> + datagram := self receiveUDPDataInto: aStringOrByteArray.
> - primitiveOnlySupportsOneSemaphore ifTrue:
> - [self setPeer: hostAddress port: portNumber.
> - ^self receiveDataInto: aStringOrByteArray].
> - [true] whileTrue:
> - [datagram := self receiveUDPDataInto: aStringOrByteArray.
> ((datagram at: 2) = hostAddress and: [(datagram at: 3) = portNumber])
> ifTrue: [^datagram at: 1]
> + ifFalse: [^0]] repeat!
> - ifFalse: [^0]]!
>
> Item was changed:
> ----- Method: Socket>>sendData:toHost:port: (in category 'datagrams') -----
> sendData: aStringOrByteArray toHost: hostAddress port: portNumber
> "Send a UDP packet containing the given data to the specified host/port."
>
> - primitiveOnlySupportsOneSemaphore ifTrue:
> - [self setPeer: hostAddress port: portNumber.
> - ^self sendData: aStringOrByteArray].
> ^self sendUDPData: aStringOrByteArray toHost: hostAddress port: portNumber!
>
> Item was changed:
> ----- Method: Socket>>writeSemaphore (in category 'accessing') -----
> writeSemaphore
> +
> - primitiveOnlySupportsOneSemaphore ifTrue: [^semaphore].
> ^writeSemaphore!
>
>
>
More information about the Squeak-dev
mailing list
|