The Trunk: Network-dtl.127.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Network-dtl.127.mcz

commits-2
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!