I am not aware of any way to implement my described scenario using WeakMaps without having the same cycle collection issues. I haven't seen any examples of WeakMap used for this in the wild either.
On Thu, Nov 7, 2013 at 2:48 PM, felix lee <[email protected]> wrote: > That example looks to me like it could be implemented with WeakMap instead > of WeakRef. Am I missing something? > > > On Thu Nov 07 2013 at 2:43:45 PM, K. Gadd <[email protected]> wrote: > >> I'll try and restate an example I used before. >> >> Let's say you're building a somewhat simple tab-based application, where >> each tab represents a different 'mode'. In this case, you need a higher >> level coordinating object that manages the tab bar, and it needs to own >> references to all of the active modes in order to manage the tabs. >> Similarly, each mode may need to have a reference to the coordinator in >> order to interact with it - like by setting the title of the tab, or >> opening a new tab containing another mode - and it may need to have >> references to other modes in order to communicate (like if one tab opens a >> tab containing related information). >> >> In a model like that, you can trivially end up with object cycles. All >> the references (going in every direction) are strong, so to successfully >> collect a mode you need to ensure that every reference to it from live >> objects is released. This is problematic because it means that, for example: >> >> If Mode A opens a new tab containing Mode B, and Mode A wants to respond >> to things happening in Mode B, Mode A now has to register some sort of >> event listener on Mode B. This means that Mode A and Mode B have now formed >> a strong cycle: Mode B's event listener list contains a strong reference to >> Mode A (to fire the event notification), and Mode A has a strong reference >> to Mode B in order to be able to respond to those events. >> >> Now, if you close Mode B, the coordinator gets rid of the tab and drops >> its strong references to Mode B - the tab is 'gone' - but there's no >> trivial way to ensure that everyone else holding a reference to it is dead. >> If multiple tabs interact in this way it's possible for a huge graph of >> objects to be hanging off one live tab. Eventually, if you close enough >> tabs you might 'free' the graph, but if you aren't careful the coordinator >> itself can end up keeping dead tabs alive, with things like event listener >> lists. >> >> In the real apps I've worked on like this, the solution was some form of >> weak references - making event listeners own weak self-references instead >> of strong self-references, so that in normal circumstances event >> subscriptions expire along with the subscriber, along with using weak >> references directly in cases like 'tab a spawns tab b' in order to ensure >> that you aren't keeping an object alive just to monitor it. >> >> IIRC, cycles like this are already common in some DOM scenarios, where >> event subscription and such result in big graphs of objects hanging off a >> single live object? I've certainly run into it in a few cases, where an >> event listener hanging off an <audio> element caused a huge graph of >> objects to leak, and I had to manually remove the event listeners at an >> appropriate time (and finding an appropriate time can be difficult!) >> >> >> On Thu, Nov 7, 2013 at 2:33 PM, Mark S. Miller <[email protected]>wrote: >> >> Could you give an example, hopefully simple, of such a problem you can >> solve better with GC + weakmaps + weakrefs but without finalization, vs >> just GC + weakmaps ? Thanks. >> >> >> On Thu, Nov 7, 2013 at 1:46 PM, K. Gadd <[email protected]> wrote: >> >> When I talk about the importance of weak references I am *not* talking >> about the importance of finalization for managing native/remote resources; >> that's an important consideration but it's a separate one. When I talk >> about why weak references are important, I mean for the purposes of >> building large applications without creating uncollectable cycles in object >> graphs. Doing this without weak references is *very* difficult in some >> scenarios, and in other scenarios requires manual management of all object >> lifetimes (addref/release style, or having a single lifetime owner that >> 'deletes' an object on demand). >> >> That's the sort of obstacle that factors into a developer's choice of >> language and toolset. I've seen this particular concern with ES crop up in >> the past on real projects, and I've seen firsthand how difficult it is to >> avoid uncollectable cycles in a language environment without any sort of >> weak reference mechanism. Leaking large uncollectable cycles can have >> catastrophic consequences in multimedia applications and games, where those >> cycles might be retaining images or sounds or other huge game assets. >> >> >> On Thu, Nov 7, 2013 at 9:19 AM, Terrence Cole <[email protected]> wrote: >> >> On 11/06/2013 07:37 PM, K. Gadd wrote: >> > Generally speaking, all the discussions on this list about WRs so far >> have >> > not suggested that there is any way to introduce WeakRefs without >> making GC >> > behavior observable in some fashion. WeakRefs functionally make GC >> > observable because when you try to get at the target of the weakref, you >> > either get it or you don't. Once you introduce the ability to get back >> > 'null' when asking for the target of a WR (or any similar failure case), >> > you can use that to determine things about GC behavior. >> > >> > If you somehow eliminate this weakness, WRs no longer solve the problems >> > they are intended to solve. Or at the least, they solve only a small >> > reduced subset of the problems solved in real software via the use of >> weak >> > references. Being able to access the target of the WR (and have this >> > operation fail) is core to their value (even if finalization >> notifications >> > are also used quite often). >> > >> > I've already argued in the past about why weak references are important, >> > and why not having solutions for those problems will kneecap the >> > development of web applications by either preventing certain types of >> > software from running in the browser, or forcing implementers to write >> > their own GCs (or entire runtime environments) inside the browser, as is >> > done with environments like emscripten and native client. Once that >> becomes >> > the solution, the ES spec is irrelevant for those applications because >> they >> > have had to abandon the language. While the risk of something like this >> > happening is still relatively low, the risk increases over time as more >> > people begin seriously considering solutions like emscripten and nacl - >> > we're starting to see companies ship real products using them already. >> If >> > this spreads to popular reusable libraries (physics libraries, rendering >> > libraries, etc), there's a risk that those libraries will pull new >> > applications out of the ES realm because it's not possible to use those >> > libraries without abandoning ES in favor of a custom GC/runtime >> environment. >> > >> > Based on the conversations thus far, a choice just has to be made >> between >> > the two downsides: exposing some amount of GC internals, or making it >> > impossible to write some subset of applications in ES. It's possible >> that >> > exposing GC semantics has such catastrophic security consequences that >> > ruling those applications out is merited. It's also possible that >> > workarounds can be applied to reduce the harm of GC visibility (I think >> in >> > the past someone - maybe Mark? - suggested that disabling cross-realm >> WRs >> > would mitigate the damage considerably?) >> >> This is a false dichotomy. At the extreme, we could simply ship a new >> builtin resource manager which has it's own GC behaviour that we can >> expose at will. Given that the sorts of resources that people want to >> use the memory GC to manage generally have very different cost and >> volume tradeoffs than memory [1], this is actually much more reasonable >> than it sounds. >> >> The real problem with weak things is that they do have a performance >> impact on the GC, even when not used. Missing weak-maps can at least be >> worked around; a slow environment cannot. >> >> -Terrence >> >> 1 - >> >> http://www.mail-archive.com/[email protected]/msg00572.html >> >> > On Wed, Nov 6, 2013 at 3:23 PM, Oliver Hunt <[email protected]> wrote: >> > >> >> On Nov 6, 2013, at 3:14 PM, Rick Waldron <[email protected]> >> wrote: >> >> >> >> >> >> >> >> >> >> On Wed, Nov 6, 2013 at 2:15 PM, Domenic Denicola < >> >> [email protected]> wrote: >> >> >> >>> Thanks Mark for the education, especially on the pre- vs. post-morterm >> >>> finalization distinction. I don't think I was specifically advocating >> for >> >>> pre-mortem in my OP, since I didn't really understand the difference >> :P. >> >>> Post-mortem finalization sounds quite reasonable. What do people >> think of >> >>> introducing it into ECMAScript? >> >>> >> >> >> >> This may be a naïve question, but how would the handler know which >> >> object/weakref had been gc'ed? >> >> >> >> You wouldn’t :) >> >> >> >> I’m kind of anti-finalisers in JS for all of the reasons people have >> >> raised - they are extremely hazardous, expose non-deterministic >> behaviour, >> >> etc >> >> >> >> Given our general desire to avoid exposing internal GC semantics, and >> the >> >> difficulty in defining observable GC behaviour (I suspect this would >> be a >> >> non-starter in any case), I can’t see any specification that would >> allow >> >> useful finalisers or WeakRefs. >> >> >> >> If MarkM has an idea for WeakRefs that don’t leak observable GC >> behaviour >> >> i’d love to hear, but in general i’m opposed to both them and >> finalisers :-/ >> >> >> >> —Oliver >> >> >> >> Rick >> >> >> >> _______________________________________________ >> >> es-discuss mailing list >> >> [email protected] >> >> https://mail.mozilla.org/listinfo/es-discuss >> >> >> >> >> >> >> >> _______________________________________________ >> >> es-discuss mailing list >> >> [email protected] >> >> https://mail.mozilla.org/listinfo/es-discuss >> >> >> >> >> > >> > >> > >> > _______________________________________________ >> > es-discuss mailing list >> > [email protected] >> > https://mail.mozilla.org/listinfo/es-discuss >> > >> >> >> >> >> >> -- >> Cheers, >> --MarkM >> >> >>
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

