extern void x_set_z_group (struct frame *f, Lisp_Object new_value,
Lisp_Object old_value);
extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timespec const *timeout,
- sigset_t const *sigmask);
+ fd_set *exceptfds, struct timespec *timeout,
+ sigset_t *sigmask);
+#ifdef HAVE_PTHREAD
+extern void ns_run_loop_break (void);
+#endif
extern unsigned long ns_get_rgb_color (struct frame *f,
float r, float g, float b, float a);
app->nextappdefined = value;
[app performSelectorOnMainThread:@selector (sendFromMainThread:)
withObject:nil
- waitUntilDone:YES];
+ waitUntilDone:NO];
return;
}
int
ns_select (int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timespec const *timeout,
- sigset_t const *sigmask)
+ fd_set *exceptfds, struct timespec *timeout,
+ sigset_t *sigmask)
/* --------------------------------------------------------------------------
Replacement for select, checking for events
-------------------------------------------------------------------------- */
if (NSApp == nil
|| ![NSThread isMainThread]
|| (timeout && timeout->tv_sec == 0 && timeout->tv_nsec == 0))
- return pselect (nfds, readfds, writefds, exceptfds, timeout, sigmask);
+ return thread_select(pselect, nfds, readfds, writefds,
+ exceptfds, timeout, sigmask);
+ else
+ {
+ struct timespec t = {0, 0};
+ thread_select(pselect, 0, NULL, NULL, NULL, &t, sigmask);
+ }
[outerpool release];
outerpool = [[NSAutoreleasePool alloc] init];
return result;
}
+#ifdef HAVE_PTHREAD
+void
+ns_run_loop_break ()
+/* Break out of the NS run loop in ns_select or ns_read_socket. */
+{
+ NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_run_loop_break");
+
+ /* If we don't have a GUI, don't send the event. */
+ if (NSApp != NULL)
+ ns_send_appdefined(-1);
+}
+#endif
/* ==========================================================================
nfds = xg_select (max_desc + 1,
&Available, (check_write ? &Writeok : 0),
NULL, &timeout, NULL);
+#elif defined HAVE_NS
+ /* And NS builds call thread_select in ns_select. */
+ nfds = ns_select (max_desc + 1,
+ &Available, (check_write ? &Writeok : 0),
+ NULL, &timeout, NULL);
#else /* !HAVE_GLIB */
- nfds = thread_select (
-# ifdef HAVE_NS
- ns_select
-# else
- pselect
-# endif
- , max_desc + 1,
+ nfds = thread_select (pselect, max_desc + 1,
&Available,
(check_write ? &Writeok : 0),
NULL, &timeout, NULL);
#include <setjmp.h>
#include "lisp.h"
+#ifdef HAVE_NS
+#include "nsterm.h"
+#endif
+
#ifndef THREADS_ENABLED
void
sys_cond_broadcast (sys_cond_t *cond)
{
pthread_cond_broadcast (cond);
+#ifdef HAVE_NS
+ /* Send an app defined event to break out of the NS run loop.
+ It seems that if ns_select is running the NS run loop, this
+ broadcast has no effect until the loop is done, breaking a couple
+ of tests in thread-tests.el. */
+ ns_run_loop_break ();
+#endif
}
void