Fix #318: Freezes on PlugInstall

This commit is contained in:
Jeremy Pallats/starcraft.man 2015-11-24 14:57:42 -05:00
parent 072d28e86e
commit c3bcd95459

View file

@ -1061,7 +1061,7 @@ endwhile
endfunction endfunction
function! s:update_python() function! s:update_python()
let py_exe = has('python3') ? 'python3' : 'python' let py_exe = has('python') ? 'python' : 'python3'
execute py_exe "<< EOF" execute py_exe "<< EOF"
""" Due to use of signals this function is POSIX only. """ """ Due to use of signals this function is POSIX only. """
import datetime import datetime
@ -1090,14 +1090,9 @@ G_CLONE_OPT = vim.eval('s:clone_opt')
G_PROGRESS = vim.eval('s:progress_opt(1)') G_PROGRESS = vim.eval('s:progress_opt(1)')
G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
G_STOP = thr.Event() G_STOP = thr.Event()
G_THREADS = {}
class PlugError(Exception): class PlugError(Exception):
def __init__(self, msg): pass
self._msg = msg
@property
def msg(self):
return self._msg
class CmdTimedOut(PlugError): class CmdTimedOut(PlugError):
pass pass
class CmdFailed(PlugError): class CmdFailed(PlugError):
@ -1288,7 +1283,7 @@ class Plugin(object):
with self.lock: with self.lock:
thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
except PlugError as exc: except PlugError as exc:
self.write(Action.ERROR, self.name, exc.msg) self.write(Action.ERROR, self.name, str(exc))
except KeyboardInterrupt: except KeyboardInterrupt:
G_STOP.set() G_STOP.set()
self.write(Action.ERROR, self.name, ['Interrupted!']) self.write(Action.ERROR, self.name, ['Interrupted!'])
@ -1371,10 +1366,6 @@ class PlugThread(thr.Thread):
work_q.task_done() work_q.task_done()
except queue.Empty: except queue.Empty:
pass pass
finally:
global G_THREADS
with lock:
del G_THREADS[thr.current_thread().name]
class RefreshThread(thr.Thread): class RefreshThread(thr.Thread):
def __init__(self, lock): def __init__(self, lock):
@ -1428,17 +1419,16 @@ def main():
for work in plugs.items(): for work in plugs.items():
work_q.put(work) work_q.put(work)
global G_THREADS start_cnt = thr.active_count()
for num in range(nthreads): for num in range(nthreads):
tname = 'PlugT-{0:02}'.format(num) tname = 'PlugT-{0:02}'.format(num)
thread = PlugThread(tname, (buf_q, work_q, lock)) thread = PlugThread(tname, (buf_q, work_q, lock))
thread.start() thread.start()
G_THREADS[tname] = thread
if mac_gui: if mac_gui:
rthread = RefreshThread(lock) rthread = RefreshThread(lock)
rthread.start() rthread.start()
while not buf_q.empty() or len(G_THREADS) != 0: while not buf_q.empty() or thr.active_count() != start_cnt:
try: try:
action, name, msg = buf_q.get(True, 0.25) action, name, msg = buf_q.get(True, 0.25)
buf.write(action, name, msg) buf.write(action, name, msg)