On Dec 30, 2008, at 11:14 AM, David Levin wrote:

Problem
In XMLHttpRequest::didFinishLoading (WebCore/xml/ XMLHttpRequest.cpp), there is a call to the inspector like this: page->inspectorController()- >resourceRetrievedByXMLHttpRequest(m_loader ? m_loader- >identifier() : m_identifier, m_responseText);

The problem is that html 5 workers (and their XHR request code) don't run on the main thread. My fix for this was to send this information back to the main thread and do the call to inspector there. Unfortunately, this involves making a copy of m_responseText and m_responseText may be quite large, so this could be a bit perf hit.

Most of the time, m_responseText won't even get used by the inspector.


Proposal
I'm not sure. There are several ideas that I thought about but none that I'm satisfied with:

1. Make the call resourceRetrievedByXMLHttpRequest thread safe.
I suspect this may not be feasible due to the amount of work (but I haven't investigated this possibility in any depth).

I agree that this is not a good idea.


2. Only send the message to call resourceRetrievedByXMLHttpRequest back to the main thread (and do the copy of m_responseText) when the inspector is enabled.
This has two downsides:
a. The value of InspectorController::enabled may change after the Worker has started so the Worker would need to track that value. (Not too big of a deal but it does make the code slightly more complicated.) b. (Bigger issue) Nearly all developers will have the inspector enabled so this means that the code path will be significantly different for developers and most users.

Indeed, those are two serious downsides.


I'm hoping others may have some ideas or suggestions about what to do here.

I don't believe the m_responseText string will be modified by either side, so making the call on a background thread without copying will almost work, other than the threadsafety issue. Here's some possible alternatives that avoid the copy:

A) Change resourceRetrievedByXMLHttpRequest to expect a handle to later asynchronously receive the response text, rather than getting it immediately - that way the copy only needs to be done on demand by the worker thread (but the inspector's code could get a bit more complicated).

B) Make resourceRetrievedByXMLHttpRequest take a wrapper that locks around all operations that may affect refcounting and lazily makes a copy on demand when someone needs access to the raw underlying string - the worker thread would have to use a similar wrapper.

C) Change the code to use a class with thread-safe refcounting in all the places m_responseText would otherwise be used.

The basic idea here is that mutation is not a concern, only refcounting, so making a copy of a potentially large string is overkill and we should seek a solution narrowly tailored to the threadsafety of recounting.

Regards,
Maciej


_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to