[Vm-dev] VM Maker: VMMaker.oscog-eem.2566.mcz

Eliot Miranda eliot.miranda at gmail.com
Sat Sep 21 16:46:35 UTC 2019


On Sat, Sep 21, 2019 at 5:20 AM Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com> wrote:

>
>
>
> Le jeu. 19 sept. 2019 à 06:26, <commits at source.squeak.org> a écrit :
>
>>
>> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
>> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2566.mcz
>>
>> ==================== Summary ====================
>>
>> Name: VMMaker.oscog-eem.2566
>> Author: eem
>> Time: 18 September 2019, 9:23:01.791049 pm
>> UUID: 71a20c6c-db1d-45e9-b85d-54aa2fd0cf8e
>> Ancestors: VMMaker.oscog-eem.2565
>>
>> Simulator:
>> Complete the simulation support for the SocketTest suite tests.
>> Make sure that the processes spawned by the SocketPluginSimulator run at
>> a higher priority than the VM simulator and that they do not preempt it
>> until they are all spawned.
>> Fix a slip in SocketPluginSimulator>>closeAndDestroy:.
>>
>> =============== Diff against VMMaker.oscog-eem.2565 ===============
>>
>> Item was changed:
>>   ----- 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 messageText]!
>> -               do: [:ex| Transcript cr; show: ex message]!
>>
>> Item was changed:
>>   ----- 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 ourPriority |
>> -       | 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. But a)
>> run them at one higher than the current priority, and
>> +        b) ensure that they all effectively resume at the same time;
>> i.e. ensure this code doesn;t get preempted by the first
>> +        process to start running."
>> +       ourPriority := Processor activePriority.
>> +       [({blockOne. blockTwo. blockThree}
>> +                               collect: [:b| b newProcess priority:
>> ourPriority + 1; yourself])
>> +                       do: [:each| each resume]]
>> +               valueAt: ourPriority + 2!
>> -        will get garbage collected, along with these processes."
>> -       blockOne fork.
>> -       blockTwo fork.
>> -       blockThree fork!
>>
>> Item was added:
>> + ----- Method:
>> SocketPluginSimulator>>primitiveSocketListenWithOrWithoutBacklog (in
>> category 'primitives') -----
>> + primitiveSocketListenWithOrWithoutBacklog
>> +       "This is a hack to get around limitations in the simulated
>> dispatch of smart syntax primitives."
>> +       interpreterProxy methodArgumentCount = 2 ifTrue:
>> +               ["self primitive: 'primitiveSocketListenOnPort'
>> parameters: #(#Oop #SmallInteger)"
>> +                ^self primitiveSocket: (interpreterProxy stackValue: 1)
>> +                               listenOnPort: (interpreterProxy
>> stackIntegerValue: 0)].
>> +       "self primitive: 'primitiveSocketListenOnPortBacklog' parameters:
>> #(#Oop #SmallInteger #SmallInteger)"
>> +       ^self primitiveSocket: (interpreterProxy stackValue: 1)
>> +               listenOnPort: (interpreterProxy stackIntegerValue: 0)
>> +               backlogSize: (interpreterProxy stackIntegerValue: 0)!
>>
> Is this correct? Or shouldn't it be:
>
>        ^self primitiveSocket: (interpreterProxy stackValue: 2)
>                listenOnPort: (interpreterProxy stackIntegerValue: 1)
>                backlogSize: (interpreterProxy stackIntegerValue: 0)!
>

Oops!! Thanks!


>
> In VMMaker.oscog-nice.2565 I dispatched to the simulator so that it can
> use its doesNotUnderstand trick...
>      interpreterProxy methodArgumentCount = 2
>          ifTrue:[^simulator primitiveSocketListenOnPort]
>          ifFalse:[^simulator primitiveSocketListenOnPortBacklog]
>
> It might be slower, but avoid duplicating too much code...
>
>>
>> Item was added:
>> + ----- Method: SocketPluginSimulator>>sqSocket:ListenOnPort: (in
>> category 'simulation') -----
>> + sqSocket: socketHandle ListenOnPort: portNumber
>> +       ^[Socket basicNew
>> +                       primSocket: ((self
>> hostSocketHandleFromSimSocketHandle: socketHandle) ifNil: [^self])
>> +                       listenOn: portNumber]
>> +               on: SocketPrimitiveFailed
>> +               do: [:ex|
>> +                       interpreterProxy primitiveFail.
>> +                       0]!
>>
>> Item was added:
>> + ----- Method: SocketPluginSimulator>>sqSocketLocalPort: (in category
>> 'simulation') -----
>> + sqSocketLocalPort: socketHandleCArray
>> +       ^[Socket basicNew
>> +                       primSocketLocalPort: ((self
>> hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^false])]
>> +               on: SocketPrimitiveFailed
>> +               do: [:ex|
>> +                       interpreterProxy primitiveFail.
>> +                       false]!
>>
>>

-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20190921/d09ee468/attachment-0001.html>


More information about the Vm-dev mailing list