From e059d69c2ce61b1ba1ae2e0b9c75eb53bb26f1bb Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 30 Mar 2006 23:32:28 +0000 Subject: add background file eraser class for asynchronous file deletion --- lib/components/file_eraser.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 lib/components/file_eraser.cpp (limited to 'lib/components/file_eraser.cpp') diff --git a/lib/components/file_eraser.cpp b/lib/components/file_eraser.cpp new file mode 100644 index 00000000..bc26bf7c --- /dev/null +++ b/lib/components/file_eraser.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +eBackgroundFileEraser *eBackgroundFileEraser::instance; + +eBackgroundFileEraser::eBackgroundFileEraser() + :messages(this,1), stop_thread_timer(this) +{ + if (!instance) + instance=this; + CONNECT(messages.recv_msg, eBackgroundFileEraser::gotMessage); + CONNECT(stop_thread_timer.timeout, eBackgroundFileEraser::idle); +} + +void eBackgroundFileEraser::idle() +{ + quit(0); +} + +eBackgroundFileEraser::~eBackgroundFileEraser() +{ + messages.send(Message::quit); + if ( thread_running() ) + kill(); + if (instance==this) + instance=0; +} + +void eBackgroundFileEraser::thread() +{ + nice(5); + reset(); + runLoop(); + stop_thread_timer.stop(); +} + +void eBackgroundFileEraser::erase(const char *filename) +{ + if (filename) + { + char buf[255]; + snprintf(buf, 255, "%s.$$$", filename); + if (rename(filename, buf)<0) + ;/*perror("rename file failed !!!");*/ + else + { + messages.send(Message(Message::erase, strdup(buf))); + if (!thread_running()) + run(); + } + } +} + +void eBackgroundFileEraser::gotMessage(const Message &msg ) +{ + switch (msg.type) + { + case Message::erase: + if ( msg.filename ) + { + if ( ::unlink(msg.filename) < 0 ) + eDebug("remove file %s failed (%m)", msg.filename); + else + eDebug("file %s erased", msg.filename); + free((char*)msg.filename); + } + stop_thread_timer.start(2000, true); // stop thread in two seconds + break; + case Message::quit: + quit(0); + break; + default: + eDebug("unhandled thread message"); + } +} + +eAutoInitP0 init_eBackgroundFilEraser(eAutoInitNumbers::configuration+1, "Background File Eraser"); -- cgit v1.2.3