diff --git a/racket/src/racket/src/inotify.inc b/racket/src/racket/src/inotify.inc index 391f93627e..b9e235dd68 100644 --- a/racket/src/racket/src/inotify.inc +++ b/racket/src/racket/src/inotify.inc @@ -23,7 +23,7 @@ typedef struct mz_wd_t { } mz_wd_t; typedef struct mz_inotify_state_t { - int ready, fd; + int ready, errid, fd; mz_wd_t *wds; int size, count; int got; @@ -114,18 +114,24 @@ static void mz_inotify_start(mz_inotify_state_t *s) int fd; fd = inotify_init(); - - s->ready = 1; - s->fd = fd; + if (fd == -1) { + s->errid = errno; + } else { + s->errid = 0; + s->ready = 1; + s->fd = fd; + } } static void mz_inotify_end(mz_inotify_state_t *s) { int rc; - do { - rc = close(s->fd); - } while (rc == -1 && errno == EINTR); + if (s->ready) { + do { + rc = close(s->fd); + } while (rc == -1 && errno == EINTR); + } if (s->wds) free(s->wds); @@ -134,16 +140,17 @@ static void mz_inotify_end(mz_inotify_state_t *s) static void mz_inotify_init() { - if (!scheme_inotify_server) { - mz_inotify_state_t *s; + mz_inotify_state_t *s = scheme_inotify_server; + if (!s) { s = (mz_inotify_state_t *)malloc(sizeof(mz_inotify_state_t)); memset(s, 0, sizeof(mz_inotify_state_t)); - mz_inotify_start(s); - scheme_inotify_server = s; } + + if (!s->ready) + mz_inotify_start(s); } static int mz_inotify_ready() @@ -153,6 +160,13 @@ static int mz_inotify_ready() return s->ready; } +static int mz_inotify_errid() +{ + mz_inotify_state_t *s = (mz_inotify_state_t *)scheme_inotify_server; + + return s->errid; +} + /* Other functions are called only if mz_inotify_ready() returns 1. */ static int mz_inotify_add(char *filename) @@ -166,7 +180,7 @@ static int mz_inotify_add(char *filename) int i; new_wds = (mz_wd_t *)malloc(sizeof(mz_wd_t) * new_size); memcpy(new_wds, s->wds, s->size * sizeof(mz_wd_t)); - free(s->wds); + if (s->wds) free(s->wds); s->wds = new_wds; s->size = new_size; for (i = s->count; i < s->size; i++) diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 5d86f08a50..e742966511 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -6060,7 +6060,7 @@ Scheme_Object *scheme_filesystem_change_evt(Scheme_Object *path, int flags, int /* see "inotify.inc" */ mz_inotify_init(); if (!mz_inotify_ready()) - errid = EAGAIN; + errid = mz_inotify_errid(); else { fd = mz_inotify_add(filename); if (fd == -1)