<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le jeu. 19 sept. 2019 à 06:26, <<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <br>
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2566.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2566.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-eem.2566<br>
Author: eem<br>
Time: 18 September 2019, 9:23:01.791049 pm<br>
UUID: 71a20c6c-db1d-45e9-b85d-54aa2fd0cf8e<br>
Ancestors: VMMaker.oscog-eem.2565<br>
<br>
Simulator:<br>
Complete the simulation support for the SocketTest suite tests.<br>
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.<br>
Fix a slip in SocketPluginSimulator>>closeAndDestroy:.<br>
<br>
=============== Diff against VMMaker.oscog-eem.2565 ===============<br>
<br>
Item was changed:<br>
  ----- Method: SocketPluginSimulator>>closeAndDestroy: (in category 'initialize-release') -----<br>
  closeAndDestroy: socketHandle<br>
        "c.f. Socket closeAndDestroy: timeoutSeconds"<br>
        | fakeSocket |<br>
        fakeSocket := Socket basicNew.<br>
        [(fakeSocket primSocketConnectionStatus: socketHandle) = (Socket classPool at: #Connected) ifTrue:<br>
                [fakeSocket primSocketCloseConnection: socketHandle].<br>
         fakeSocket<br>
                primSocketAbortConnection: socketHandle;<br>
                primSocketDestroy: socketHandle]<br>
                on: SocketPrimitiveFailed<br>
+               do: [:ex| Transcript cr; show: ex messageText]!<br>
-               do: [:ex| Transcript cr; show: ex message]!<br>
<br>
Item was changed:<br>
  ----- Method: SocketPluginSimulator>>map:to:type:register:spawning:and:and: (in category 'simulation support') -----<br>
  map: hostSocketHandle to: simSockPtr type: socketType register: semaphores spawning: blockOne and: blockTwo and: blockThree<br>
+       | simSocket ourPriority |<br>
-       | simSocket |<br>
        "SQSocket is typedef struct { int sessionID; int socketType; void *privateSocketPtr; } SQSocket"<br>
        simSocket := ByteArray new: (self sizeof: #SQSocket).<br>
        simSocket<br>
                unsignedLongAt: 1 put: interpreterProxy getThisSessionID;<br>
                unsignedLongAt: 5 put: socketType.<br>
        simSocket size = 12<br>
                ifTrue: [simSocket unsignedLongAt: 9 put: (fakeAddressCounter := fakeAddressCounter + 64)]<br>
                ifFalse: [simSocket unsignedLongLongAt: 9 put: (fakeAddressCounter := fakeAddressCounter + 80)].<br>
        self assert: ((interpreterProxy isBytes: simSockPtr cPtrAsOop)<br>
                                and: [(interpreterProxy numBytesOf: simSockPtr cPtrAsOop) = simSocket size]).<br>
        1 to: simSocket size do:<br>
                [:i| simSockPtr at: i - 1 put: (simSocket at: i)].<br>
        self assert: (self simSocketHandleFrom: simSockPtr) = simSocket.<br>
        openSocketHandles add: hostSocketHandle.<br>
        hostSocketToSimSocketMap at: hostSocketHandle put: simSocket.<br>
        simSocketToHostSocketMap at: simSocket put: hostSocketHandle.<br>
        externalSemaphores addAll: semaphores.<br>
        "N.B. These don't need registering.  Eventually they will end up<br>
         waiting on semaphores that have been unregistered, and hence<br>
+        will get garbage collected, along with these processes. But a) run them at one higher than the current priority, and<br>
+        b) ensure that they all effectively resume at the same time; i.e. ensure this code doesn;t get preempted by the first<br>
+        process to start running."<br>
+       ourPriority := Processor activePriority.<br>
+       [({blockOne. blockTwo. blockThree}<br>
+                               collect: [:b| b newProcess priority: ourPriority + 1; yourself])<br>
+                       do: [:each| each resume]]<br>
+               valueAt: ourPriority + 2!<br>
-        will get garbage collected, along with these processes."<br>
-       blockOne fork.<br>
-       blockTwo fork.<br>
-       blockThree fork!<br>
<br>
Item was added:<br>
+ ----- Method: SocketPluginSimulator>>primitiveSocketListenWithOrWithoutBacklog (in category 'primitives') -----<br>
+ primitiveSocketListenWithOrWithoutBacklog<br>
+       "This is a hack to get around limitations in the simulated dispatch of smart syntax primitives."<br>
+       interpreterProxy methodArgumentCount = 2 ifTrue:<br>
+               ["self primitive: 'primitiveSocketListenOnPort' parameters: #(#Oop #SmallInteger)"<br>
+                ^self primitiveSocket: (interpreterProxy stackValue: 1)<br>
+                               listenOnPort: (interpreterProxy stackIntegerValue: 0)].<br>
+       "self primitive: 'primitiveSocketListenOnPortBacklog' parameters: #(#Oop #SmallInteger #SmallInteger)"<br>
+       ^self primitiveSocket: (interpreterProxy stackValue: 1)<br>
+               listenOnPort: (interpreterProxy stackIntegerValue: 0)<br>
+               backlogSize: (interpreterProxy stackIntegerValue: 0)!<br></blockquote><div>Is this correct? Or shouldn't it be:</div><div><br>
       ^self primitiveSocket: (interpreterProxy stackValue: 2)<br>
               listenOnPort: (interpreterProxy stackIntegerValue: 1)<br>
               backlogSize: (interpreterProxy stackIntegerValue: 0)!</div><div><br></div><div>In VMMaker.oscog-nice.2565 I dispatched to the simulator so that it can use its doesNotUnderstand trick...<br>            interpreterProxy methodArgumentCount = 2<br>                      ifTrue:[^simulator primitiveSocketListenOnPort]<br>                       ifFalse:[^simulator primitiveSocketListenOnPortBacklog]</div><div><br></div><div>It might be slower, but avoid duplicating too much code...<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Item was added:<br>
+ ----- Method: SocketPluginSimulator>>sqSocket:ListenOnPort: (in category 'simulation') -----<br>
+ sqSocket: socketHandle ListenOnPort: portNumber<br>
+       ^[Socket basicNew<br>
+                       primSocket: ((self hostSocketHandleFromSimSocketHandle: socketHandle) ifNil: [^self])<br>
+                       listenOn: portNumber]<br>
+               on: SocketPrimitiveFailed<br>
+               do: [:ex|<br>
+                       interpreterProxy primitiveFail.<br>
+                       0]!<br>
<br>
Item was added:<br>
+ ----- Method: SocketPluginSimulator>>sqSocketLocalPort: (in category 'simulation') -----<br>
+ sqSocketLocalPort: socketHandleCArray <br>
+       ^[Socket basicNew<br>
+                       primSocketLocalPort: ((self hostSocketHandleFromSimSocketHandle: socketHandleCArray) ifNil: [^false])]<br>
+               on: SocketPrimitiveFailed<br>
+               do: [:ex|<br>
+                       interpreterProxy primitiveFail.<br>
+                       false]!<br>
<br>
</blockquote></div></div>