##// END OF EJS Templates
this.updating should be a key specific lock
Jonathan Frederic -
Show More
@@ -38,6 +38,7 b' function(widget_manager, underscore, backbone){'
38 38 this.pending_msgs = 0;
39 39 this.msg_throttle = 3;
40 40 this.msg_buffer = null;
41 this.key_value_lock = null;
41 42 this.id = model_id;
42 43 this.views = [];
43 44
@@ -89,18 +90,20 b' function(widget_manager, underscore, backbone){'
89 90
90 91 // Handle when a widget is updated via the python side.
91 92 apply_update: function (state) {
92 this.updating = true;
93 try {
94 for (var key in state) {
95 if (state.hasOwnProperty(key)) {
96 this.set(key, state[key]);
93 //this.updating = true;
94 for (var key in state) {
95 if (state.hasOwnProperty(key)) {
96 var value = state[key];
97 this.key_value_lock = [key, value];
98 try {
99 this.set(key, state[key]);
100 } finally {
101 this.key_value_lock = null;
97 102 }
98 103 }
99 //TODO: are there callbacks that make sense in this case? If so, attach them here as an option
100 this.save();
101 } finally {
102 this.updating = false;
103 104 }
105 //TODO: are there callbacks that make sense in this case? If so, attach them here as an option
106 this.save();
104 107 },
105 108
106 109
@@ -130,39 +133,43 b' function(widget_manager, underscore, backbone){'
130 133
131 134 // Only send updated state if the state hasn't been changed
132 135 // during an update.
133 if (this.comm !== undefined) {
134 if (!this.updating) {
135 if (this.pending_msgs >= this.msg_throttle) {
136 // The throttle has been exceeded, buffer the current msg so
137 // it can be sent once the kernel has finished processing
138 // some of the existing messages.
139 if (method=='patch') {
140 if (this.msg_buffer === null) {
141 this.msg_buffer = $.extend({}, model_json); // Copy
142 }
143 for (attr in options.attrs) {
144 this.msg_buffer[attr] = options.attrs[attr];
145 }
146 } else {
136 if (this.comm !== undefined) {
137 if (this.pending_msgs >= this.msg_throttle) {
138 // The throttle has been exceeded, buffer the current msg so
139 // it can be sent once the kernel has finished processing
140 // some of the existing messages.
141 if (method=='patch') {
142 if (this.msg_buffer === null) {
147 143 this.msg_buffer = $.extend({}, model_json); // Copy
148 144 }
149
150 } else {
151 // We haven't exceeded the throttle, send the message like
152 // normal. If this is a patch operation, just send the
153 // changes.
154 var send_json = model_json;
155 if (method =='patch') {
156 send_json = {};
157 for (attr in options.attrs) {
158 send_json[attr] = options.attrs[attr];
145 for (attr in options.attrs) {
146 var value = options.attrs[attr];
147 if (this.key_value_lock === null || attr != this.key_value_lock[0] || value != this.key_value_lock[1]) {
148 this.msg_buffer[attr] = value;
159 149 }
160 150 }
151 } else {
152 this.msg_buffer = $.extend({}, model_json); // Copy
153 }
161 154
162 var data = {method: 'backbone', sync_data: send_json};
163 this.comm.send(data, options.callbacks);
164 this.pending_msgs++;
155 } else {
156 // We haven't exceeded the throttle, send the message like
157 // normal. If this is a patch operation, just send the
158 // changes.
159 var send_json = model_json;
160 if (method =='patch') {
161 send_json = {};
162 for (attr in options.attrs) {
163 var value = options.attrs[attr];
164 if (this.key_value_lock === null || attr != this.key_value_lock[0] || value != this.key_value_lock[1]) {
165 send_json[attr] = value;
166 }
167 }
165 168 }
169
170 var data = {method: 'backbone', sync_data: send_json};
171 this.comm.send(data, options.callbacks);
172 this.pending_msgs++;
166 173 }
167 174 }
168 175
General Comments 0
You need to be logged in to leave comments. Login now