Merge pull request #1830 from aaugustin/instant-reload-os-x
Add instant autoreload on platforms supporting kqueue. Fix #21356.
This commit is contained in:
commit
a023a84c06
|
@ -65,6 +65,16 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
import select
|
||||||
|
select.kevent, select.kqueue
|
||||||
|
USE_KQUEUE = True
|
||||||
|
|
||||||
|
import resource
|
||||||
|
NOFILES_SOFT, NOFILES_HARD = resource.getrlimit(resource.RLIMIT_NOFILE)
|
||||||
|
except AttributeError:
|
||||||
|
USE_KQUEUE = False
|
||||||
|
|
||||||
RUN_RELOADER = True
|
RUN_RELOADER = True
|
||||||
|
|
||||||
_mtimes = {}
|
_mtimes = {}
|
||||||
|
@ -119,6 +129,31 @@ def inotify_code_changed():
|
||||||
# If we are here the code must have changed.
|
# If we are here the code must have changed.
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def kqueue_code_changed():
|
||||||
|
"""
|
||||||
|
Checks for changed code using kqueue. After being called
|
||||||
|
it blocks until a change event has been fired.
|
||||||
|
"""
|
||||||
|
# Maximum number of open file descriptors is typically too low (256).
|
||||||
|
filenames = list(gen_filenames())
|
||||||
|
resource.setrlimit(resource.RLIMIT_NOFILE,
|
||||||
|
(NOFILES_SOFT + len(filenames), NOFILES_HARD))
|
||||||
|
|
||||||
|
kqueue = select.kqueue()
|
||||||
|
fds = [open(filename) for filename in filenames]
|
||||||
|
|
||||||
|
_filter = select.KQ_FILTER_VNODE
|
||||||
|
flags = select.KQ_EV_ADD
|
||||||
|
fflags = select.KQ_NOTE_DELETE | select.KQ_NOTE_WRITE | select.KQ_NOTE_RENAME
|
||||||
|
kevents = [select.kevent(fd, _filter, flags, fflags) for fd in fds]
|
||||||
|
kqueue.control(kevents, 1)
|
||||||
|
|
||||||
|
for fd in fds:
|
||||||
|
fd.close()
|
||||||
|
kqueue.close()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def code_changed():
|
def code_changed():
|
||||||
global _mtimes, _win
|
global _mtimes, _win
|
||||||
for filename in gen_filenames():
|
for filename in gen_filenames():
|
||||||
|
@ -178,6 +213,8 @@ def reloader_thread():
|
||||||
ensure_echo_on()
|
ensure_echo_on()
|
||||||
if USE_INOTIFY:
|
if USE_INOTIFY:
|
||||||
fn = inotify_code_changed
|
fn = inotify_code_changed
|
||||||
|
elif USE_KQUEUE:
|
||||||
|
fn = kqueue_code_changed
|
||||||
else:
|
else:
|
||||||
fn = code_changed
|
fn = code_changed
|
||||||
while RUN_RELOADER:
|
while RUN_RELOADER:
|
||||||
|
|
Loading…
Reference in New Issue