~free.ekanayaka/storm/any-expr

« back to all changes in this revision

Viewing changes to storm/variables.py

Merge variable-referenceset-leak [r=niemeyer,jkakar]

Change the way MutableValueVariable hooks up to the store event system, by
overriding get and set. This works around a leak discovered when using
PickleVariable in a ReferenceSet.

Show diffs side-by-side

added added

removed removed

Lines of Context:
523
523
    __slots__ = ("_event_system")
524
524
 
525
525
    def __init__(self, *args, **kwargs):
 
526
        self._event_system = None
526
527
        Variable.__init__(self, *args, **kwargs)
527
 
        self._event_system = None
528
 
        if self.event:
 
528
        if self.event is not None:
529
529
            self.event.hook("start-tracking-changes", self._start_tracking)
530
 
            self.event.hook("object-deleted", self._detect_deleted)
 
530
            self.event.hook("object-deleted", self._detect_changes)
531
531
 
532
532
    def _start_tracking(self, obj_info, event_system):
533
533
        self._event_system = event_system
534
 
        event_system.hook("flush", self._detect_changes)
535
534
        self.event.hook("stop-tracking-changes", self._stop_tracking)
536
535
 
537
536
    def _stop_tracking(self, obj_info, event_system):
538
537
        event_system.unhook("flush", self._detect_changes)
539
538
        self._event_system = None
540
539
 
541
 
    def _detect_deleted(self, obj_info):
542
 
        self._detect_changes(obj_info)
543
 
        if self._event_system is not None:
544
 
            self._stop_tracking(None, self._event_system)
545
 
 
546
540
    def _detect_changes(self, obj_info):
547
541
        if self.get_state() != self._checkpoint_state:
548
542
            self.event.emit("changed", self, None, self._value, False)
549
543
 
 
544
    def get(self, default=None, to_db=False):
 
545
        if self._event_system is not None:
 
546
            self._event_system.hook("flush", self._detect_changes)
 
547
        return super(MutableValueVariable, self).get(default, to_db)
 
548
 
 
549
    def set(self, value, from_db=False):
 
550
        if self._event_system is not None:
 
551
            if isinstance(value, LazyValue):
 
552
                self._event_system.unhook("flush", self._detect_changes)
 
553
            else:
 
554
                self._event_system.hook("flush", self._detect_changes)
 
555
        super(MutableValueVariable, self).set(value, from_db)
 
556
 
550
557
 
551
558
class PickleVariable(MutableValueVariable):
552
559
    __slots__ = ()