aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/lua.patch
diff options
context:
space:
mode:
authorGravatar mitchell <70453897+667e-11@users.noreply.github.com>2018-10-16 17:35:27 -0400
committerGravatar mitchell <70453897+667e-11@users.noreply.github.com>2018-10-16 17:35:27 -0400
commitc88ae934a528eb174e956da9cb371de9ac536288 (patch)
tree41db96ad6b7c70df4bc6e047ddb138001fb4c790 /src/lua.patch
parentc26866ad69a5f4deafc023b5c80bddf6d61f981d (diff)
Restore Mac-specific spawned process file descriptor monitoring.
Despite the fact GLib no longer aborts when polling file descriptors, it still appears to mostly block while polling, rendering Textadept mostly useless.
Diffstat (limited to 'src/lua.patch')
-rw-r--r--src/lua.patch56
1 files changed, 40 insertions, 16 deletions
diff --git a/src/lua.patch b/src/lua.patch
index 76e40361..7e954d31 100644
--- a/src/lua.patch
+++ b/src/lua.patch
@@ -47,8 +47,8 @@ diff -r 8a23edc91533 src/luaconf.h
#endif /* } */
---- a/src/loslib.c 2018-10-15 09:20:06.000000000 -0400
-+++ b/src/loslib.c 2018-10-15 09:20:13.000000000 -0400
+--- a/src/loslib.c 2017-04-19 13:29:57.000000000 -0400
++++ b/src/loslib.c 2018-10-16 17:27:04.962929037 -0400
@@ -4,6 +4,15 @@
** See Copyright Notice in lua.h
*/
@@ -85,7 +85,7 @@ diff -r 8a23edc91533 src/luaconf.h
{"time", os_time},
{"tmpname", os_tmpname},
{NULL, NULL}
-@@ -404,6 +419,594 @@
+@@ -404,6 +419,618 @@
LUAMOD_API int luaopen_os (lua_State *L) {
luaL_newlib(L, syslib);
@@ -108,7 +108,7 @@ diff -r 8a23edc91533 src/luaconf.h
+#include <glib.h>
+#endif
+#if !_WIN32
-+#if !GTK
++#if (!GTK || __APPLE__)
+#include <errno.h>
+#include <sys/select.h>
+#endif
@@ -146,7 +146,7 @@ diff -r 8a23edc91533 src/luaconf.h
+#else
+ HANDLE pid, fstdin, fstdout, fstderr;
+#endif
-+#if GTK
++#if (GTK && !__APPLE__)
+ GIOChannel *cstdout, *cstderr;
+#endif
+ int stdout_cb, stderr_cb, exit_cb;
@@ -156,9 +156,9 @@ diff -r 8a23edc91533 src/luaconf.h
+static int lp_status(lua_State *L) {
+ PStream *p = (PStream *)luaL_checkudata(L, 1, "ta_spawn");
+ lua_pushstring(L, p->pid ? "running" : "terminated");
- return 1;
- }
-
++ return 1;
++}
++
+/** p:wait() Lua function. */
+static int lp_wait(lua_State *L) {
+ PStream *p = (PStream *)luaL_checkudata(L, 1, "ta_spawn");
@@ -175,7 +175,7 @@ diff -r 8a23edc91533 src/luaconf.h
+ if (*c == '*') c++; // skip optional '*' (for compatibility)
+ luaL_argcheck(L, *c == 'l' || *c == 'L' || *c == 'a' || lua_isnumber(L, 2), 2,
+ "invalid option");
-+#if GTK
++#if (GTK && !__APPLE__)
+ char *buf;
+ size_t len;
+ GError *error = NULL;
@@ -278,10 +278,10 @@ diff -r 8a23edc91533 src/luaconf.h
+ lua_pushfstring(L, "process (pid=%d)", p->pid);
+ else
+ lua_pushstring(L, "process (terminated)");
-+ return 1;
-+}
-+
-+#if GTK
+ return 1;
+ }
+
++#if (GTK && !__APPLE__)
+/** __gc Lua metamethod. */
+static int lp_gc(lua_State *L) {
+ PStream *p = (PStream *)luaL_checkudata(L, 1, "ta_spawn");
@@ -430,6 +430,25 @@ diff -r 8a23edc91533 src/luaconf.h
+ lua_pop(L, 1); // spawn_procs
+ return n;
+}
++
++#if (GTK && __APPLE__)
++static int monitoring_fds = 0;
++/**
++ * Monitors spawned fds when GTK is idle.
++ * This is necessary because at the moment, using GLib on Mac OSX to spawn
++ * and monitor file descriptors mostly blocks when attempting to poll those fds.
++ */
++static int monitor_fds(void *data) {
++ lua_State *L = (lua_State *)data;
++ struct timeval timeout = {0, 1e5}; // 0.1s
++ int nfds = os_spawn_pushfds(L);
++ fd_set *fds = (fd_set *)lua_touserdata(L, -1);
++ if (select(nfds, fds, NULL, NULL, &timeout) > 0) os_spawn_readfds(L);
++ lua_pop(L, 1); // fd_set
++ if (nfds == 1) monitoring_fds = 0;
++ return nfds > 1;
++}
++#endif
+#endif
+
+/** spawn() Lua function. */
@@ -438,7 +457,7 @@ diff -r 8a23edc91533 src/luaconf.h
+ // Determine process parameters (argv, cwd, envp).
+#if !_WIN32
+ // Construct argv from first string param.
-+#if GTK
++#if (GTK && !__APPLE__)
+ char **argv = NULL;
+ GError *error = NULL;
+ if (!g_shell_parse_argv(luaL_checkstring(L, narg++), NULL, &argv, &error)) {
@@ -540,7 +559,7 @@ diff -r 8a23edc91533 src/luaconf.h
+ l_setcfunction(L, -1, "close", lp_close);
+ l_setcfunction(L, -1, "kill", lp_kill);
+ l_setcfunction(L, -1, "__tostring", lp_tostring);
-+#if GTK
++#if (GTK && !__APPLE__)
+ l_setcfunction(L, -1, "__gc", lp_gc);
+#endif
+ lua_pushvalue(L, -1), lua_setfield(L, -2, "__index");
@@ -549,7 +568,7 @@ diff -r 8a23edc91533 src/luaconf.h
+
+ // Spawn the process, connecting to stdin, stdout, stderr, and exit.
+#if !_WIN32
-+#if GTK
++#if (GTK && !__APPLE__)
+ GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH;
+ if (g_spawn_async_with_pipes(cwd, argv, envp, flags, NULL, NULL, &p->pid,
+ &p->fstdin, &p->fstdout, &p->fstderr, &error)) {
@@ -579,6 +598,11 @@ diff -r 8a23edc91533 src/luaconf.h
+ lua_pushvalue(L, -2), lua_pushboolean(L, 1), lua_settable(L, -3);
+ lua_pop(L, 1); // spawn_procs
+ lua_pushnil(L); // no error
++#if (GTK && __APPLE__)
++ // On GTK-OSX, manually monitoring spawned fds prevents the fd polling
++ // aborts caused by GLib.
++ if (!monitoring_fds) g_idle_add(monitor_fds, L), monitoring_fds = 1;
++#endif
+ } else if (pid == 0) {
+ // Child process: redirect stdin, stdout, and stderr, chdir, and exec.
+ close(pstdin[1]), close(pstdout[0]), close(pstderr[0]);