Skip to content

Commit

Permalink
writeback - make deferred lazy - only create the promise if we need it
Browse files Browse the repository at this point in the history
  • Loading branch information
s-cork committed Aug 10, 2023
1 parent 8155517 commit 00e924a
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions client_code/utils/_writeback_waiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,38 @@

class _Deferred:
def init_promise(self, resolve, reject):
self.resolve = resolve
self.reject = reject
self._resolve = resolve
if not self._pending:
resolve()

def __init__(self):
self.promise = _window.Promise(self.init_promise)
self._promise = None
self._resolve = None
self._pending = True

@property
def promise(self):
if self._promise is None:
self._promise = _window.Promise(self.init_promise)
return self._promise

def resolve(self, value=None):
self._pending = False
if self._resolve is not None:
self._resolve(value)


class _WritebackWaiter:
def __init__(self):
self.deferred = _Deferred()

def __enter__(self):
_active_writebacks.append(self.deferred.promise)
_active_writebacks.append(self.deferred)

def __exit__(self, exc, *args):
global _active_writebacks
promise = self.deferred.promise
_active_writebacks = [p for p in _active_writebacks if p is not promise]
deferred = self.deferred
_active_writebacks = [d for d in _active_writebacks if d is not deferred]
self.deferred.resolve()


Expand All @@ -56,7 +70,7 @@ def wait_for_writeback(fn):
@_wraps(fn)
def wrapper(self, *args, **kws):
_sleep(0)
_window.Promise.allSettled(_active_writebacks)
_window.Promise.allSettled([d.promise for d in _active_writebacks])
return fn(self, *args, **kws)

return wrapper

0 comments on commit 00e924a

Please sign in to comment.