[Vm-dev] VM Maker: VMMaker.oscog-eem.2060.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Dec 31 01:35:43 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2060.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2060
Author: eem
Time: 30 December 2016, 5:35:05.715938 pm
UUID: f9dcc3c5-4596-4d3b-a6f1-40a2dde5c7f5
Ancestors: VMMaker.oscog-eem.2059
SocketPluginSimulator:
SocketPlugin simulation sufficient to do a diff of a changed package against source.squeak.org/trunk, and indeed sufficient to get far enough to provke an assert-fail in compaction.
Simulate only ipv4.
Clean up primitiveHasSocketAccess to be smart syntax and eliminate the cCode: from initialiseModule.
=============== Diff against VMMaker.oscog-eem.2059 ===============
Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>signalSemaphoreWithIndex: (in category 'simulation only') -----
+ signalSemaphoreWithIndex: index
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter signalSemaphoreWithIndex: index!
Item was added:
+ ----- Method: NewObjectMemorySimulator>>signalSemaphoreWithIndex: (in category 'simulation only') -----
+ signalSemaphoreWithIndex: index
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ ^coInterpreter signalSemaphoreWithIndex: index!
Item was added:
+ ----- Method: SocketPlugin class>>simulatorClass (in category 'simulation') -----
+ simulatorClass
+ ^SmartSyntaxPluginSimulator!
Item was changed:
----- Method: SocketPlugin>>initialiseModule (in category 'initialize-release') -----
initialiseModule
<export: true>
sDSAfn := interpreterProxy ioLoadFunction: 'secDisableSocketAccess' From: 'SecurityPlugin'.
sHSAfn := interpreterProxy ioLoadFunction: 'secHasSocketAccess' From: 'SecurityPlugin'.
sCCTPfn := interpreterProxy ioLoadFunction: 'secCanConnectToPort' From: 'SecurityPlugin'.
sCCLOPfn := interpreterProxy ioLoadFunction: 'secCanListenOnPort' From: 'SecurityPlugin'.
sCCSOTfn := interpreterProxy ioLoadFunction: 'secCanCreateSocketOfType' From: 'SecurityPlugin'.
+ ^self socketInit!
- ^self cCode: 'socketInit()' inSmalltalk:[true]!
Item was changed:
----- Method: SocketPlugin>>primitiveHasSocketAccess (in category 'security primitives') -----
primitiveHasSocketAccess
+ self primitive: 'primitiveHasSocketAccess'.
- | hasAccess |
- <export: true>
"If the security plugin can be loaded, use it to check .
If not, assume it's ok"
+ ^(sHSAfn = 0
+ or: [self cCode: ' ((sqInt (*) (void)) sHSAfn)()' inSmalltalk: [true]]) asBooleanObj!
- hasAccess := sHSAfn = 0
- or: [self cCode: ' ((sqInt (*) (void)) sHSAfn)()' inSmalltalk:[true]].
- interpreterProxy pop: 1.
- interpreterProxy pushBool: hasAccess!
Item was added:
+ SocketPlugin subclass: #SocketPluginSimulator
+ instanceVariableNames: 'openSocketHandles externalSemaphores hostSocketToSimSocketMap simSocketToHostSocketMap fakeAddressCounter resolverSemaphoreIndex ipv6support'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'VMMaker-InterpreterSimulation'!
Item was added:
+ ----- Method: SocketPluginSimulator>>close (in category 'initialize-release') -----
+ close "close any sockets that ST may have opened"
+ openSocketHandles do: [:h | self closeAndDestroy: h].
+ Smalltalk unregisterExternalObjects: externalSemaphores!
Item was added:
+ ----- Method: SocketPluginSimulator>>closeAndDestroy: (in category 'initialize-release') -----
+ closeAndDestroy: socketHandle
+ "c.f. Socket closeAndDestroy: timeoutSeconds"
+ | fakeSocket |
+ fakeSocket := Socket basicNew.
+ [(fakeSocket primSocketConnectionStatus: socketHandle) = (Socket classPool at: #Connected) ifTrue:
+ [fakeSocket primSocketCloseConnection: socketHandle].
+ fakeSocket
+ primSocketAbortConnection: socketHandle;
+ primSocketDestroy: socketHandle]
+ on: SocketPrimitiveFailed
+ do: [:ex| Transcript cr; show: ex message]!
Item was added:
+ ----- Method: SocketPluginSimulator>>hostSocketHandleFromSimSocketHandle: (in category 'simulation support') -----
+ hostSocketHandleFromSimSocketHandle: socketHandleCArray
+ "Answer the corresponding host socketHandle for the simulation socketHandle, or nil if none, failing the primitive."
+ ^simSocketToHostSocketMap
+ at: (self simSocketHandleFrom: socketHandleCArray)
+ ifAbsent: [interpreterProxy primitiveFail. nil]!
Item was added:
+ ----- Method: SocketPluginSimulator>>ipv6support (in category 'accessing') -----
+ ipv6support
+
+ ^ ipv6support
+ !
Item was added:
+ ----- Method: SocketPluginSimulator>>ipv6support: (in category 'accessing') -----
+ ipv6support: anObject
+
+ ipv6support := anObject.
+ !
Item was added:
+ ----- Method: SocketPluginSimulator>>map:to:type:register:spawning:and:and: (in category 'simulation support') -----
+ map: hostSocketHandle to: simSockPtr type: socketType register: semaphores spawning: blockOne and: blockTwo and: blockThree
+ | simSocket |
+ "SQSocket is typedef struct { int sessionID; int socketType; void *privateSocketPtr; } SQSocket"
+ simSocket := ByteArray new: (self sizeof: #SQSocket).
+ simSocket
+ unsignedLongAt: 1 put: interpreterProxy getThisSessionID;
+ unsignedLongAt: 5 put: socketType.
+ simSocket size = 12
+ ifTrue: [simSocket unsignedLongAt: 9 put: (fakeAddressCounter := fakeAddressCounter + 64)]
+ ifFalse: [simSocket unsignedLongLongAt: 9 put: (fakeAddressCounter := fakeAddressCounter + 80)].
+ self assert: ((interpreterProxy isBytes: simSockPtr cPtrAsOop)
+ and: [(interpreterProxy numBytesOf: simSockPtr cPtrAsOop) = simSocket size]).
+ 1 to: simSocket size do:
+ [:i| simSockPtr at: i - 1 put: (simSocket at: i)].
+ self assert: (self simSocketHandleFrom: simSockPtr) = simSocket.
+ openSocketHandles add: hostSocketHandle.
+ hostSocketToSimSocketMap at: hostSocketHandle put: simSocket.
+ simSocketToHostSocketMap at: simSocket put: hostSocketHandle.
+ externalSemaphores addAll: semaphores.
+ "N.B. These don't need registering. Eventually they will end up
+ waiting on semaphores that have been unregistered, and hence
+ will get garbage collected, along with these processes."
+ blockOne fork.
+ blockTwo fork.
+ blockThree fork!
Item was added:
+ ----- Method: SocketPluginSimulator>>netAddressAsByteArrayFromInt: (in category 'simulation support') -----
+ netAddressAsByteArrayFromInt: netAddress
+ ^ByteArray
+ with: ((netAddress bitShift: -24) bitAnd: 16rFF)
+ with: ((netAddress bitShift: -16) bitAnd: 16rFF)
+ with: ((netAddress bitShift: -8) bitAnd: 16rFF)
+ with: (netAddress bitAnd: 16rFF)!
Item was added:
+ ----- Method: SocketPluginSimulator>>simSocketHandleFrom: (in category 'simulation support') -----
+ simSocketHandleFrom: socketHandleCArray
+ | simSocket |
+ "SQSocket is typedef struct { int sessionID; int socketType; void *privateSocketPtr; } SQSocket"
+ simSocket := ByteArray new: (self sizeof: #SQSocket).
+ 1 to: simSocket size do:
+ [:i|
+ simSocket at: i put: (socketHandleCArray at: i - 1)].
+ ^simSocket!
Item was added:
+ ----- Method: SocketPluginSimulator>>simulator: (in category 'accessing') -----
+ simulator: aSmartSyntaxPluginSimulator
+ super simulator: aSmartSyntaxPluginSimulator.
+ aSmartSyntaxPluginSimulator logging: true!
Item was added:
+ ----- Method: SocketPluginSimulator>>socketInit (in category 'initialize-release') -----
+ socketInit
+ openSocketHandles := Set new.
+ externalSemaphores := Set new.
+ hostSocketToSimSocketMap := Dictionary new.
+ simSocketToHostSocketMap := Dictionary new.
+ fakeAddressCounter := 16r50C4E70. "Socket, if you squint at it right..."
+ "Set all the security functions to zero so simulation does't need to work fully."
+ sDSAfn := sHSAfn := sCCTPfn := sCCLOPfn := sCCSOTfn := 0.
+ "for now..."
+ ipv6support := false.
+ ^true!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqNetworkInit: (in category 'simulation') -----
+ sqNetworkInit: resolverSemaIndex
+ "Simply assume the network is initialized."
+ (NetNameResolver classPool at: #HaveNetwork) ifFalse:
+ [NetNameResolver initializeNetwork].
+ resolverSemaphoreIndex
+ ifNil: [resolverSemaphoreIndex := resolverSemaIndex]
+ ifNotNil: [self assert: resolverSemaphoreIndex = resolverSemaIndex].
+ ^0!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqResolverHostNameSize (in category 'simulation') -----
+ sqResolverHostNameSize
+ ipv6support ifTrue: [^NetNameResolver primHostNameSize].
+ interpreterProxy primitiveFail!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqResolverNameLookupResult (in category 'simulation') -----
+ sqResolverNameLookupResult
+ "For now don't simulate the implicit semaphore."
+ | bytes |
+ bytes := NetNameResolver primNameLookupResult.
+ self assert: bytes size = 4.
+ "Effectively netAddressToInt: bytes"
+ ^ ((bytes at: 4)) +
+ ((bytes at: 3) <<8) +
+ ((bytes at: 2) <<16) +
+ ((bytes at: 1) <<24)!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqResolverStartName:Lookup: (in category 'simulation') -----
+ sqResolverStartName: aCArray Lookup: size
+ "For now don't simulate the implicit semaphore."
+ | hostName busy |
+ busy := NetNameResolver classPool at: #ResolverBusy.
+ hostName := self st: (String new: size) rn: aCArray cpy: size.
+ NetNameResolver primStartLookupOfName: hostName.
+ resolverSemaphoreIndex ifNotNil:
+ [[[NetNameResolver primNameResolverStatus = busy] whileTrue:
+ [(Delay forSeconds: 1) wait].
+ interpreterProxy signalSemaphoreWithIndex: resolverSemaphoreIndex] fork]
+ !
Item was added:
+ ----- Method: SocketPluginSimulator>>sqResolverStatus (in category 'simulation') -----
+ sqResolverStatus
+ ^NetNameResolver primNameResolverStatus!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocket:ConnectTo:Port: (in category 'simulation') -----
+ sqSocket: socketHandle ConnectTo: addr Port: port
+ ^[Socket basicNew
+ primSocket: ((self hostSocketHandleFromSimSocketHandle: socketHandle) ifNil: [^self])
+ connectTo: (self netAddressAsByteArrayFromInt: addr)
+ port: port]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ 0]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocket:CreateNetType:SocketType:RecvBytes:SendBytes:SemaID:ReadSemaID:WriteSemaID: (in category 'simulation') -----
+ sqSocket: sockPtr CreateNetType: netType SocketType: socketType RecvBytes: recvBufSize SendBytes: sendBufSize SemaID: semaIndex ReadSemaID: readSemaIndex WriteSemaID: writeSemaIndex
+ "Simulate the sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID function.
+ We descend beneath the Socket abstraftion to simulate as accurately as possible."
+ | semaphoresAndIndexes semaphores indexes socketHandle |
+ semaphoresAndIndexes := Smalltalk newExternalSemaphores: 3.
+ semaphores := semaphoresAndIndexes first.
+ indexes := semaphoresAndIndexes second.
+ socketHandle := [Socket basicNew
+ primSocketCreateNetwork: netType
+ type: socketType
+ receiveBufferSize: recvBufSize
+ sendBufSize: sendBufSize
+ semaIndex: indexes first
+ readSemaIndex: indexes second
+ writeSemaIndex: indexes third]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ #failed].
+ socketHandle == #failed ifTrue:
+ [interpreterProxy primitiveFail.
+ Smalltalk unregisterExternalObjects: semaphores.
+ ^self].
+ "N.B. There is now a Processor yield in doSignalExternalSemaphores: every 100 virtual microseconds.
+ This allows these to make progress. Their job is to map a host signal into a signal of the relevant index."
+ self map: socketHandle
+ to: sockPtr
+ type: socketType
+ register: semaphores
+ spawning: [[semaphores first wait. interpreterProxy signalSemaphoreWithIndex: semaIndex] repeat]
+ and: [[semaphores second wait. interpreterProxy signalSemaphoreWithIndex: readSemaIndex] repeat]
+ and: [[semaphores third wait. interpreterProxy signalSemaphoreWithIndex: writeSemaIndex] repeat]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocket:ReceiveDataBuf:Count: (in category 'simulation') -----
+ sqSocket: socketHandleCArray ReceiveDataBuf: bufferStartCArray Count: numBytes
+ ^[| buffer n |
+ buffer := ByteArray new: numBytes.
+ n := Socket basicNew
+ primSocket: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^0])
+ receiveDataInto: buffer
+ startingAt: 1
+ count: numBytes.
+ 1 to: n do:
+ [:i|
+ bufferStartCArray at: i - 1 put: (buffer at: i)].
+ n]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ 0]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocket:SendDataBuf:Count: (in category 'simulation') -----
+ sqSocket: socketHandleCArray SendDataBuf: bufferStartCArray Count: numBytes
+ | data |
+ data := ByteArray new: numBytes.
+ 1 to: numBytes do:
+ [:i| data at: i put: (bufferStartCArray at: i - 1)].
+ ^[Socket basicNew
+ primSocket: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^0])
+ sendData: data
+ startIndex: 1
+ count: numBytes]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ 0]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocketConnectionStatus: (in category 'simulation') -----
+ sqSocketConnectionStatus: socketHandleCArray
+ ^[Socket basicNew
+ primSocketConnectionStatus: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^-1])]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ -1]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocketDestroy: (in category 'simulation') -----
+ sqSocketDestroy: socketHandleCArray
+ | simHandle hostHandle |
+ simHandle := self simSocketHandleFrom: socketHandleCArray.
+ hostHandle := simSocketToHostSocketMap removeKey: simHandle ifAbsent: [].
+ hostHandle ifNil:
+ [interpreterProxy primitiveFail.
+ ^self].
+ hostSocketToSimSocketMap removeKey: hostHandle ifAbsent: [].
+ [Socket basicNew primSocketDestroy: hostHandle]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocketReceiveDataAvailable: (in category 'simulation') -----
+ sqSocketReceiveDataAvailable: socketHandleCArray
+ ^[Socket basicNew
+ primSocketReceiveDataAvailable: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^false])]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ false]!
Item was added:
+ ----- Method: SocketPluginSimulator>>sqSocketSendDone: (in category 'simulation') -----
+ sqSocketSendDone: socketHandleCArray
+ ^[Socket basicNew
+ primSocketSendDone: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^false])]
+ on: SocketPrimitiveFailed
+ do: [:ex|
+ interpreterProxy primitiveFail.
+ false]!
Item was added:
+ ----- Method: SpurMemoryManager>>signalSemaphoreWithIndex: (in category 'simulation only') -----
+ signalSemaphoreWithIndex: index
+ "hack around the CoInterpreter/ObjectMemory split refactoring"
+ <doNotGenerate>
+ ^coInterpreter signalSemaphoreWithIndex: index!
Item was changed:
----- Method: StackInterpreterSimulator>>signalSemaphoreWithIndex: (in category 'process primitive support') -----
signalSemaphoreWithIndex: index
"This is a non-thread-safe simulation. See platforms/Cross/vm/sqExternalSemaphores.c
for the real code."
index <= 0 ifTrue: [^false].
index > externalSemaphoreSignalRequests size ifTrue:
[| newRequests newResponses |
newRequests := Array new: 1 << index highBit withAll: 0.
newResponses := newRequests copy.
newRequests
replaceFrom: 1
to: externalSemaphoreSignalRequests size
with: externalSemaphoreSignalRequests
startingAt: 1.
newResponses
replaceFrom: 1
to: externalSemaphoreSignalResponses size
with: externalSemaphoreSignalResponses
+ startingAt: 1.
+ externalSemaphoreSignalRequests := newRequests.
+ externalSemaphoreSignalResponses := newResponses].
- startingAt: 1].
externalSemaphoreSignalRequests
at: index
put: (externalSemaphoreSignalRequests at: index) + 1.
^true!
More information about the Vm-dev
mailing list