summaryrefslogtreecommitdiff
path: root/src/HelperTasks.cc
diff options
context:
space:
mode:
authorNicolas Noble <pixel@nobis-crew.org>2013-08-02 18:36:38 -0700
committerNicolas Noble <pixel@nobis-crew.org>2013-08-02 18:36:38 -0700
commitc6518eb6e1caa68cdf0dc242d52cfc172b96efdc (patch)
tree9a24206fd050f674179c8f5e82b59fcf0f152d24 /src/HelperTasks.cc
parent903974e7b3ceecb977449ac5ea34808de9501997 (diff)
Lua's dumpvars is now properly yielding if needed.
Diffstat (limited to 'src/HelperTasks.cc')
-rw-r--r--src/HelperTasks.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/HelperTasks.cc b/src/HelperTasks.cc
new file mode 100644
index 0000000..ab1c2a9
--- /dev/null
+++ b/src/HelperTasks.cc
@@ -0,0 +1,42 @@
+#include <algorithm>
+
+#include "HelperTasks.h"
+
+Balau::CopyTask::CopyTask(IO<Handle> s, IO<Handle> d, ssize_t tocopy)
+ : m_s(s)
+ , m_d(d)
+ , m_tocopy(tocopy)
+{
+ m_name.set("CopyTask from %s to %s", s->getName(), d->getName());
+}
+
+void Balau::CopyTask::Do() {
+ ssize_t toread, w;
+
+ try {
+ for (;;) {
+ switch (m_state) {
+ case 0:
+ toread = m_tocopy >= 0 ? m_tocopy - m_current : COPY_BUFSIZE;
+ toread = std::min(toread, (ssize_t) COPY_BUFSIZE);
+ m_read = m_s->read(m_buffer, toread);
+ AAssert(m_read >= 0, "Error while reading");
+ if (m_s->isEOF() || !m_read)
+ return;
+ m_written = 0;
+ m_state = 1;
+ case 1:
+ do {
+ w = m_d->write(m_buffer + m_written, m_read - m_written);
+ AAssert(w >= 0, "Error while writing");
+ m_written += w;
+ } while (m_read != m_written);
+ m_state = 0;
+ m_current += m_read;
+ }
+ }
+ }
+ catch (EAgain & e) {
+ taskSwitch();
+ }
+}