Lines Matching refs:watcher

143 static int  watcher_add_event(fs_event_watcher *watcher, kfs_event *kfse);
144 static void fsevents_wakeup(fs_event_watcher *watcher);
286 watcher_cares_about_dev(fs_event_watcher *watcher, dev_t dev)
292 if (watcher->devices_not_to_watch == NULL) {
296 for(i=0; i < watcher->num_devices; i++) {
297 if (dev == watcher->devices_not_to_watch[i]) {
383 fs_event_watcher *watcher;
502 watcher = watcher_table[i];
503 if (watcher == NULL) {
507 watcher->flags |= WATCHER_DROPPED_EVENTS;
508 fsevents_wakeup(watcher);
532 printf("add_fsevent: watcher %s %p: rd %4d wr %4d q_size %4d flags 0x%x\n",
734 watcher = watcher_table[i];
735 if (watcher == NULL) {
739 if ( watcher->event_list[type] == FSE_REPORT
740 && watcher_cares_about_dev(watcher, dev)) {
742 if (watcher_add_event(watcher, kfse) != 0) {
743 watcher->num_dropped++;
885 fs_event_watcher *watcher;
893 MALLOC(watcher,
897 if (watcher == NULL) {
901 watcher->event_list = event_list;
902 watcher->num_events = num_events;
903 watcher->devices_not_to_watch = NULL;
904 watcher->num_devices = 0;
905 watcher->flags = 0;
906 watcher->event_queue = (kfs_event **)&watcher[1];
907 watcher->eventq_size = eventq_size;
908 watcher->rd = 0;
909 watcher->wr = 0;
910 watcher->blockers = 0;
911 watcher->num_readers = 0;
912 watcher->max_event_id = 0;
913 watcher->fseh = fseh;
914 watcher->pid = proc_selfpid();
915 proc_selfname(watcher->proc_name, sizeof(watcher->proc_name));
917 watcher->num_dropped = 0; // XXXdbg - debugging
919 if (!strncmp(watcher->proc_name, "fseventsd", sizeof(watcher->proc_name)) ||
920 !strncmp(watcher->proc_name, "coreservicesd", sizeof(watcher->proc_name)) ||
921 !strncmp(watcher->proc_name, "mds", sizeof(watcher->proc_name))) {
922 watcher->flags |= WATCHER_APPLE_SYSTEM_SERVICE;
924 printf("fsevents: watcher %s (pid: %d) - Using /dev/fsevents directly is unsupported. Migrate to FSEventsFramework\n",
925 watcher->proc_name, watcher->pid);
940 watcher->my_id = i;
941 watcher_table[i] = watcher;
954 *watcher_out = watcher;
965 fs_event_watcher *watcher;
971 watcher = watcher_table[j];
972 if (watcher != target) {
978 for(i=0; i < watcher->num_events; i++) {
979 if (watcher->event_list[i] != FSE_IGNORE && i < FSE_MAX_EVENTS) {
984 if (watcher->flags & WATCHER_CLOSING) {
989 // printf("fsevents: removing watcher %p (rd %d wr %d num_readers %d flags 0x%x)\n", watcher, watcher->rd, watcher->wr, watcher->num_readers, watcher->flags);
990 watcher->flags |= WATCHER_CLOSING;
991 OSAddAtomic(1, &watcher->num_readers);
995 while (watcher->num_readers > 1 && counter++ < 5000) {
997 fsevents_wakeup(watcher); // in case they're asleep
1000 tsleep(watcher, PRIBIO, "fsevents-close", 1);
1003 // printf("fsevents: close: still have readers! (%d)\n", watcher->num_readers);
1004 panic("fsevents: close: still have readers! (%d)\n", watcher->num_readers);
1010 while(watcher->rd != watcher->wr) {
1011 kfse = watcher->event_queue[watcher->rd];
1012 watcher->event_queue[watcher->rd] = NULL;
1013 watcher->rd = (watcher->rd+1) % watcher->eventq_size;
1021 if (watcher->event_list) {
1022 FREE(watcher->event_list, M_TEMP);
1023 watcher->event_list = NULL;
1025 if (watcher->devices_not_to_watch) {
1026 FREE(watcher->devices_not_to_watch, M_TEMP);
1027 watcher->devices_not_to_watch = NULL;
1029 FREE(watcher, M_TEMP);
1089 watcher_add_event(fs_event_watcher *watcher, kfs_event *kfse)
1091 if (kfse->abstime > watcher->max_event_id) {
1092 watcher->max_event_id = kfse->abstime;
1095 if (((watcher->wr + 1) % watcher->eventq_size) == watcher->rd) {
1096 watcher->flags |= WATCHER_DROPPED_EVENTS;
1097 fsevents_wakeup(watcher);
1102 watcher->event_queue[watcher->wr] = kfse;
1104 watcher->wr = (watcher->wr + 1) % watcher->eventq_size;
1107 // wake up the watcher if there are more than MAX_NUM_PENDING events.
1113 if (watcher->rd < watcher->wr) {
1114 num_pending = watcher->wr - watcher->rd;
1117 if (watcher->rd > watcher->wr) {
1118 num_pending = watcher->wr + watcher->eventq_size - watcher->rd;
1121 if (num_pending > (watcher->eventq_size*3/4) && !(watcher->flags & WATCHER_APPLE_SYSTEM_SERVICE)) {
1124 while (watcher->rd != watcher->wr) {
1125 kfse = watcher->event_queue[watcher->rd];
1126 watcher->event_queue[watcher->rd] = NULL;
1127 watcher->rd = (watcher->rd+1) % watcher->eventq_size;
1133 watcher->flags |= WATCHER_DROPPED_EVENTS;
1136 printf("fsevents: watcher falling behind: %s (pid: %d) rd: %4d wr: %4d q_size: %4d flags: 0x%x\n",
1137 watcher->proc_name, watcher->pid, watcher->rd, watcher->wr,
1138 watcher->eventq_size, watcher->flags);
1140 fsevents_wakeup(watcher);
1142 fsevents_wakeup(watcher);
1217 static int copy_out_kfse(fs_event_watcher *watcher, kfs_event *kfse, struct uio *uio) __attribute__((noinline));
1220 copy_out_kfse(fs_event_watcher *watcher, kfs_event *kfse, struct uio *uio)
1249 if (watcher->flags & WATCHER_WANTS_EXTENDED_INFO) {
1294 if (watcher->flags & WATCHER_WANTS_COMPACT_EVENTS) {
1378 fmod_watch(fs_event_watcher *watcher, struct uio *uio)
1389 if (uio_resid(uio) < 2048 || watcher == NULL) {
1393 if (watcher->flags & WATCHER_CLOSING) {
1397 if (OSAddAtomic(1, &watcher->num_readers) != 0) {
1399 OSAddAtomic(-1, &watcher->num_readers);
1404 if (watcher->rd == watcher->wr) {
1405 if (watcher->flags & WATCHER_CLOSING) {
1406 OSAddAtomic(-1, &watcher->num_readers);
1409 OSAddAtomic(1, &watcher->blockers);
1412 error = tsleep((caddr_t)watcher, PUSER|PCATCH, "fsevents_empty", 0);
1414 OSAddAtomic(-1, &watcher->blockers);
1416 if (error != 0 || (watcher->flags & WATCHER_CLOSING)) {
1417 OSAddAtomic(-1, &watcher->num_readers);
1423 if (watcher->flags & WATCHER_DROPPED_EVENTS) {
1438 OSAddAtomic(-1, &watcher->num_readers);
1442 watcher->flags &= ~WATCHER_DROPPED_EVENTS;
1448 while (uio_resid(uio) > 0 && watcher->rd != watcher->wr) {
1449 if (watcher->flags & WATCHER_CLOSING) {
1458 kfse = watcher->event_queue[watcher->rd];
1463 if (watcher->event_list[kfse->type] == FSE_REPORT && watcher_cares_about_dev(watcher, kfse->dev)) {
1465 if (!(watcher->flags & WATCHER_APPLE_SYSTEM_SERVICE) & is_ignored_directory(kfse->str)) {
1478 error = copy_out_kfse(watcher, kfse, uio);
1497 watcher->event_queue[watcher->rd] = NULL;
1498 watcher->rd = (watcher->rd + 1) % watcher->eventq_size;
1509 OSAddAtomic(-1, &watcher->num_readers);
1538 fs_event_watcher *watcher;
1552 error = fmod_watch(fseh->watcher, uio);
1635 fseh->watcher->flags |= WATCHER_WANTS_COMPACT_EVENTS;
1640 fseh->watcher->flags |= WATCHER_WANTS_EXTENDED_INFO;
1645 *(uint64_t *)data = fseh->watcher->max_event_id;
1661 tmp = fseh->watcher->devices_not_to_watch;
1664 fseh->watcher->devices_not_to_watch = NULL;
1665 fseh->watcher->num_devices = new_num_devices;
1691 fseh->watcher->num_devices = new_num_devices;
1692 tmp = fseh->watcher->devices_not_to_watch;
1693 fseh->watcher->devices_not_to_watch = devices_not_to_watch;
1719 if ((which != FREAD) || (fseh->watcher->flags & WATCHER_CLOSING)) {
1725 if (fseh->watcher->rd != fseh->watcher->wr) {
1749 fs_event_watcher *watcher;
1753 tsleep((caddr_t)fseh->watcher, PRIBIO, "fsevents-close", 1);
1756 watcher = fseh->watcher;
1758 fseh->watcher = NULL;
1760 remove_watcher(watcher);
1799 rd = fseh->watcher->rd;
1800 wr = fseh->watcher->wr;
1804 amt = fseh->watcher->eventq_size - (rd - wr);
1865 fseh->watcher->flags |= WATCHER_CLOSING;
1871 while(fseh->watcher->blockers && counter++ < 500) {
1879 fsevents_wakeup(fseh->watcher);
1882 tsleep((caddr_t)fseh->watcher, PRIBIO, "watcher-close", 1);
2184 &fseh->watcher,
2192 fseh->watcher->fseh = fseh;
2226 fsevents_wakeup(fs_event_watcher *watcher)
2228 selwakeup(&watcher->fseh->si);
2229 KNOTE(&watcher->fseh->knotes, NOTE_WRITE|NOTE_NONE);
2230 wakeup((caddr_t)watcher);