summaryrefslogtreecommitdiff
path: root/autoload/l9/async.py
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/l9/async.py')
-rw-r--r--autoload/l9/async.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/autoload/l9/async.py b/autoload/l9/async.py
new file mode 100644
index 0000000..eeb0cc3
--- /dev/null
+++ b/autoload/l9/async.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+
+from __future__ import with_statement
+import vim
+import os
+import subprocess
+import threading
+import Queue
+
+
+class Asyncer:
+
+ def __init__(self):
+ self._workers = {}
+
+ def execute(self, var_key, var_command, var_cwd, var_input, var_appends):
+ key = vim.eval(var_key)
+ command = vim.eval(var_command)
+ cwd = vim.eval(var_cwd)
+ input = vim.eval(var_input)
+ appends = vim.eval(var_appends)
+ if key not in self._workers:
+ self._workers[key] = Worker()
+ self._workers[key].start()
+ self._workers[key].put(Executor(command, cwd, input, appends))
+
+ def print_output(self, var_key):
+ key = vim.eval(var_key)
+ if key not in self._workers:
+ return
+ for l in self._workers[key].copy_outputs():
+ print l,
+
+ def print_worker_keys(self):
+ for k in self._workers.keys():
+ print k
+
+ def print_active_worker_keys(self):
+ for k in self._workers.keys():
+ print k
+
+
+class Worker(threading.Thread):
+
+ def __init__(self):
+ threading.Thread.__init__(self)
+ self._queue = Queue.Queue()
+ self._lines = []
+ self._lock = threading.Lock()
+
+ def run(self):
+ while True:
+ self._queue.get().execute(self)
+ self._queue.task_done()
+
+ def put(self, executor):
+ self._queue.put(executor)
+
+ def clear_outputs(self):
+ with self._lock:
+ self._lines = []
+
+ def record_output(self, line):
+ with self._lock:
+ self._lines.append(line)
+
+ def copy_outputs(self):
+ with self._lock:
+ return self._lines[:]
+
+
+class Executor:
+
+ def __init__(self, command, cwd, input, appends):
+ self._command = command
+ self._cwd = cwd
+ self._input = input
+ self._appends = appends
+
+ def execute(self, worker):
+ if not self._appends:
+ worker.clear_outputs()
+ os.chdir(self._cwd)
+ p = subprocess.Popen(self._command, shell=True, stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ p.stdin.write(self._input)
+ line = p.stdout.readline()
+ while line:
+ worker.record_output(line)
+ line = p.stdout.readline()
+
+