[squeak-dev] The Inbox: Network-ul.154.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Oct 25 23:54:30 UTC 2014


A new version of Network was added to project The Inbox:
http://source.squeak.org/inbox/Network-ul.154.mcz

==================== Summary ====================

Name: Network-ul.154
Author: ul
Time: 26 October 2014, 1:44:11.795 am
UUID: 02f2fb48-c1da-4d22-b691-8b96c1886300
Ancestors: Network-ul.152

- use the new ExternalSemaphoreTable API
- unifed socket initialization
- unregister ResolverSemaphore when the network initialization fails

=============== Diff against Network-ul.152 ===============

Item was changed:
  ----- Method: NetNameResolver class>>initializeNetwork (in category 'network initialization') -----
  initializeNetwork
  	"Initialize the network drivers and record the semaphore to be used by the resolver. Do nothing if the network is already initialized. Evaluate the given block if network initialization fails."
  	"NetNameResolver initializeNetwork" 
  
- 	| semaIndex |
  	self resolverStatus = ResolverUninitialized
  		ifFalse: [^HaveNetwork := true].  "network is already initialized"
  
  	HaveNetwork := false.	"in case abort"
+ 	ExternalSemaphoreTable newExternalSemaphoreDo: [ :semaphore :index |
+ 		ResolverSemaphore := semaphore.
+ 		"result is nil if network initialization failed, self if it succeeds"
+ 		(self primInitializeNetwork: index)
+ 			ifNil: [
+ 				ExternalSemaphoreTable unregisterExternalObject: ResolverSemaphore.
+ 				ResolverSemaphore := nil.
+ 				NoNetworkError signal: 'failed network initialization']
+ 			ifNotNil: [ HaveNetwork := true ] ].
- 	ResolverSemaphore := Semaphore new.
- 	semaIndex := Smalltalk registerExternalObject: ResolverSemaphore.
  
+ 	self initializeOldNetworkFlag!
- 	"result is nil if network initialization failed, self if it succeeds"
- 	(self primInitializeNetwork: semaIndex)
- 		ifNil: [NoNetworkError signal: 'failed network initialization']
- 		ifNotNil: [HaveNetwork := true].
- 
- 	self initializeOldNetworkFlag
- !

Item was changed:
  ----- Method: Socket>>acceptFrom: (in category 'initialize-destroy') -----
  acceptFrom: aSocket
  	"Initialize a new socket handle from an accept call"
- 	| semaIndex readSemaIndex writeSemaIndex |
  
+ 	self initializeSocketHandleUsing: [ :semaIndex :readSemaIndex :writeSemaIndex |
+ 		self
+ 			primAcceptFrom: aSocket socketHandle
+ 			receiveBufferSize: 8000
+ 			sendBufSize: 8000
+ 			semaIndex: semaIndex
+ 			readSemaIndex: readSemaIndex
+ 			writeSemaIndex: writeSemaIndex ]!
- 	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>>destroy (in category 'initialize-destroy') -----
  destroy
  	"Destroy this socket. Its connection, if any, is aborted and its resources are freed. Do nothing if the socket has already been destroyed (i.e., if its socketHandle is nil)."
  
  	socketHandle ifNotNil: [
  		self isValid ifTrue: [ self primSocketDestroy: socketHandle ].
+ 		ExternalSemaphoreTable unregisterExternalObjects: { 
+ 			semaphore.
+ 			readSemaphore.
+ 			writeSemaphore }.
- 		Smalltalk unregisterExternalObject: semaphore.
- 		Smalltalk unregisterExternalObject: readSemaphore.
- 		Smalltalk unregisterExternalObject: writeSemaphore.
  		socketHandle := nil.
  		readSemaphore := writeSemaphore := semaphore := nil.
  		self unregister ]!

Item was changed:
  ----- Method: Socket>>finalize (in category 'finalization') -----
  finalize
+ 
  	self primSocketDestroyGently: socketHandle.
+ 	ExternalSemaphoreTable unregisterExternalObjects: {
+ 		semaphore.
+ 		readSemaphore.
+ 		writeSemaphore }
- 	Smalltalk unregisterExternalObject: semaphore.
- 	Smalltalk unregisterExternalObject: readSemaphore.
- 	Smalltalk unregisterExternalObject: writeSemaphore.
  !

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 |
  
+ 	self initializeSocketHandleUsing: [ :semaIndex :readSemaIndex :writeSemaIndex |
- 	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 ]!
- 			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:family: (in category 'initialize-destroy') -----
  initialize: socketType family: family
  	"Initialize a new socket handle. If socket creation fails, socketHandle will be set to nil."
- 	| semaIndex readSemaIndex writeSemaIndex |
  
+ 	NetNameResolver useOldNetwork ifTrue: [ ^self initialize: socketType ].
+ 	self initializeSocketHandleUsing: [ :semaIndex :readSemaIndex :writeSemaIndex |
- 	NetNameResolver useOldNetwork ifTrue: [^self initialize: socketType].
- 	semaphore := Semaphore new.
- 	readSemaphore := Semaphore new.
- 	writeSemaphore := Semaphore new.
- 	semaIndex := Smalltalk registerExternalObject: semaphore.
- 	readSemaIndex := Smalltalk registerExternalObject: readSemaphore.
- 	writeSemaIndex := Smalltalk registerExternalObject: writeSemaphore.
- 	socketHandle :=
  		self primSocketCreateNetwork: family
  			type: socketType
  			receiveBufferSize: 8000
  			sendBufSize: 8000
  			semaIndex: semaIndex
  			readSemaIndex: readSemaIndex
+ 			writeSemaIndex: writeSemaIndex ]!
- 			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 added:
+ ----- Method: Socket>>initializeSocketHandleUsing: (in category 'initialize-destroy') -----
+ initializeSocketHandleUsing: aBlock
+ 	"Initialize a new socket handle. If socket creation fails, socketHandle will be set to nil."
+ 	
+ 	| semaphoresAndIndexes semaphores indexes |
+ 	semaphoresAndIndexes := ExternalSemaphoreTable newExternalSemaphores: 3.
+ 	semaphores := semaphoresAndIndexes at: 1.
+ 	indexes := semaphoresAndIndexes at: 2.
+ 	semaphore := semaphores at: 1.
+ 	readSemaphore := semaphores at: 2.
+ 	writeSemaphore := semaphores at: 3.
+ 	(socketHandle := aBlock valueWithArguments: indexes)
+ 		ifNotNil: [ self register ]
+ 		ifNil: [
+ 			"socket creation failed"
+ 			semaphore := readSemaphore := writeSemaphore := nil.
+ 			ExternalSemaphoreTable unregisterExternalObjects: semaphores ]!



More information about the Squeak-dev mailing list