<div class="gmail_quote">On Thu, Sep 24, 2009 at 10:40 AM, Jonas Sicking <span dir="ltr">&lt;jonas@sicking.cc&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On Thu, Sep 24, 2009 at 1:17 AM, Darin Fisher &lt;<a href="mailto:darin@chromium.org">darin@chromium.org</a>&gt; wrote:<br>
&gt; On Thu, Sep 24, 2009 at 12:20 AM, Jonas Sicking &lt;jonas@sicking.cc&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Sep 23, 2009 at 10:19 PM, Darin Fisher &lt;<a href="mailto:darin@chromium.org">darin@chromium.org</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Wed, Sep 23, 2009 at 8:10 PM, Jonas Sicking &lt;jonas@sicking.cc&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Wed, Sep 23, 2009 at 3:29 PM, Jeremy Orlow &lt;<a href="mailto:jorlow@chromium.org">jorlow@chromium.org</a>&gt;<br>
&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt; On Wed, Sep 23, 2009 at 3:15 PM, Jonas Sicking &lt;jonas@sicking.cc&gt;<br>
&gt;&gt; &gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; On Wed, Sep 23, 2009 at 2:53 PM, Brett Cannon &lt;<a href="mailto:brett@python.org">brett@python.org</a>&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; On Wed, Sep 23, 2009 at 13:35, Jeremy Orlow &lt;<a href="mailto:jorlow@chromium.org">jorlow@chromium.org</a>&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; What are the use cases for wanting to store data beyond strings<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; (and<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; what<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; can be serialized into strings) in LocalStorage?  I can&#39;t think<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; of<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; any<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; that<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; outweigh the negatives:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; 1)  From previous threads, I think it&#39;s fair to say that we can<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; all<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; agreed<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; that LocalStorage is a regrettable API (mainly due to its<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; synchronous<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; nature).  If so, it seems that making it more powerful and thus<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; attractive to developers is just asking for trouble.  After all,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; people use it, the more lock contention there&#39;ll be, and the more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; browser UI<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; jank users will be sure to experience.  This will also be worse<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; because<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; it&#39;ll be easier for developers to store large objects in<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; LoaclStorage.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; 2)  As far as I can tell, there&#39;s no where else in the spec where<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; you<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; have<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; to serialize structured clone(able) data to disk.  Given that<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; LocalStorage<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; is supposed to throw an exception if any ImageData is contained<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; and<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; since<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; File and FileData objects are legal, it seems as though making<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; LocalStorage<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; handle structured clone data has a fairly high cost to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; implementors.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;  Not to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; mention that disallowing ImageData in only this one case is not<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; intuitive.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; I think allowing structured clone(able) data in LocalStorage is a<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; big<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; mistake.  Enough so that, if SessionStorage and LocalStorage<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; can&#39;t<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; diverge<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; on this issue, it&#39;d be worth taking the power away from<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; SessionStorage.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt; J<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Speaking from experience, I have been using localStorage in my PhD<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; thesis work w/o any real need for structured clones (I would have<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; used<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; Web Database but it isn&#39;t widely used yet and I was not sure if it<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; was<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; going to make the cut in the end). All it took to come close to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; simulating structured clones now was to develop my own<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; compatibility<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; wrapper for localStorage (<a href="http://realstorage.googlecode.com" target="_blank">http://realstorage.googlecode.com</a> for<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; those<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; who care) and add setJSONObject() and getJSONObject() methods on<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; wrapper. Works w/o issue.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Actually, this seems like a prime reason *to* add structured storage<br>
&gt;&gt; &gt;&gt; &gt;&gt; support. Obviously string data wasn&#39;t enough for you so you had to<br>
&gt;&gt; &gt;&gt; &gt;&gt; write extra code in order to work around that. If structured clones<br>
&gt;&gt; &gt;&gt; &gt;&gt; had been natively supported you both would have had to write less<br>
&gt;&gt; &gt;&gt; &gt;&gt; code, and the resulting algorithms would have been faster. Faster<br>
&gt;&gt; &gt;&gt; &gt;&gt; since the browser can serialize/parser to/from a binary internal<br>
&gt;&gt; &gt;&gt; &gt;&gt; format faster than to/from JSON through the JSON serializer/parser.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Yes, but since LocalStorage is already widely deployed, authors are<br>
&gt;&gt; &gt;&gt; &gt; stuck<br>
&gt;&gt; &gt;&gt; &gt; with the the structured clone-less version of LocalStorage for a very<br>
&gt;&gt; &gt;&gt; &gt; long<br>
&gt;&gt; &gt;&gt; &gt; time.  So the only way an app can store anything that can&#39;t be<br>
&gt;&gt; &gt;&gt; &gt; JSONified<br>
&gt;&gt; &gt;&gt; &gt; is<br>
&gt;&gt; &gt;&gt; &gt; to break backwards compatibility.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; On Wed, Sep 23, 2009 at 3:11 PM, Jonas<br>
&gt;&gt; &gt;&gt; &gt; Sicking &lt;jonas@sicking.cc&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; On Wed, Sep 23, 2009 at 1:35 PM, Jeremy Orlow &lt;<a href="mailto:jorlow@chromium.org">jorlow@chromium.org</a>&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; What are the use cases for wanting to store data beyond strings<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; (and<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; what<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; can be serialized into strings) in LocalStorage?  I can&#39;t think of<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; any<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; that<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; outweigh the negatives:<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; 1)  From previous threads, I think it&#39;s fair to say that we can<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; all<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; agreed<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; that LocalStorage is a regrettable API (mainly due to its<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; synchronous<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; nature).  If so, it seems that making it more powerful and thus<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; attractive to developers is just asking for trouble.  After all,<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; people use it, the more lock contention there&#39;ll be, and the more<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; browser UI<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; jank users will be sure to experience.  This will also be worse<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; because<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; it&#39;ll be easier for developers to store large objects in<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; LoaclStorage.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; 2)  As far as I can tell, there&#39;s no where else in the spec where<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; you<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; have<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; to serialize structured clone(able) data to disk.  Given that<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; LocalStorage<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; is supposed to throw an exception if any ImageData is contained<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; and<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; since<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; File and FileData objects are legal, it seems as though making<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; LocalStorage<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; handle structured clone data has a fairly high cost to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; implementors.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;  Not to<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; mention that disallowing ImageData in only this one case is not<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; intuitive.<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; I think allowing structured clone(able) data in LocalStorage is a<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; big<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; mistake.  Enough so that, if SessionStorage and LocalStorage can&#39;t<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; diverge<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; on this issue, it&#39;d be worth taking the power away from<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt; SessionStorage.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Despite localStorage unfortunate locking contention problem, it&#39;s<br>
&gt;&gt; &gt;&gt; &gt;&gt; become quite a popular API. It&#39;s also very successful in terms of<br>
&gt;&gt; &gt;&gt; &gt;&gt; browser deployment since it&#39;s available in at least latest versions<br>
&gt;&gt; &gt;&gt; &gt;&gt; of<br>
&gt;&gt; &gt;&gt; &gt;&gt; IE, Safari, Firefox, and Chrome. Don&#39;t know about support in Opera?<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; The more popular it becomes, the more it&#39;s going to hurt UA<br>
&gt;&gt; &gt;&gt; &gt; developers,<br>
&gt;&gt; &gt;&gt; &gt; web<br>
&gt;&gt; &gt;&gt; &gt; developers, and users.  I don&#39;t see why this is an argument for<br>
&gt;&gt; &gt;&gt; &gt; making<br>
&gt;&gt; &gt;&gt; &gt; it<br>
&gt;&gt; &gt;&gt; &gt; more powerful.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; How will it hurt UA developers? I think we&#39;re stuck forever to<br>
&gt;&gt; &gt;&gt; implement the locking mechanism. Adding more datatypes to the API<br>
&gt;&gt; &gt;&gt; doesn&#39;t mean that we&#39;ll have to implement it more.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; multi-core is the future.  what&#39;s the opposite of fine-grained locking?<br>
&gt;&gt; &gt;  it&#39;s not good ;-)<br>
&gt;&gt; &gt; the implicit locking mechanism as spec&#39;d is super lame.  implicitly<br>
&gt;&gt; &gt; unlocking under<br>
&gt;&gt; &gt; mysterious-to-the-developer circumstances!  how can that be a good<br>
&gt;&gt; &gt; thing?<br>
&gt;&gt; &gt; storage.setItem(&quot;y&quot;,<br>
&gt;&gt; &gt; function_involving_implicit_unlocking(storage.getItem(&quot;x&quot;)));<br>
&gt;&gt;<br>
&gt;&gt; I totally agree on all points. The current API has big imperfections.<br>
&gt;&gt; However I haven&#39;t seen any workable counter proposals so far, and I<br>
&gt;&gt; honestly don&#39;t believe there are any as long as our goals are:<br>
&gt;&gt;<br>
&gt;&gt; * Don&#39;t break existing users of the current implementations.<br>
&gt;&gt; * Don&#39;t expose race conditions to the web.<br>
&gt;&gt; * Don&#39;t rely on authors getting explicit locking mechanisms right.<br>
&gt;&gt;<br>
&gt;<br>
&gt; The current API exposes race conditions to the web.  The implicit<br>
&gt; dropping of the storage lock is that.  In Chrome, we&#39;ll have to drop<br>
&gt; an existing lock whenever a new lock is acquired.  That can happen<br>
&gt; due to a variety of really odd cases (usually related to nested loops<br>
&gt; or nested JS execution), which will be difficult for developers to<br>
&gt; predict, especially if they are relying on third-party JS libraries.<br>
&gt; This issue seems to be discounted for reasons I do not understand.<br>
<br>
</div></div>I don&#39;t believe we&#39;ve heard about this before, so that would be the<br>
reason it hasn&#39;t been taken into account.<br>
<br>
So you&#39;re saying that chrome would be unable implement the current<br>
storage mutex as specified in spec? I.e. one that is only released at<br>
the explicit points that the spec defines? That seems like a huge<br>
problem.<br></blockquote><div><br></div><div>No, no... my point is that to the application developer, those &quot;explicit&quot;</div><div>points will appear quite implicit and mysterious.  This is why I called</div><div>
out third-party JS libraries.  One day, a function that you are using</div><div>might transition to scripting a plugin, which might cause a nested</div><div>loop, which could then force the lock to be released.  As a programmer,</div>
<div>the unlocking is not explicit or predictable.</div><div><br></div><div>Moreover, there are other examples which have been discussed on the</div><div>list.  There are some DOM operations that can result in a frame receiving</div>
<div>a DOM event synchronously.  That can result in a nesting of storage locks,</div><div>which can force us to have to implicitly unlock the outermost lock to avoid</div><div>deadlocks.  Again, the programmer will have very poor visibility into when</div>
<div>these things can happen.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5"><br>
&gt;&gt; But, as imperfect as the current API is, I think the following is a<br>
&gt;&gt; decent way forward:<br>
&gt;&gt;<br>
&gt;&gt; * Allow pages that want the convenience of localStorage to use it. For<br>
&gt;&gt; multi-process browsers this will mean poor UI *for pages that use<br>
&gt;&gt; localStorage*. Especially when said pages hold on to localStorage for<br>
&gt;&gt; a long time.<br>
&gt;&gt; * Add alternative APIs that don&#39;t suffer from the same problems. More<br>
&gt;&gt; below.<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; In addition, this argument assumes that Microsoft (and other UAs)<br>
&gt;&gt; &gt;&gt; &gt; will<br>
&gt;&gt; &gt;&gt; &gt; implement the structured clone version of LocalStorage.  Has anyone<br>
&gt;&gt; &gt;&gt; &gt; (or<br>
&gt;&gt; &gt;&gt; &gt; can<br>
&gt;&gt; &gt;&gt; &gt; anyone) from Microsoft comment on this?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Given that I&#39;ve never heard microsoft commit to a webstandard, ever, I<br>
&gt;&gt; &gt;&gt; doubt that we&#39;ll hear anything here. Or that the lack of hearing<br>
&gt;&gt; &gt;&gt; anything means we can draw any conclusions.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; This is not a small feature to add.  Yes, it&#39;s smaller than creating<br>
&gt;&gt; &gt;&gt; &gt; a<br>
&gt;&gt; &gt;&gt; &gt; new<br>
&gt;&gt; &gt;&gt; &gt; storage mechanism (that everyone is willing to adopt), but I still<br>
&gt;&gt; &gt;&gt; &gt; think<br>
&gt;&gt; &gt;&gt; &gt; that&#39;s what we should be looking at.  Rather than polishing a turd.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I do think that localStorage is a decent API that developers will want<br>
&gt;&gt; &gt;&gt; to, and should, use. I think looking into adding a async accessor to<br>
&gt;&gt; &gt;&gt; get a storage object so that people can use an localStorage-like API<br>
&gt;&gt; &gt;&gt; while avoiding risks of blocking. This would also allow sharing data<br>
&gt;&gt; &gt;&gt; between worker threads and the main window.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; i think the async callback to get a storage object is an improvement,<br>
&gt;&gt; &gt; but<br>
&gt;&gt; &gt; i&#39;m not sure that it addresses all of the problems.  for example, if a<br>
&gt;&gt; &gt; worker<br>
&gt;&gt; &gt; wants to read values from storage, compute, and then put a value into<br>
&gt;&gt; &gt; storage, it would probably do all of this from the storage callback.<br>
&gt;&gt; &gt;  that<br>
&gt;&gt; &gt; would result in holding the lock for a long time, which would lock out<br>
&gt;&gt; &gt; any<br>
&gt;&gt; &gt; other threads, including non-worker threads.<br>
&gt;&gt; &gt; the problem here is that localStorage is a pile of global variables.  we<br>
&gt;&gt; &gt; are<br>
&gt;&gt; &gt; trying to give people global variables without giving them tools to<br>
&gt;&gt; &gt; synchronize<br>
&gt;&gt; &gt; access to them.  the claim i&#39;ve heard is that developers are not savy<br>
&gt;&gt; &gt; enough<br>
&gt;&gt; &gt; to use those tools properly.  i agree that developers tend to use tools<br>
&gt;&gt; &gt; without<br>
&gt;&gt; &gt; fully understanding them.  ok, but then why are we giving them global<br>
&gt;&gt; &gt; variables?<br>
&gt;&gt; &gt; there has to be a better answer.<br>
&gt;&gt;<br>
&gt;&gt; I actually described an potential solution in the thread on worker<br>
&gt;&gt; storage.<br>
&gt;&gt;<br>
&gt;&gt; The problem you describe is a worker holding on the the storage for an<br>
&gt;&gt; very long (indefinite) time, thereby locking out other threads/windows<br>
&gt;&gt; from accessing the same storage area. This seems inevitable if we want<br>
&gt;&gt; to prevent race conditions while at the same time not forcing the<br>
&gt;&gt; complexities of locks onto web developers. The WebDatabase API suffers<br>
&gt;&gt; from exactly the same problem.<br>
&gt;<br>
&gt; Hmm... are you saying that from the SQLStatementCallback used to read<br>
&gt; some data out of the database, you might compute on that data, and then<br>
&gt; issue an executeSql call to write a computed result, and that in this<br>
&gt; scenario,<br>
&gt; the fact that it is the same transaction means that other threads are locked<br>
&gt; out of accessing the same database?  I hadn&#39;t considered chaining executeSql<br>
&gt; calls like this to keep the transaction alive.  Hmm...<br>
<br>
</div></div>Indeed.<br>
<div><div></div><div class="h5"><br>
&gt;&gt; However, we can lessen the problem. By adding multiple storage areas,<br>
&gt;&gt; we can allow a worker to use one storage area, while allowing other<br>
&gt;&gt; parties to simultaneously use other storage areas. This way, if a<br>
&gt;&gt; worker and a window aren&#39;t sharing data at all, they never get in the<br>
&gt;&gt; way of each other.<br>
&gt;&gt;<br>
&gt;&gt; So a very simplistic design would be something like the following:<br>
&gt;&gt;<br>
&gt;&gt; getStorageArea(name, callback)<br>
&gt;&gt;<br>
&gt;&gt; when called will asynchronously call the callback parameter once the<br>
&gt;&gt; storage area named by the first parameter becomes available. The<br>
&gt;&gt; callback receives the storage area as an argument. We would also have<br>
&gt;&gt; the function<br>
&gt;&gt;<br>
&gt;&gt; getMultipleStorageAreas(names, callback)<br>
&gt;&gt;<br>
&gt;&gt; Same as above, but names is an array of strings indicating multiple<br>
&gt;&gt; storage areas that need to be acquired before the callback is called.<br>
&gt;&gt; The callback receives all the areas in an array as an argument. This<br>
&gt;&gt; function allows transferring data between multiple storage areas<br>
&gt;&gt; without risking racing.<br>
&gt;&gt;<br>
&gt;&gt; There&#39;s several problems with this, such as the names are sort of<br>
&gt;&gt; crappy, and that getting storage areas an array isn&#39;t very friendly.<br>
&gt;&gt; However you get the basic idea.<br>
&gt;&gt;<br>
&gt;&gt; We don&#39;t even need to use Storage objects for this. In fact, I hope<br>
&gt;&gt; mozilla will in a not too distant future come up with an alternative<br>
&gt;&gt; proposal to the WebDatabase SQL API. Something like this might fit<br>
&gt;&gt; into such a proposal as I think that&#39;ll have multiple separate storage<br>
&gt;&gt; areas anyway.<br>
&gt;&gt;<br>
&gt;&gt; / Jonas<br>
&gt;<br>
&gt;<br>
&gt; Maybe we should just invent a similar transaction method for name/value<br>
&gt; storage?  Wouldn&#39;t that be better than inventing a new idiom?  Ideally,<br>
&gt; we&#39;d also make reads and writes on storage be asynchronous.  The<br>
&gt; transaction would then be usable to hold the lock across multiple<br>
&gt; asynchronous reads and writes.  Since local storage is backed by disk,<br>
&gt; it seems like a more ideal local storage API would not require synchronous<br>
&gt; filesystem access.<br>
<br>
</div></div>Not quite following what you&#39;re suggesting, but there&#39;s lots of ways<br>
to design this. The critical part is to allow grabbing (with<br>
associated locking) of just a subset of the available storage space.<br>
<font color="#888888"><br>
/ Jonas<br>
</font></blockquote></div><br><div><br></div><div>I was suggesting that we only provide asynchronous getItem / setItem calls, where</div><div>each call is parameterized by a transaction.  This is how database works.</div>
<div><br></div><div>-Darin</div>