David T. Lewis uploaded a new version of Network to project The Trunk:
http://source.squeak.org/trunk/Network-dtl.127.mcz ==================== Summary ==================== Name: Network-dtl.127 Author: dtl Time: 13 June 2012, 10:24:48.022 pm UUID: ba365401-387d-4dff-acb1-1b81b3bc8383 Ancestors: Network-dtl.126 Protect SocketAddressInformation creation with a mutex semaphore because it calls primitives that maintain state within the SocketPlugin. Raise ConnectionTimedOut if a connection request has actually timed out, otherwise raise ConnectionRefused. Fix exception message in connectTo:port:waitForConnectionFor: to use hostAddress printString because hostAddress is now a SocketAddress. =============== Diff against Network-dtl.126 =============== Item was changed: ----- Method: Socket>>connectTo:port:waitForConnectionFor: (in category 'connection open/close') ----- connectTo: hostAddress port: port waitForConnectionFor: timeout "Initiate a connection to the given port at the given host address. Waits until the connection is established or time outs." self connectNonBlockingTo: hostAddress port: port. self waitForConnectionFor: timeout + ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ', hostAddress printString] + ifRefused: [ConnectionRefused signal: 'Cannot connect to ', hostAddress printString]! - ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ' - , self remoteSocketAddress hostNumber , ':' , port asString]! Item was changed: ----- Method: Socket>>connectTo:waitForConnectionFor: (in category 'ipv6') ----- connectTo: aSocketAddress waitForConnectionFor: timeout self connectNonBlockingTo: aSocketAddress. self waitForConnectionFor: timeout + ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ', aSocketAddress printString] + ifRefused: [ConnectionRefused signal: 'Cannot connect to ', aSocketAddress printString]! - ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ', aSocketAddress printString]! Item was changed: ----- Method: Socket>>waitForConnectionFor: (in category 'waiting') ----- 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: 'Failed to connect in ', timeout asString, ' seconds'] + ifRefused: [ConnectionRefused signal: 'Failed to connect in ', timeout asString, ' seconds'] ! Item was changed: ----- Method: Socket>>waitForConnectionFor:ifTimedOut: (in category 'waiting') ----- 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." + ^ self waitForConnectionFor: timeout ifTimedOut: timeoutBlock ifRefused: timeoutBlock + ! - | startTime msecsDelta msecsEllapsed status | - startTime := Time millisecondClockValue. - msecsDelta := (timeout * 1000) truncated. - status := self primSocketConnectionStatus: socketHandle. - [(status = WaitingForConnection) and: [(msecsEllapsed := Time millisecondsSince: startTime) < msecsDelta]] - whileTrue: [ - semaphore waitTimeoutMSecs: msecsDelta - msecsEllapsed. - status := self primSocketConnectionStatus: socketHandle]. - - status = Connected ifFalse: [^timeoutBlock value]. - ^ true! Item was added: + ----- Method: Socket>>waitForConnectionFor:ifTimedOut:ifRefused: (in category 'waiting') ----- + waitForConnectionFor: timeout ifTimedOut: timeoutBlock ifRefused: refusedBlock + "Wait up until the given deadline for a connection to be established. Return true if it is established by the deadline, false if not." + + | startTime msecsDelta msecsEllapsed status | + startTime := Time millisecondClockValue. + msecsDelta := (timeout * 1000) truncated. + status := self primSocketConnectionStatus: socketHandle. + status = Connected ifTrue: [^true]. + [(status = WaitingForConnection) and: [(msecsEllapsed := Time millisecondsSince: startTime) < msecsDelta]] + whileTrue: [ + semaphore waitTimeoutMSecs: msecsDelta - msecsEllapsed. + status := self primSocketConnectionStatus: socketHandle]. + status = Connected + ifFalse: [ + status = WaitingForConnection + ifTrue: [timeoutBlock value] + ifFalse: [refusedBlock value]. + ^false]. + ^ true! Item was changed: ----- Method: Socket>>waitForConnectionUntil: (in category 'waiting') ----- waitForConnectionUntil: deadline "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 | status := self primSocketConnectionStatus: socketHandle. + self isConnected ifTrue: [^status]. [(status = WaitingForConnection) and: [Time millisecondClockValue < deadline]] whileTrue: [ semaphore waitTimeoutMSecs: (deadline - Time millisecondClockValue). status := self primSocketConnectionStatus: socketHandle]. ^ status = Connected ! Item was changed: Object subclass: #SocketAddressInformation instanceVariableNames: 'socketAddress addressFamily socketType protocol' + classVariableNames: 'AddressFamilyINET4 AddressFamilyINET6 AddressFamilyLocal AddressFamilyUnspecified NumericFlag PassiveFlag PrimitiveAccessProtect ProtocolTCP ProtocolUDP ProtocolUnspecified SocketTypeDGram SocketTypeStream SocketTypeUnspecified' - classVariableNames: 'AddressFamilyINET4 AddressFamilyINET6 AddressFamilyLocal AddressFamilyUnspecified NumericFlag PassiveFlag ProtocolTCP ProtocolUDP ProtocolUnspecified SocketTypeDGram SocketTypeStream SocketTypeUnspecified' poolDictionaries: '' category: 'Network-Kernel'! !SocketAddressInformation commentStamp: '<historical>' prior: 0! I represent a local or remote network service. Instance Variables addressFamily: <SmallInteger> the address family (unix, inet4, inet6, ...) in which the service address is available. protocol: <SmallInteger> the protocol (tcp, udp, ...) that the service uses. socketAddress: <SocketAddress> the socket address at which the service can be contacted or created. socketType: <SmallInteger> the type (stream, dgram) of the socket that should be created for communication with the service. ! Item was changed: ----- Method: SocketAddressInformation class>>forHost:service:flags:addressFamily:socketType:protocol: (in category 'instance creation') ----- forHost: hostName service: servName flags: flags addressFamily: family socketType: type protocol: protocol | result addr | + PrimitiveAccessProtect critical: [ + NetNameResolver initializeNetwork. + NetNameResolver + primGetAddressInfoHost: hostName + service: servName + flags: flags + family: family + type: type + protocol: protocol. + result := OrderedCollection new. + [(addr := NetNameResolver nextSocketAddressInformation) notNil] + whileTrue: [result add: addr]]. + ^ result! - NetNameResolver initializeNetwork. - NetNameResolver primGetAddressInfoHost: hostName service: servName flags: flags family: family type: type protocol: protocol. - result := OrderedCollection new. - [(addr := NetNameResolver nextSocketAddressInformation) notNil] whileTrue: [result add: addr]. - ^result! Item was changed: ----- Method: SocketAddressInformation class>>initialize (in category 'class initialization') ----- + initialize + "SocketAddressInformation initialize" - initialize "SocketAddressInformation initialize" NumericFlag := 1. PassiveFlag := 2. AddressFamilyUnspecified := 0. AddressFamilyLocal := 1. AddressFamilyINET4 := 2. AddressFamilyINET6 := 3. SocketTypeUnspecified := 0. SocketTypeStream := 1. SocketTypeDGram := 2. ProtocolUnspecified := 0. ProtocolTCP := 1. + ProtocolUDP := 2. + + "SocketPlugin maintains internal state across primitive calls, so methods that rely + on the result of sequential primitive calls require concurrency control." + PrimitiveAccessProtect := Semaphore forMutualExclusion. + ! - ProtocolUDP := 2.! Item was changed: ----- Method: SocketAddressInformation>>connect (in category 'circuit setup') ----- connect | sock | socketType == SocketTypeStream ifFalse: [^nil]. sock := Socket newTCP: addressFamily. sock connectTo: socketAddress. sock waitForConnectionFor: Socket standardTimeout + ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ', self printString] + ifRefused: [ConnectionRefused signal: 'Cannot connect to ', self printString]. - ifTimedOut: [ConnectionTimedOut signal: 'Cannot connect to ', self printString]. ^sock! |
Free forum by Nabble | Edit this page |