Lines Matching +full:0 +full:- +full:mon

23 #include "qemu/main-loop.h"
24 #include "qemu/error-report.h"
56 QFileMonitor *mon = arg; in qemu_file_monitor_watch() local
59 int used = 0; in qemu_file_monitor_watch()
62 qemu_mutex_lock(&mon->lock); in qemu_file_monitor_watch()
64 if (mon->fd == -1) { in qemu_file_monitor_watch()
65 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_watch()
69 len = read(mon->fd, buf, sizeof(buf)); in qemu_file_monitor_watch()
71 if (len < 0) { in qemu_file_monitor_watch()
95 assert(len - used >= sizeof(struct inotify_event)); in qemu_file_monitor_watch()
96 assert(len - used - sizeof(struct inotify_event) >= ev->len); in qemu_file_monitor_watch()
98 name = ev->len ? ev->name : ""; in qemu_file_monitor_watch()
99 dir = g_hash_table_lookup(mon->idmap, GINT_TO_POINTER(ev->wd)); in qemu_file_monitor_watch()
100 iev = ev->mask & in qemu_file_monitor_watch()
104 used += sizeof(struct inotify_event) + ev->len; in qemu_file_monitor_watch()
138 trace_qemu_file_monitor_event(mon, dir->path, name, ev->mask, in qemu_file_monitor_watch()
139 dir->inotify_id); in qemu_file_monitor_watch()
140 for (i = 0; i < dir->watches->len; i++) { in qemu_file_monitor_watch()
141 QFileMonitorWatch *watch = &g_array_index(dir->watches, in qemu_file_monitor_watch()
145 if (watch->filename == NULL || in qemu_file_monitor_watch()
146 (name && g_str_equal(watch->filename, name))) { in qemu_file_monitor_watch()
147 trace_qemu_file_monitor_dispatch(mon, dir->path, name, in qemu_file_monitor_watch()
148 qev, watch->cb, in qemu_file_monitor_watch()
149 watch->opaque, watch->id); in qemu_file_monitor_watch()
150 watch->cb(watch->id, qev, name, watch->opaque); in qemu_file_monitor_watch()
156 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_watch()
166 for (i = 0; i < dir->watches->len; i++) { in qemu_file_monitor_dir_free()
167 QFileMonitorWatch *watch = &g_array_index(dir->watches, in qemu_file_monitor_dir_free()
169 g_free(watch->filename); in qemu_file_monitor_dir_free()
171 g_array_unref(dir->watches); in qemu_file_monitor_dir_free()
172 g_free(dir->path); in qemu_file_monitor_dir_free()
181 QFileMonitor *mon; in qemu_file_monitor_new() local
184 if (fd < 0) { in qemu_file_monitor_new()
190 mon = g_new0(QFileMonitor, 1); in qemu_file_monitor_new()
191 qemu_mutex_init(&mon->lock); in qemu_file_monitor_new()
192 mon->fd = fd; in qemu_file_monitor_new()
194 mon->dirs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, in qemu_file_monitor_new()
196 mon->idmap = g_hash_table_new(g_direct_hash, g_direct_equal); in qemu_file_monitor_new()
198 trace_qemu_file_monitor_new(mon, mon->fd); in qemu_file_monitor_new()
200 return mon; in qemu_file_monitor_new()
206 QFileMonitor *mon = opaque; in qemu_file_monitor_free_idle() local
208 if (!mon) { in qemu_file_monitor_free_idle()
212 qemu_mutex_lock(&mon->lock); in qemu_file_monitor_free_idle()
214 g_hash_table_unref(mon->idmap); in qemu_file_monitor_free_idle()
215 g_hash_table_unref(mon->dirs); in qemu_file_monitor_free_idle()
217 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_free_idle()
219 qemu_mutex_destroy(&mon->lock); in qemu_file_monitor_free_idle()
220 g_free(mon); in qemu_file_monitor_free_idle()
226 qemu_file_monitor_free(QFileMonitor *mon) in qemu_file_monitor_free() argument
228 if (!mon) { in qemu_file_monitor_free()
232 qemu_mutex_lock(&mon->lock); in qemu_file_monitor_free()
233 if (mon->fd != -1) { in qemu_file_monitor_free()
234 qemu_set_fd_handler(mon->fd, NULL, NULL, NULL); in qemu_file_monitor_free()
235 close(mon->fd); in qemu_file_monitor_free()
236 mon->fd = -1; in qemu_file_monitor_free()
238 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_free()
247 g_idle_add((GSourceFunc)qemu_file_monitor_free_idle, mon); in qemu_file_monitor_free()
251 qemu_file_monitor_add_watch(QFileMonitor *mon, in qemu_file_monitor_add_watch() argument
260 int64_t ret = -1; in qemu_file_monitor_add_watch()
262 qemu_mutex_lock(&mon->lock); in qemu_file_monitor_add_watch()
263 dir = g_hash_table_lookup(mon->dirs, dirpath); in qemu_file_monitor_add_watch()
265 int rv = inotify_add_watch(mon->fd, dirpath, in qemu_file_monitor_add_watch()
269 if (rv < 0) { in qemu_file_monitor_add_watch()
274 trace_qemu_file_monitor_enable_watch(mon, dirpath, rv); in qemu_file_monitor_add_watch()
277 dir->path = g_strdup(dirpath); in qemu_file_monitor_add_watch()
278 dir->inotify_id = rv; in qemu_file_monitor_add_watch()
279 dir->watches = g_array_new(FALSE, TRUE, sizeof(QFileMonitorWatch)); in qemu_file_monitor_add_watch()
281 g_hash_table_insert(mon->dirs, dir->path, dir); in qemu_file_monitor_add_watch()
282 g_hash_table_insert(mon->idmap, GINT_TO_POINTER(rv), dir); in qemu_file_monitor_add_watch()
284 if (g_hash_table_size(mon->dirs) == 1) { in qemu_file_monitor_add_watch()
285 qemu_set_fd_handler(mon->fd, qemu_file_monitor_watch, NULL, mon); in qemu_file_monitor_add_watch()
289 watch.id = (((int64_t)dir->inotify_id) << 32) | dir->next_file_id++; in qemu_file_monitor_add_watch()
294 g_array_append_val(dir->watches, watch); in qemu_file_monitor_add_watch()
296 trace_qemu_file_monitor_add_watch(mon, dirpath, in qemu_file_monitor_add_watch()
303 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_add_watch()
308 void qemu_file_monitor_remove_watch(QFileMonitor *mon, in qemu_file_monitor_remove_watch() argument
315 qemu_mutex_lock(&mon->lock); in qemu_file_monitor_remove_watch()
317 trace_qemu_file_monitor_remove_watch(mon, dirpath, id); in qemu_file_monitor_remove_watch()
319 dir = g_hash_table_lookup(mon->dirs, dirpath); in qemu_file_monitor_remove_watch()
324 for (i = 0; i < dir->watches->len; i++) { in qemu_file_monitor_remove_watch()
325 QFileMonitorWatch *watch = &g_array_index(dir->watches, in qemu_file_monitor_remove_watch()
327 if (watch->id == id) { in qemu_file_monitor_remove_watch()
328 g_free(watch->filename); in qemu_file_monitor_remove_watch()
329 g_array_remove_index(dir->watches, i); in qemu_file_monitor_remove_watch()
334 if (dir->watches->len == 0) { in qemu_file_monitor_remove_watch()
335 inotify_rm_watch(mon->fd, dir->inotify_id); in qemu_file_monitor_remove_watch()
336 trace_qemu_file_monitor_disable_watch(mon, dir->path, dir->inotify_id); in qemu_file_monitor_remove_watch()
338 g_hash_table_remove(mon->idmap, GINT_TO_POINTER(dir->inotify_id)); in qemu_file_monitor_remove_watch()
339 g_hash_table_remove(mon->dirs, dir->path); in qemu_file_monitor_remove_watch()
341 if (g_hash_table_size(mon->dirs) == 0) { in qemu_file_monitor_remove_watch()
342 qemu_set_fd_handler(mon->fd, NULL, NULL, NULL); in qemu_file_monitor_remove_watch()
347 qemu_mutex_unlock(&mon->lock); in qemu_file_monitor_remove_watch()