@@ -96,6 +96,7 @@ def recompute_scheduled_computed(o):
96
96
if not hasattr (o , '_v_schedule_recomputing' ) or len (o ._v_schedule_recomputing ) == 0 : return
97
97
tocomp = o ._v_schedule_recomputing
98
98
o ._v_schedule_recomputing = []
99
+
99
100
for k in tocomp :
100
101
recompute_computed (o , k )
101
102
recompute_scheduled_computed (o )
@@ -144,6 +145,10 @@ def broadcast(self, k):
144
145
if k in self ._v_nobroadcast : return
145
146
asyncio .ensure_future (broadcast_update (self .__id , k , getattr (self , k )))
146
147
148
+ def broadcast_atomic (self , start ):
149
+ if not hasattr (self , '__id' ): return # no id yet, still building
150
+ asyncio .ensure_future (broadcast_update (self .__id , KEY_ATOMIC , start ))
151
+
147
152
def call_watcher (o , k ):
148
153
watcher = 'watch_' + k
149
154
if hasattr (o , watcher ):
@@ -152,14 +157,19 @@ def call_watcher(o, k):
152
157
watcher (getattr (o , k ))
153
158
154
159
all = []
160
+ KEY_ATOMIC = '_v_ATOMIC'
155
161
async def broadcast_update (id , k , v ):
156
162
a = all .copy ()
157
163
all [:] = []
164
+ if k == KEY_ATOMIC :
165
+ comm = 'ATOMIC'
166
+ else :
167
+ comm = 'UPDATE'
158
168
for ws in a :
159
169
try :
160
170
v = sanitize (v )
161
- await ws .send ('UPDATE '+ str (id )+ ' ' + str (k )+ ' ' + json .dumps (v ))
162
- info ('OUT' , 'UPDATE' , id , k , '{:.80} ...' .format (json .dumps (v )))
171
+ await ws .send (comm + ' '+ str (id )+ ' ' + str (k )+ ' ' + json .dumps (v ))
172
+ info ('OUT' , comm , id , k , '{:.80} ...' .format (json .dumps (v )))
163
173
all .append (ws )
164
174
except :
165
175
pass
@@ -225,8 +235,9 @@ async def handleClient(websocket, path):
225
235
'state' : state ,
226
236
'methods' : methods
227
237
}
228
- info ('OUT' , comm , to_send )
229
- await websocket .send (comm + ' ' + json .dumps (to_send ))
238
+ to_send = json .dumps (to_send )
239
+ info ('OUT' , comm , '{:.80} ...' .format (to_send ))
240
+ await websocket .send (comm + ' ' + to_send )
230
241
elif comm == 'CALL' :
231
242
id = await websocket .recv ()
232
243
o = g_instances [id ]
@@ -268,10 +279,12 @@ async def handleClient(websocket, path):
268
279
# decorator
269
280
def atomic (f ):
270
281
def _decorator (self , * args , ** kwargs ):
271
- self ._v_just_schedule = True
282
+ self ._v_just_schedule = True # for the python to wait
283
+ broadcast_atomic (self , True ) # for the js to wait
272
284
f (self , * args , ** kwargs )
273
285
self ._v_just_schedule = False
274
286
recompute_scheduled_computed (self )
287
+ broadcast_atomic (self , False )
275
288
return _decorator
276
289
277
290
def setup_model_object_infra (o ):
0 commit comments