Fix kitty discarding peer messages in rapid succession

This commit is contained in:
Kovid Goyal 2017-11-27 19:51:34 +05:30
parent fe3bb92b54
commit 6352f585e8
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 27 additions and 22 deletions

View File

@ -97,23 +97,24 @@ class Boss:
self.child_monitor.add_child(window.id, window.child.pid, window.child.child_fd, window.screen)
self.window_id_map[window.id] = window
def peer_msg_received(self, msg):
def peer_messages_received(self, messages):
import json
msg = json.loads(msg.decode('utf-8'))
if isinstance(msg, dict) and msg.get('cmd') == 'new_instance':
startup_id = msg.get('startup_id')
args, rest = parse_args(msg['args'][1:])
args.args = rest
opts = create_opts(args)
session = create_session(opts, args)
os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, size=initial_window_size(opts), visible=False)
if startup_id:
ctx = init_startup_notification(os_window_id, startup_id)
show_window(os_window_id)
if startup_id:
end_startup_notification(ctx)
else:
safe_print('Unknown message received from peer, ignoring')
for msg in messages:
msg = json.loads(msg.decode('utf-8'))
if isinstance(msg, dict) and msg.get('cmd') == 'new_instance':
startup_id = msg.get('startup_id')
args, rest = parse_args(msg['args'][1:])
args.args = rest
opts = create_opts(args)
session = create_session(opts, args)
os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, size=initial_window_size(opts), visible=False)
if startup_id:
ctx = init_startup_notification(os_window_id, startup_id)
show_window(os_window_id)
if startup_id:
end_startup_notification(ctx)
else:
safe_print('Unknown message received from peer, ignoring')
def on_child_death(self, window_id):
window = self.window_id_map.pop(window_id, None)

View File

@ -339,11 +339,15 @@ parse_input(ChildMonitor *self) {
}
if (UNLIKELY(self->messages_count)) {
while(self->messages_count) {
Message *m = self->messages + --self->messages_count;
msg = PyBytes_FromStringAndSize(m->data, m->sz);
free(m->data); m->data = NULL; m->sz = 0;
}
msg = PyTuple_New(self->messages_count);
if (msg) {
for (size_t i = 0; i < self->messages_count; i++) {
Message *m = self->messages + i;
PyTuple_SET_ITEM(msg, i, PyBytes_FromStringAndSize(m->data, m->sz));
free(m->data); m->data = NULL; m->sz = 0;
}
self->messages_count = 0;
} else fatal("Out of memory");
}
if (UNLIKELY(signal_received)) {
@ -357,7 +361,7 @@ parse_input(ChildMonitor *self) {
}
children_mutex(unlock);
if (msg) {
call_boss(peer_msg_received, "O", msg);
call_boss(peer_messages_received, "(O)", msg);
Py_CLEAR(msg);
}