1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include <lib/components/file_eraser.h>
#include <lib/base/ioprio.h>
#include <lib/base/eerror.h>
#include <lib/base/init.h>
#include <lib/base/init_num.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
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 (instance==this)
instance=0;
}
void eBackgroundFileEraser::thread()
{
hasStarted();
nice(5);
setIoPrio(IOPRIO_CLASS_BE, 7);
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)));
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(1000, true); // stop thread in one seconds
break;
case Message::quit:
quit(0);
break;
default:
eDebug("unhandled thread message");
}
}
eAutoInitP0<eBackgroundFileEraser> init_eBackgroundFilEraser(eAutoInitNumbers::configuration+1, "Background File Eraser");
|