>From f759adb30eaf12af474057ebbc98f5f76cc590bf Mon Sep 17 00:00:00 2001 From: Alan Third Date: Sun, 30 Apr 2017 10:04:16 +0100 Subject: [PATCH] Remove event loop from ns_select * src/nsterm.m (ns_select): Remove event processing loop and replace with simple test for a new event. (ns_send_appdefined): Remove redundant timer code. --- src/nsterm.m | 92 ++++++++++++++++++++++++++++-------------------------------- 1 file changed, 43 insertions(+), 49 deletions(-) diff --git a/src/nsterm.m b/src/nsterm.m index 00b7a89472..462ab176c9 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -282,7 +282,6 @@ - (NSColor *)colorUsingDefaultColorSpace static BOOL send_appdefined = YES; #define NO_APPDEFINED_DATA (-8) static int last_appdefined_event_data = NO_APPDEFINED_DATA; -static NSTimer *timed_entry = 0; static NSTimer *scroll_repeat_entry = nil; static fd_set select_readfds, select_writefds; enum { SELECT_HAVE_READ = 1, SELECT_HAVE_WRITE = 2, SELECT_HAVE_TMO = 4 }; @@ -4074,14 +4073,6 @@ in certain situations (rapid incoming events). /* We only need one NX_APPDEFINED event to stop NXApp from running. */ send_appdefined = NO; - /* Don't need wakeup timer any more */ - if (timed_entry) - { - [timed_entry invalidate]; - [timed_entry release]; - timed_entry = nil; - } - nxev = [NSEvent otherEventWithType: NSEventTypeApplicationDefined location: NSMakePoint (0, 0) modifierFlags: 0 @@ -4277,9 +4268,11 @@ in certain situations (rapid incoming events). { int result; int t, k, nr = 0; - struct input_event event; char c; + NSDate *timeout_date = nil; + NSEvent *ns_event; + NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select"); #ifdef HAVE_NATIVE_FS @@ -4337,70 +4330,71 @@ in certain situations (rapid incoming events). /* Inform fd_handler that select should be called */ c = 'g'; emacs_write_sig (selfds[1], &c, 1); + /* We rely on fd_handler timing out to cause + nextEventMatchingMask below to return, so set it's timeout to + an unreasonably long time. */ + timeout_date = [NSDate distantFuture]; } else if (nr == 0 && timeout) { - /* No file descriptor, just a timeout, no need to wake fd_handler */ + /* No file descriptor, just a timeout, no need to wake + fd_handler. Set nextEventMatchingMask timeout. */ double time = timespectod (*timeout); - timed_entry = [[NSTimer scheduledTimerWithTimeInterval: time - target: NSApp - selector: - @selector (timeout_handler:) - userInfo: 0 - repeats: NO] - retain]; - } - else /* No timeout and no file descriptors, can this happen? */ - { - /* Send appdefined so we exit from the loop */ - ns_send_appdefined (-1); + timeout_date = [NSDate dateWithTimeIntervalSinceNow: time]; } - block_input (); - ns_init_events (&event); - - [NSApp run]; + /* Listen for a new NSEvent. */ + ns_event = [NSApp nextEventMatchingMask: NSEventMaskAny + untilDate: timeout_date + inMode: NSDefaultRunLoopMode + dequeue: NO]; - ns_finish_events (); if (nr > 0 && readfds) { c = 's'; emacs_write_sig (selfds[1], &c, 1); } - unblock_input (); - - t = last_appdefined_event_data; - if (t != NO_APPDEFINED_DATA) + if (ns_event != nil) { - last_appdefined_event_data = NO_APPDEFINED_DATA; - - if (t == -2) + if ([ns_event type] == NSEventTypeApplicationDefined) { - /* The NX_APPDEFINED event we received was a timeout. */ - result = 0; + if ([ns_event data1] < 0) + { + /* The NX_APPDEFINED event we received was a timeout. */ + result = 0; + } + else + { + /* Received back from select () in fd_handler; copy the results */ + pthread_mutex_lock (&select_mutex); + if (readfds) *readfds = select_readfds; + if (writefds) *writefds = select_writefds; + pthread_mutex_unlock (&select_mutex); + result = [ns_event data1]; + } + + /* Remove the NX_APPDEFINED event from the queue as it's no + longer needed. */ + [NSApp nextEventMatchingMask: NSEventMaskAny + untilDate: nil + inMode: NSDefaultRunLoopMode + dequeue: YES]; } - else if (t == -1) + else { - /* The NX_APPDEFINED event we received was the result of - at least one real input event arriving. */ + /* A real NSEvent came in. */ + handle_input_available_signal (0); errno = EINTR; result = -1; } - else - { - /* Received back from select () in fd_handler; copy the results */ - pthread_mutex_lock (&select_mutex); - if (readfds) *readfds = select_readfds; - if (writefds) *writefds = select_writefds; - pthread_mutex_unlock (&select_mutex); - result = t; - } } else { errno = EINTR; result = -1; + /* Reading from the NSEvent queue timed out. */ + result = 0; } return result; -- 2.12.0