<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>