Remove NSEvent loop from ns_select (bug#25265)

* src/nsterm.m (ns_select): Remove event processing loop and replace
with simple test for a new event.
This commit is contained in:
Alan Third 2017-03-06 19:50:47 +00:00
parent eae5dcd57d
commit 3bd2e9e975

View file

@ -4108,6 +4108,9 @@ in certain situations (rapid incoming events).
struct input_event event;
char c;
NSDate *timeout_date = nil;
NSEvent *ns_event;
NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select");
#ifdef HAVE_NATIVE_FS
@ -4170,65 +4173,58 @@ in certain situations (rapid incoming events).
{
/* No file descriptor, just a timeout, no need to wake fd_handler */
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);
/* Listen for a new NSEvent. */
ns_event = [NSApp nextEventMatchingMask: NSEventMaskAny
untilDate: timeout_date
inMode: NSDefaultRunLoopMode
dequeue: NO];
[NSApp run];
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 ([ns_event type] == NSEventTypeApplicationDefined)
{
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];
}
if (t == -2)
{
/* The NX_APPDEFINED event we received was a timeout. */
result = 0;
}
else if (t == -1)
{
/* The NX_APPDEFINED event we received was the result of
at least one real input event arriving. */
errno = EINTR;
result = -1;
/* Remove the NX_APPDEFINED event from the queue as it's no
longer needed. */
[NSApp nextEventMatchingMask: NSEventMaskAny
untilDate: nil
inMode: NSDefaultRunLoopMode
dequeue: YES];
}
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;
/* A real NSEvent came in. */
errno = EINTR;
result = -1;
}
}
else
{
errno = EINTR;
result = -1;
/* Reading from the NSEvent queue timed out. */
result = 0;
}
return result;