Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/io/qfilesystemwatcher_inotify.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||||||||
2 | - | |||||||||||||||||||||||||
3 | - | |||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||
5 | - | |||||||||||||||||||||||||
6 | - | |||||||||||||||||||||||||
7 | - | |||||||||||||||||||||||||
8 | - | |||||||||||||||||||||||||
9 | - | |||||||||||||||||||||||||
10 | - | |||||||||||||||||||||||||
11 | - | |||||||||||||||||||||||||
12 | QInotifyFileSystemWatcherEngine *QInotifyFileSystemWatcherEngine::create(QObject *parent) | - | ||||||||||||||||||||||||
13 | { | - | ||||||||||||||||||||||||
14 | int fd = -1; | - | ||||||||||||||||||||||||
15 | - | |||||||||||||||||||||||||
16 | fd = inotify_init1(IN_CLOEXEC); | - | ||||||||||||||||||||||||
17 | - | |||||||||||||||||||||||||
18 | if (fd == -1
| 0-355 | ||||||||||||||||||||||||
19 | fd = inotify_init(); | - | ||||||||||||||||||||||||
20 | if (fd == -1
| 0 | ||||||||||||||||||||||||
21 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
22 | } never executed: end of block | 0 | ||||||||||||||||||||||||
23 | return executed 355 times by 10 tests: new QInotifyFileSystemWatcherEngine(fd, parent);return new QInotifyFileSystemWatcherEngine(fd, parent); Executed by:
executed 355 times by 10 tests: return new QInotifyFileSystemWatcherEngine(fd, parent); Executed by:
| 355 | ||||||||||||||||||||||||
24 | } | - | ||||||||||||||||||||||||
25 | - | |||||||||||||||||||||||||
26 | QInotifyFileSystemWatcherEngine::QInotifyFileSystemWatcherEngine(int fd, QObject *parent) | - | ||||||||||||||||||||||||
27 | : QFileSystemWatcherEngine(parent), | - | ||||||||||||||||||||||||
28 | inotifyFd(fd), | - | ||||||||||||||||||||||||
29 | notifier(fd, QSocketNotifier::Read, this) | - | ||||||||||||||||||||||||
30 | { | - | ||||||||||||||||||||||||
31 | fcntl(inotifyFd, 2, 1); | - | ||||||||||||||||||||||||
32 | connect(¬ifier, qFlagLocation("2""activated(int)" "\0" __FILE__ ":" "249"), qFlagLocation("1""readFromInotify()" "\0" __FILE__ ":" "249")); | - | ||||||||||||||||||||||||
33 | } executed 355 times by 10 tests: end of block Executed by:
| 355 | ||||||||||||||||||||||||
34 | - | |||||||||||||||||||||||||
35 | QInotifyFileSystemWatcherEngine::~QInotifyFileSystemWatcherEngine() | - | ||||||||||||||||||||||||
36 | { | - | ||||||||||||||||||||||||
37 | notifier.setEnabled(false); | - | ||||||||||||||||||||||||
38 | for (int id : qAsConst(pathToID)) | - | ||||||||||||||||||||||||
39 | inotify_rm_watch(inotifyFd, id < 0 ? -id : id); executed 361 times by 9 tests: inotify_rm_watch(inotifyFd, id < 0 ? -id : id); Executed by:
| 361 | ||||||||||||||||||||||||
40 | - | |||||||||||||||||||||||||
41 | ::close(inotifyFd); | - | ||||||||||||||||||||||||
42 | } executed 354 times by 11 tests: end of block Executed by:
| 354 | ||||||||||||||||||||||||
43 | - | |||||||||||||||||||||||||
44 | QStringList QInotifyFileSystemWatcherEngine::addPaths(const QStringList &paths, | - | ||||||||||||||||||||||||
45 | QStringList *files, | - | ||||||||||||||||||||||||
46 | QStringList *directories) | - | ||||||||||||||||||||||||
47 | { | - | ||||||||||||||||||||||||
48 | QStringList p = paths; | - | ||||||||||||||||||||||||
49 | QMutableListIterator<QString> it(p); | - | ||||||||||||||||||||||||
50 | while (it.hasNext()
| 476-478 | ||||||||||||||||||||||||
51 | QString path = it.next(); | - | ||||||||||||||||||||||||
52 | QFileInfo fi(path); | - | ||||||||||||||||||||||||
53 | bool isDir = fi.isDir(); | - | ||||||||||||||||||||||||
54 | if (isDir
| 36-442 | ||||||||||||||||||||||||
55 | if (directories->contains(path)
| 1-441 | ||||||||||||||||||||||||
56 | continue; executed 1 time by 1 test: continue; Executed by:
| 1 | ||||||||||||||||||||||||
57 | } executed 441 times by 8 tests: else {end of block Executed by:
| 441 | ||||||||||||||||||||||||
58 | if (files->contains(path)
| 0-36 | ||||||||||||||||||||||||
59 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||
60 | } executed 36 times by 1 test: end of block Executed by:
| 36 | ||||||||||||||||||||||||
61 | - | |||||||||||||||||||||||||
62 | int wd = inotify_add_watch(inotifyFd, | - | ||||||||||||||||||||||||
63 | QFile::encodeName(path), | - | ||||||||||||||||||||||||
64 | (isDir | - | ||||||||||||||||||||||||
65 | ? (0 | - | ||||||||||||||||||||||||
66 | | 0x00000004 | - | ||||||||||||||||||||||||
67 | | (0x00000040 | 0x00000080) | - | ||||||||||||||||||||||||
68 | | 0x00000100 | - | ||||||||||||||||||||||||
69 | | 0x00000200 | - | ||||||||||||||||||||||||
70 | | 0x00000400 | - | ||||||||||||||||||||||||
71 | ) | - | ||||||||||||||||||||||||
72 | : (0 | - | ||||||||||||||||||||||||
73 | | 0x00000004 | - | ||||||||||||||||||||||||
74 | | 0x00000002 | - | ||||||||||||||||||||||||
75 | | (0x00000040 | 0x00000080) | - | ||||||||||||||||||||||||
76 | | 0x00000800 | - | ||||||||||||||||||||||||
77 | | 0x00000400 | - | ||||||||||||||||||||||||
78 | ))); | - | ||||||||||||||||||||||||
79 | if (wd < 0
| 2-475 | ||||||||||||||||||||||||
80 | QMessageLogger(__FILE__, 297, __PRETTY_FUNCTION__).warning().nospace() << "inotify_add_watch(" << path << ") failed: " << QSystemError((*__errno_location ()), QSystemError::NativeError).toString(); | - | ||||||||||||||||||||||||
81 | continue; executed 2 times by 1 test: continue; Executed by:
| 2 | ||||||||||||||||||||||||
82 | } | - | ||||||||||||||||||||||||
83 | - | |||||||||||||||||||||||||
84 | it.remove(); | - | ||||||||||||||||||||||||
85 | - | |||||||||||||||||||||||||
86 | int id = isDir
| 34-441 | ||||||||||||||||||||||||
87 | if (id < 0
| 34-441 | ||||||||||||||||||||||||
88 | directories->append(path); | - | ||||||||||||||||||||||||
89 | } executed 441 times by 8 tests: else {end of block Executed by:
| 441 | ||||||||||||||||||||||||
90 | files->append(path); | - | ||||||||||||||||||||||||
91 | } executed 34 times by 1 test: end of block Executed by:
| 34 | ||||||||||||||||||||||||
92 | - | |||||||||||||||||||||||||
93 | pathToID.insert(path, id); | - | ||||||||||||||||||||||||
94 | idToPath.insert(id, path); | - | ||||||||||||||||||||||||
95 | } executed 475 times by 8 tests: end of block Executed by:
| 475 | ||||||||||||||||||||||||
96 | - | |||||||||||||||||||||||||
97 | return executed 476 times by 8 tests: p;return p; Executed by:
executed 476 times by 8 tests: return p; Executed by:
| 476 | ||||||||||||||||||||||||
98 | } | - | ||||||||||||||||||||||||
99 | - | |||||||||||||||||||||||||
100 | QStringList QInotifyFileSystemWatcherEngine::removePaths(const QStringList &paths, | - | ||||||||||||||||||||||||
101 | QStringList *files, | - | ||||||||||||||||||||||||
102 | QStringList *directories) | - | ||||||||||||||||||||||||
103 | { | - | ||||||||||||||||||||||||
104 | QStringList p = paths; | - | ||||||||||||||||||||||||
105 | QMutableListIterator<QString> it(p); | - | ||||||||||||||||||||||||
106 | while (it.hasNext()
| 106-107 | ||||||||||||||||||||||||
107 | QString path = it.next(); | - | ||||||||||||||||||||||||
108 | int id = pathToID.take(path); | - | ||||||||||||||||||||||||
109 | QString x = idToPath.take(id); | - | ||||||||||||||||||||||||
110 | if (x.isEmpty()
| 0-95 | ||||||||||||||||||||||||
111 | continue; executed 12 times by 3 tests: continue; Executed by:
| 12 | ||||||||||||||||||||||||
112 | - | |||||||||||||||||||||||||
113 | int wd = id < 0
| 9-86 | ||||||||||||||||||||||||
114 | - | |||||||||||||||||||||||||
115 | inotify_rm_watch(inotifyFd, wd); | - | ||||||||||||||||||||||||
116 | - | |||||||||||||||||||||||||
117 | it.remove(); | - | ||||||||||||||||||||||||
118 | if (id < 0
| 9-86 | ||||||||||||||||||||||||
119 | directories->removeAll(path); | - | ||||||||||||||||||||||||
120 | } executed 86 times by 5 tests: else {end of block Executed by:
| 86 | ||||||||||||||||||||||||
121 | files->removeAll(path); | - | ||||||||||||||||||||||||
122 | } executed 9 times by 1 test: end of block Executed by:
| 9 | ||||||||||||||||||||||||
123 | } | - | ||||||||||||||||||||||||
124 | - | |||||||||||||||||||||||||
125 | return executed 106 times by 5 tests: p;return p; Executed by:
executed 106 times by 5 tests: return p; Executed by:
| 106 | ||||||||||||||||||||||||
126 | } | - | ||||||||||||||||||||||||
127 | - | |||||||||||||||||||||||||
128 | void QInotifyFileSystemWatcherEngine::readFromInotify() | - | ||||||||||||||||||||||||
129 | { | - | ||||||||||||||||||||||||
130 | - | |||||||||||||||||||||||||
131 | - | |||||||||||||||||||||||||
132 | int buffSize = 0; | - | ||||||||||||||||||||||||
133 | ioctl(inotifyFd, 0x541B, (char *) &buffSize); | - | ||||||||||||||||||||||||
134 | QVarLengthArray<char, 4096> buffer(buffSize); | - | ||||||||||||||||||||||||
135 | buffSize = read(inotifyFd, buffer.data(), buffSize); | - | ||||||||||||||||||||||||
136 | char *at = buffer.data(); | - | ||||||||||||||||||||||||
137 | char * const end = at + buffSize; | - | ||||||||||||||||||||||||
138 | - | |||||||||||||||||||||||||
139 | QHash<int, inotify_event *> eventForId; | - | ||||||||||||||||||||||||
140 | while (at < end
| 106-222 | ||||||||||||||||||||||||
141 | inotify_event *event = reinterpret_cast<inotify_event *>(at); | - | ||||||||||||||||||||||||
142 | - | |||||||||||||||||||||||||
143 | if (eventForId.contains(event->wd)
| 98-124 | ||||||||||||||||||||||||
144 | eventForId[event->wd]->mask |= event->mask; executed 98 times by 4 tests: eventForId[event->wd]->mask |= event->mask; Executed by:
| 98 | ||||||||||||||||||||||||
145 | else | - | ||||||||||||||||||||||||
146 | eventForId.insert(event->wd, event); executed 124 times by 6 tests: eventForId.insert(event->wd, event); Executed by:
| 124 | ||||||||||||||||||||||||
147 | - | |||||||||||||||||||||||||
148 | at += sizeof(inotify_event) + event->len; | - | ||||||||||||||||||||||||
149 | } executed 222 times by 6 tests: end of block Executed by:
| 222 | ||||||||||||||||||||||||
150 | - | |||||||||||||||||||||||||
151 | QHash<int, inotify_event *>::const_iterator it = eventForId.constBegin(); | - | ||||||||||||||||||||||||
152 | while (it != eventForId.constEnd()
| 106-124 | ||||||||||||||||||||||||
153 | const inotify_event &event = **it; | - | ||||||||||||||||||||||||
154 | ++it; | - | ||||||||||||||||||||||||
155 | - | |||||||||||||||||||||||||
156 | - | |||||||||||||||||||||||||
157 | - | |||||||||||||||||||||||||
158 | int id = event.wd; | - | ||||||||||||||||||||||||
159 | QString path = getPathFromID(id); | - | ||||||||||||||||||||||||
160 | if (path.isEmpty()
| 22-102 | ||||||||||||||||||||||||
161 | - | |||||||||||||||||||||||||
162 | id = -id; | - | ||||||||||||||||||||||||
163 | path = getPathFromID(id); | - | ||||||||||||||||||||||||
164 | if (path.isEmpty()
| 44-58 | ||||||||||||||||||||||||
165 | continue; executed 44 times by 4 tests: continue; Executed by:
| 44 | ||||||||||||||||||||||||
166 | } executed 58 times by 4 tests: end of block Executed by:
| 58 | ||||||||||||||||||||||||
167 | - | |||||||||||||||||||||||||
168 | - | |||||||||||||||||||||||||
169 | - | |||||||||||||||||||||||||
170 | if ((
| 18-62 | ||||||||||||||||||||||||
171 | pathToID.remove(path); | - | ||||||||||||||||||||||||
172 | idToPath.remove(id, getPathFromID(id)); | - | ||||||||||||||||||||||||
173 | if (!idToPath.contains(id)
| 9 | ||||||||||||||||||||||||
174 | inotify_rm_watch(inotifyFd, event.wd); executed 9 times by 1 test: inotify_rm_watch(inotifyFd, event.wd); Executed by:
| 9 | ||||||||||||||||||||||||
175 | - | |||||||||||||||||||||||||
176 | if (id < 0
| 4-14 | ||||||||||||||||||||||||
177 | directoryChanged(path, true); executed 4 times by 1 test: directoryChanged(path, true); Executed by:
| 4 | ||||||||||||||||||||||||
178 | else | - | ||||||||||||||||||||||||
179 | fileChanged(path, true); executed 14 times by 1 test: fileChanged(path, true); Executed by:
| 14 | ||||||||||||||||||||||||
180 | } else { | - | ||||||||||||||||||||||||
181 | if (id < 0
| 8-54 | ||||||||||||||||||||||||
182 | directoryChanged(path, false); executed 54 times by 4 tests: directoryChanged(path, false); Executed by:
| 54 | ||||||||||||||||||||||||
183 | else | - | ||||||||||||||||||||||||
184 | fileChanged(path, false); executed 8 times by 1 test: fileChanged(path, false); Executed by:
| 8 | ||||||||||||||||||||||||
185 | } | - | ||||||||||||||||||||||||
186 | } | - | ||||||||||||||||||||||||
187 | } executed 106 times by 6 tests: end of block Executed by:
| 106 | ||||||||||||||||||||||||
188 | - | |||||||||||||||||||||||||
189 | QString QInotifyFileSystemWatcherEngine::getPathFromID(int id) const | - | ||||||||||||||||||||||||
190 | { | - | ||||||||||||||||||||||||
191 | QHash<int, QString>::const_iterator i = idToPath.find(id); | - | ||||||||||||||||||||||||
192 | while (i != idToPath.constEnd()
| 0-146 | ||||||||||||||||||||||||
193 | if ((
| 18-76 | ||||||||||||||||||||||||
194 | return executed 98 times by 4 tests: i.value();return i.value(); Executed by:
executed 98 times by 4 tests: return i.value(); Executed by:
| 98 | ||||||||||||||||||||||||
195 | } | - | ||||||||||||||||||||||||
196 | ++i; | - | ||||||||||||||||||||||||
197 | } executed 18 times by 1 test: end of block Executed by:
| 18 | ||||||||||||||||||||||||
198 | return executed 146 times by 6 tests: QString();return QString(); Executed by:
executed 146 times by 6 tests: return QString(); Executed by:
| 146 | ||||||||||||||||||||||||
199 | } | - | ||||||||||||||||||||||||
200 | - | |||||||||||||||||||||||||
201 | - | |||||||||||||||||||||||||
Switch to Source code | Preprocessed file |