Thanks Jonas!<div><br></div><div>So there is somewhat of a consensus on close() to effectively let a worker run normally until the exit from the current JS fragment. It makes sense for us as well.</div><div><br></div><div>
I think the only change to the spec here would be the removal of the 3rd line in the description of what close() does, so the ports are still functional, at least for posting from the worker:</div><div><br></div><div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
When a script invokes the close() method on a WorkerGlobalScope object, the user agent must run the following steps (atomically):</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<br></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
Discard any tasks that have been added to the event loop's task queues.</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
Set the worker's WorkerGlobalScope object's closing flag to true. (This prevents any further tasks from being queued.)</blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
Disentangle all the ports in the list of the worker's ports.</blockquote><div><br></div><div>.. which probably is not a big deal (hope Ian will chime in on this).</div><div><br></div><div>Not sure about onclose indeed...  Perhaps we can use some time to see if developers will request something like this more explicitly, then we could think about it more.</div>
<div><br></div><div>Dmitry</div></div><div><br><div class="gmail_quote">On Thu, Apr 1, 2010 at 3:31 PM, Jonas Sicking <span dir="ltr"><jonas@sicking.cc></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Wed, Mar 31, 2010 at 10:03 AM, ben turner <<a href="mailto:bent.mozilla@gmail.com">bent.mozilla@gmail.com</a>> wrote:<br>
</div><div><div></div><div class="h5">> Hi,<br>
><br>
> When implementing the close() function for Firefox we chose to set the<br>
> closing flag and clear pending events only. As the worker script is<br>
> calling close() on itself we figured that the worker should retain<br>
> maximum functionality until it has finished execution (otherwise it<br>
> could just not call close() and rely on some kind of postMessage() and<br>
> terminate() combo). Therefore we do not enforce any timeout for the<br>
> currently executing script and we continue to allow postMessage()<br>
> calls and synchronous XHR to proceed. Since the closing flag is set in<br>
> response to close() the worker is guaranteed to finish as soon as the<br>
> currently running script finishes. We always enforce a timeout for any<br>
> code that runs in response to the close event that gets fired after<br>
> the current script finishes, though.<br>
><br>
> If the code that calls close() never returns (like the while(1) { }<br>
> example above) then the worker will never finish, as pointed out<br>
> above, but that's no different than having a worker script that<br>
> consists only of a while(1) { } loop and we don't think it's important<br>
> to prevent. If a worker script is written in this way then a<br>
> terminate() call is still a valid solution.<br>
><br>
> Also, since we try to retain maximum functionality after close() we<br>
> also allow errors to propagate as shown above.<br>
><br>
> If anyone is curious the basic strategy we use in response to close<br>
> functions (like close(), terminate(), and for UA-generated events like<br>
> when the main worker object is GC'd) can be found in the following<br>
> table:<br>
><br>
> <a href="http://mxr.mozilla.org/mozilla-central/source/dom/src/threads/nsDOMWorker.h#202" target="_blank">http://mxr.mozilla.org/mozilla-central/source/dom/src/threads/nsDOMWorker.h#202</a><br>
<br>
</div></div>For what it's worth, I think the behavior that firefox has makes a lot<br>
of sense and I think it should be mandated by the spec. (I know, big<br>
shocker :) )<br>
<br>
The one thing that we do and that is somewhat iffy is the close event.<br>
Ben actually gets it a bit wrong in the description above. This is how<br>
it works:<br>
<br>
We fire the close event handler in four situations:<br>
<br>
* After close() is called by the worker, once it finishes its current execution.<br>
* After terminate() is called from outside the worker and any code<br>
running has been aborted.<br>
* If the worker is garbage collected.<br>
* Once the user leaves the page (or specifically, once the page falls<br>
out of the bfcache).<br>
<br>
Only in the last case do we give the close handler a time limit, after<br>
which any currently running close handler is aborted and no more close<br>
handlers are run.<br>
<br>
Though of course the user can leave the page *while* the close event<br>
is getting fired. If so, we start the time limit at that point.<br>
<br>
The iffy part is the third bullet above, since it exposes GC behavior.<br>
This is very unfortunate indeed and because of it I feel that our<br>
implementation is somewhat experimental.<br>
<br>
We could simply not fire the close event in that case, however this<br>
would seem to reduce the usefulness of the close event quite a bit.<br>
<br>
So I think for now I don't care if the close event is put in the spec<br>
or not. But I wanted to let you know what we're doing. We don't<br>
currently have any plans to remove it.<br>
<font color="#888888"><br>
/ Jonas<br>
</font></blockquote></div><br></div>