* [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
@ 2013-10-21 17:16 Aaron Wu
2013-10-21 22:56 ` Arnout Vandecappelle
2013-11-01 18:33 ` Thomas Petazzoni
0 siblings, 2 replies; 5+ messages in thread
From: Aaron Wu @ 2013-10-21 17:16 UTC (permalink / raw)
To: buildroot
Signed-off-by: Aaron Wu <aaron.wu@analog.com>
add no-mmu support for libglib-2.36.3
---
package/libglib2/glib2.36.3_nommu.patch | 354 +++++++++++++++++++++++++++++++
1 file changed, 354 insertions(+)
create mode 100644 package/libglib2/glib2.36.3_nommu.patch
diff --git a/package/libglib2/glib2.36.3_nommu.patch b/package/libglib2/glib2.36.3_nommu.patch
new file mode 100644
index 0000000..192e8af
--- /dev/null
+++ b/package/libglib2/glib2.36.3_nommu.patch
@@ -0,0 +1,354 @@
+diff -Nur glib-2.36.3/configure.ac glib-2.36.3_new/configure.ac
+--- glib-2.36.3/configure.ac 2013-06-10 06:53:13.000000000 +0800
++++ glib-2.36.3_new/configure.ac 2013-10-21 19:25:28.806513398 +0800
+@@ -580,7 +580,7 @@
+ # Checks for library functions.
+ AC_FUNC_VPRINTF
+ AC_FUNC_ALLOCA
+-AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid)
++AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid fork)
+ AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r)
+
+ AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure,
+diff -Nur glib-2.36.3/gio/gtestdbus.c glib-2.36.3_new/gio/gtestdbus.c
+--- glib-2.36.3/gio/gtestdbus.c 2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/gio/gtestdbus.c 2013-10-21 21:23:04.350552212 +0800
+@@ -245,7 +245,11 @@
+ g_assert_not_reached ();
+ }
+
++#ifdef HAVE_FORK
+ switch (fork ())
++#else
++ switch (vfork ())
++#endif
+ {
+ case -1:
+ g_warning ("fork() failed: %m");
+diff -Nur glib-2.36.3/gio/tests/gdbus-non-socket.c glib-2.36.3_new/gio/tests/gdbus-non-socket.c
+--- glib-2.36.3/gio/tests/gdbus-non-socket.c 2013-06-10 06:03:17.000000000 +0800
++++ glib-2.36.3_new/gio/tests/gdbus-non-socket.c 2013-10-22 00:07:55.686606621 +0800
+@@ -151,7 +151,11 @@
+ g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[1])));
+ g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[1])));
+
++#ifdef HAVE_FORK
+ switch ((first_child = fork ()))
++#else
++ switch ((first_child = vfork ()))
++#endif
+ {
+ case -1:
+ g_assert_not_reached ();
+@@ -271,7 +275,11 @@
+
+ g_object_unref (connection);
+ g_main_loop_unref (loop);
++#ifdef HAVE_FORK
+ exit (0);
++#else
++ _exit (0);
++#endif
+ }
+
+ #else /* G_OS_UNIX */
+diff -Nur glib-2.36.3/gio/tests/socket.c glib-2.36.3_new/gio/tests/socket.c
+--- glib-2.36.3/gio/tests/socket.c 2013-06-03 07:20:53.000000000 +0800
++++ glib-2.36.3_new/gio/tests/socket.c 2013-10-21 23:54:59.222602354 +0800
+@@ -756,7 +756,11 @@
+ status = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
+ g_assert_cmpint (status, ==, 0);
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+ g_assert_cmpint (pid, >=, 0);
+
+ /* Child: close its copy of the write end of the pipe, receive it
+@@ -787,7 +791,11 @@
+ len = write (fd, TEST_DATA, sizeof (TEST_DATA));
+ while (len == -1 && errno == EINTR);
+ g_assert_cmpint (len, ==, sizeof (TEST_DATA));
++#ifdef HAVE_FORK
+ exit (0);
++#else
++ _exit (0);
++#endif
+ }
+ else
+ {
+diff -Nur glib-2.36.3/glib/gbacktrace.c glib-2.36.3_new/glib/gbacktrace.c
+--- glib-2.36.3/glib/gbacktrace.c 2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/glib/gbacktrace.c 2013-10-21 20:55:48.758543214 +0800
+@@ -242,7 +242,11 @@
+ args[1] = (gchar*) prg_name;
+ args[2] = buf;
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+ if (pid == 0)
+ {
+ stack_trace (args);
+@@ -295,7 +299,11 @@
+ _exit (0);
+ }
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+ if (pid == 0)
+ {
+ close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
+diff -Nur glib-2.36.3/glib/gspawn.c glib-2.36.3_new/glib/gspawn.c
+--- glib-2.36.3/glib/gspawn.c 2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/glib/gspawn.c 2013-10-21 19:39:13.410517935 +0800
+@@ -1332,7 +1332,11 @@
+ if (standard_error && !make_pipe (stderr_pipe, error))
+ goto cleanup_and_fail;
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+
+ if (pid < 0)
+ {
+@@ -1382,7 +1386,11 @@
+ */
+ GPid grandchild_pid;
+
++#ifdef HAVE_FORK
+ grandchild_pid = fork ();
++#else
++ grandchild_pid = vfork ();
++#endif
+
+ if (grandchild_pid < 0)
+ {
+diff -Nur glib-2.36.3/glib/gtestutils.c glib-2.36.3_new/glib/gtestutils.c
+--- glib-2.36.3/glib/gtestutils.c 2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/glib/gtestutils.c 2013-10-21 19:40:56.330518502 +0800
+@@ -2204,7 +2204,11 @@
+ if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0)
+ g_error ("failed to create pipes to fork test program: %s", g_strerror (errno));
+ signal (SIGCHLD, SIG_DFL);
++#ifdef HAVE_FORK
+ test_trap_last_pid = fork ();
++#else
++ test_trap_last_pid = vfork ();
++#endif
+ if (test_trap_last_pid < 0)
+ g_error ("failed to fork test program: %s", g_strerror (errno));
+ if (test_trap_last_pid == 0) /* child */
+diff -Nur glib-2.36.3/tests/child-test.c glib-2.36.3_new/tests/child-test.c
+--- glib-2.36.3/tests/child-test.c 2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/tests/child-test.c 2013-10-21 20:56:50.358543552 +0800
+@@ -77,7 +77,11 @@
+
+ return pid;
+ #else
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+ if (pid < 0)
+ exit (1);
+
+diff -Nur glib-2.36.3/tests/timeloop-basic.c glib-2.36.3_new/tests/timeloop-basic.c
+--- glib-2.36.3/tests/timeloop-basic.c 2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop-basic.c 2013-10-22 00:04:26.130605473 +0800
+@@ -26,7 +26,11 @@
+ if (pipe(fds) < 0)
+ {
+ fprintf (stderr, "Cannot create pipe %s\n", strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+ }
+
+@@ -89,7 +93,11 @@
+ val = 0;
+ write_all (out_fd, (char *)&val, sizeof (val));
+
++#ifdef HAVE_FORK
+ exit (0);
++#else
++ _exit (0);
++#endif
+ }
+
+ int
+@@ -100,7 +108,11 @@
+ if (!read_all (source, (char *)&val, sizeof(val)))
+ {
+ fprintf (stderr,"Unexpected EOF\n");
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+
+ if (val)
+@@ -128,7 +140,11 @@
+ my_pipe (in_fds);
+ my_pipe (out_fds);
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+
+ if (pid > 0) /* Parent */
+ {
+@@ -151,7 +167,11 @@
+ else /* Error */
+ {
+ fprintf (stderr,"Cannot fork: %s\n", strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+ }
+
+diff -Nur glib-2.36.3/tests/timeloop.c glib-2.36.3_new/tests/timeloop.c
+--- glib-2.36.3/tests/timeloop.c 2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop.c 2013-10-22 00:00:00.290604006 +0800
+@@ -23,7 +23,11 @@
+ if (pipe(fds) < 0)
+ {
+ fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+
+ channels[0] = g_io_channel_unix_new (fds[0]);
+@@ -94,7 +98,11 @@
+ write_all (out_channel, (char *)&val, sizeof (val));
+ g_timer_destroy (timer);
+
++#ifdef HAVE_FORK
+ exit (0);
++#else
++ _exit (0);
++#endif
+ }
+
+ static gboolean
+@@ -108,7 +116,11 @@
+ if (!read_all (source, (char *)&val, sizeof(val)))
+ {
+ fprintf (stderr, "Unexpected EOF\n");
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+
+ if (val)
+@@ -143,7 +155,11 @@
+ io_pipe (in_channels);
+ io_pipe (out_channels);
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+
+ if (pid > 0) /* Parent */
+ {
+@@ -165,7 +181,11 @@
+ else /* Error */
+ {
+ fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+ }
+
+diff -Nur glib-2.36.3/tests/timeloop-closure.c glib-2.36.3_new/tests/timeloop-closure.c
+--- glib-2.36.3/tests/timeloop-closure.c 2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop-closure.c 2013-10-22 00:06:19.054606092 +0800
+@@ -24,7 +24,11 @@
+ if (pipe(fds) < 0)
+ {
+ fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+
+ channels[0] = g_io_channel_unix_new (fds[0]);
+@@ -95,7 +99,11 @@
+ write_all (out_channel, (char *)&val, sizeof (val));
+ g_timer_destroy (timer);
+
++#ifdef HAVE_FORK
+ exit (0);
++#else
++ _exit (0);
++#endif
+ }
+
+ static gboolean
+@@ -109,7 +117,11 @@
+ if (!read_all (source, (char *)&val, sizeof(val)))
+ {
+ fprintf (stderr, "Unexpected EOF\n");
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+
+ if (val)
+@@ -145,7 +157,11 @@
+ io_pipe (in_channels);
+ io_pipe (out_channels);
+
++#ifdef HAVE_FORK
+ pid = fork ();
++#else
++ pid = vfork ();
++#endif
+
+ if (pid > 0) /* Parent */
+ {
+@@ -169,7 +185,11 @@
+ else /* Error */
+ {
+ fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+ exit (1);
++#else
++ _exit (1);
++#endif
+ }
+ }
+
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
2013-10-21 17:16 [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3 Aaron Wu
@ 2013-10-21 22:56 ` Arnout Vandecappelle
2013-11-12 9:15 ` Wu, Aaron
2013-11-01 18:33 ` Thomas Petazzoni
1 sibling, 1 reply; 5+ messages in thread
From: Arnout Vandecappelle @ 2013-10-21 22:56 UTC (permalink / raw)
To: buildroot
Hi Aaron,
On 21/10/13 19:16, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> add no-mmu support for libglib-2.36.3
> ---
> package/libglib2/glib2.36.3_nommu.patch | 354 +++++++++++++++++++++++++++++++
> 1 file changed, 354 insertions(+)
> create mode 100644 package/libglib2/glib2.36.3_nommu.patch
>
> diff --git a/package/libglib2/glib2.36.3_nommu.patch b/package/libglib2/glib2.36.3_nommu.patch
> new file mode 100644
> index 0000000..192e8af
> --- /dev/null
> +++ b/package/libglib2/glib2.36.3_nommu.patch
> @@ -0,0 +1,354 @@
> +diff -Nur glib-2.36.3/configure.ac glib-2.36.3_new/configure.ac
> +--- glib-2.36.3/configure.ac 2013-06-10 06:53:13.000000000 +0800
> ++++ glib-2.36.3_new/configure.ac 2013-10-21 19:25:28.806513398 +0800
> +@@ -580,7 +580,7 @@
> + # Checks for library functions.
> + AC_FUNC_VPRINTF
> + AC_FUNC_ALLOCA
> +-AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid)
> ++AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid fork)
> + AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r)
> +
> + AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure,
> +diff -Nur glib-2.36.3/gio/gtestdbus.c glib-2.36.3_new/gio/gtestdbus.c
> +--- glib-2.36.3/gio/gtestdbus.c 2013-06-03 07:20:49.000000000 +0800
> ++++ glib-2.36.3_new/gio/gtestdbus.c 2013-10-21 21:23:04.350552212 +0800
> +@@ -245,7 +245,11 @@
> + g_assert_not_reached ();
> + }
> +
> ++#ifdef HAVE_FORK
> + switch (fork ())
> ++#else
> ++ switch (vfork ())
Have you checked if this still works? The child closes some fds, which
is normally not allowed after vfork. Also, the child seems to wait for
input for the parent, but with vfork the parent is suspended until the
child exec's or exits.
> ++#endif
> + {
> + case -1:
> + g_warning ("fork() failed: %m");
> +diff -Nur glib-2.36.3/gio/tests/gdbus-non-socket.c glib-2.36.3_new/gio/tests/gdbus-non-socket.c
> +--- glib-2.36.3/gio/tests/gdbus-non-socket.c 2013-06-10 06:03:17.000000000 +0800
> ++++ glib-2.36.3_new/gio/tests/gdbus-non-socket.c 2013-10-22 00:07:55.686606621 +0800
For tests, we normally prefer to disable them rather than fixing fork
calls.
> +@@ -151,7 +151,11 @@
> + g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[1])));
> + g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[1])));
> +
> ++#ifdef HAVE_FORK
> + switch ((first_child = fork ()))
> ++#else
> ++ switch ((first_child = vfork ()))
> ++#endif
> + {
> + case -1:
> + g_assert_not_reached ();
> +@@ -271,7 +275,11 @@
> +
> + g_object_unref (connection);
> + g_main_loop_unref (loop);
> ++#ifdef HAVE_FORK
> + exit (0);
> ++#else
> ++ _exit (0);
> ++#endif
> + }
> +
> + #else /* G_OS_UNIX */
> +diff -Nur glib-2.36.3/gio/tests/socket.c glib-2.36.3_new/gio/tests/socket.c
> +--- glib-2.36.3/gio/tests/socket.c 2013-06-03 07:20:53.000000000 +0800
> ++++ glib-2.36.3_new/gio/tests/socket.c 2013-10-21 23:54:59.222602354 +0800
> +@@ -756,7 +756,11 @@
> + status = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
> + g_assert_cmpint (status, ==, 0);
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
> ++#endif
> + g_assert_cmpint (pid, >=, 0);
> +
> + /* Child: close its copy of the write end of the pipe, receive it
> +@@ -787,7 +791,11 @@
> + len = write (fd, TEST_DATA, sizeof (TEST_DATA));
> + while (len == -1 && errno == EINTR);
> + g_assert_cmpint (len, ==, sizeof (TEST_DATA));
> ++#ifdef HAVE_FORK
> + exit (0);
> ++#else
> ++ _exit (0);
> ++#endif
> + }
> + else
> + {
> +diff -Nur glib-2.36.3/glib/gbacktrace.c glib-2.36.3_new/glib/gbacktrace.c
> +--- glib-2.36.3/glib/gbacktrace.c 2013-06-03 07:20:49.000000000 +0800
> ++++ glib-2.36.3_new/glib/gbacktrace.c 2013-10-21 20:55:48.758543214 +0800
> +@@ -242,7 +242,11 @@
> + args[1] = (gchar*) prg_name;
> + args[2] = buf;
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
This also looks like one that can't be replaced with vfork.
> ++#endif
> + if (pid == 0)
> + {
> + stack_trace (args);
> +@@ -295,7 +299,11 @@
> + _exit (0);
> + }
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
Same here.
> ++#endif
> + if (pid == 0)
> + {
> + close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
> +diff -Nur glib-2.36.3/glib/gspawn.c glib-2.36.3_new/glib/gspawn.c
> +--- glib-2.36.3/glib/gspawn.c 2013-06-10 06:03:18.000000000 +0800
> ++++ glib-2.36.3_new/glib/gspawn.c 2013-10-21 19:39:13.410517935 +0800
> +@@ -1332,7 +1332,11 @@
> + if (standard_error && !make_pipe (stderr_pipe, error))
> + goto cleanup_and_fail;
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
> ++#endif
> +
> + if (pid < 0)
> + {
> +@@ -1382,7 +1386,11 @@
> + */
> + GPid grandchild_pid;
> +
> ++#ifdef HAVE_FORK
> + grandchild_pid = fork ();
> ++#else
> ++ grandchild_pid = vfork ();
This looks like one that may work, but it really should be tested
extensively...
> ++#endif
> +
> + if (grandchild_pid < 0)
> + {
> +diff -Nur glib-2.36.3/glib/gtestutils.c glib-2.36.3_new/glib/gtestutils.c
> +--- glib-2.36.3/glib/gtestutils.c 2013-06-10 06:03:18.000000000 +0800
> ++++ glib-2.36.3_new/glib/gtestutils.c 2013-10-21 19:40:56.330518502 +0800
> +@@ -2204,7 +2204,11 @@
> + if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0)
> + g_error ("failed to create pipes to fork test program: %s", g_strerror (errno));
> + signal (SIGCHLD, SIG_DFL);
> ++#ifdef HAVE_FORK
> + test_trap_last_pid = fork ();
> ++#else
> ++ test_trap_last_pid = vfork ();
This one also does fd manipulation in the child so probably won't work.
> ++#endif
> + if (test_trap_last_pid < 0)
> + g_error ("failed to fork test program: %s", g_strerror (errno));
> + if (test_trap_last_pid == 0) /* child */
[snip]
Bottom line: you're going to have to work with upstream to fix these
things in a proper way. And I think it's going to take quite a bit of effort.
One possible work-around would be to disable the functions that rely on
fork, i.e. assert on entry. If possible, check with upstream what they
think of such a scenario, but this is something that may be acceptable
for us even if upstream doesn't like it.
Regards,
Arnout
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
2013-10-21 17:16 [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3 Aaron Wu
2013-10-21 22:56 ` Arnout Vandecappelle
@ 2013-11-01 18:33 ` Thomas Petazzoni
2013-11-04 1:12 ` Wu, Aaron
1 sibling, 1 reply; 5+ messages in thread
From: Thomas Petazzoni @ 2013-11-01 18:33 UTC (permalink / raw)
To: buildroot
Dear Aaron Wu,
On Tue, 22 Oct 2013 01:16:03 +0800, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> add no-mmu support for libglib-2.36.3
> ---
> package/libglib2/glib2.36.3_nommu.patch | 354 +++++++++++++++++++++++++++++++
> 1 file changed, 354 insertions(+)
> create mode 100644 package/libglib2/glib2.36.3_nommu.patch
You received some feedback from Arnout on October, 22nd, but have not
responded to it. However, fixing the libglib build on Blackfin is
really important. Can you take into account Arnout's feedback and post
an updated version of the patch as appropriate?
Thanks a lot!
Thomas
--
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
2013-11-01 18:33 ` Thomas Petazzoni
@ 2013-11-04 1:12 ` Wu, Aaron
0 siblings, 0 replies; 5+ messages in thread
From: Wu, Aaron @ 2013-11-04 1:12 UTC (permalink / raw)
To: buildroot
Hi Thomas,
Yes I will look into this and be back to you.
Regards,
Aaron
-----Original Message-----
From: Thomas Petazzoni [mailto:thomas.petazzoni at free-electrons.com]
Sent: 2013?11?2? 2:33
To: Wu, Aaron
Cc: buildroot at busybox.net; Zhang, Sonic
Subject: Re: [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
Dear Aaron Wu,
On Tue, 22 Oct 2013 01:16:03 +0800, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> add no-mmu support for libglib-2.36.3
> ---
> package/libglib2/glib2.36.3_nommu.patch | 354 +++++++++++++++++++++++++++++++
> 1 file changed, 354 insertions(+)
> create mode 100644 package/libglib2/glib2.36.3_nommu.patch
You received some feedback from Arnout on October, 22nd, but have not
responded to it. However, fixing the libglib build on Blackfin is
really important. Can you take into account Arnout's feedback and post
an updated version of the patch as appropriate?
Thanks a lot!
Thomas
--
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
2013-10-21 22:56 ` Arnout Vandecappelle
@ 2013-11-12 9:15 ` Wu, Aaron
0 siblings, 0 replies; 5+ messages in thread
From: Wu, Aaron @ 2013-11-12 9:15 UTC (permalink / raw)
To: buildroot
Hi Arnout,
Thanks for your time and nice comments, I made a few changes and sent you a new one, basically I am trying to comments out those tests relying on fork, looking forward to your feedback.
Regards,
Aaron
-----Original Message-----
From: Arnout Vandecappelle [mailto:arnout at mind.be]
Sent: 2013?10?22? 6:56
To: Wu, Aaron
Cc: buildroot at busybox.net
Subject: Re: [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3
Hi Aaron,
On 21/10/13 19:16, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> add no-mmu support for libglib-2.36.3
> ---
> package/libglib2/glib2.36.3_nommu.patch | 354 +++++++++++++++++++++++++++++++
> 1 file changed, 354 insertions(+)
> create mode 100644 package/libglib2/glib2.36.3_nommu.patch
>
> diff --git a/package/libglib2/glib2.36.3_nommu.patch b/package/libglib2/glib2.36.3_nommu.patch
> new file mode 100644
> index 0000000..192e8af
> --- /dev/null
> +++ b/package/libglib2/glib2.36.3_nommu.patch
> @@ -0,0 +1,354 @@
> +diff -Nur glib-2.36.3/configure.ac glib-2.36.3_new/configure.ac
> +--- glib-2.36.3/configure.ac 2013-06-10 06:53:13.000000000 +0800
> ++++ glib-2.36.3_new/configure.ac 2013-10-21 19:25:28.806513398 +0800
> +@@ -580,7 +580,7 @@
> + # Checks for library functions.
> + AC_FUNC_VPRINTF
> + AC_FUNC_ALLOCA
> +-AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid)
> ++AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid fork)
> + AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r)
> +
> + AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure,
> +diff -Nur glib-2.36.3/gio/gtestdbus.c glib-2.36.3_new/gio/gtestdbus.c
> +--- glib-2.36.3/gio/gtestdbus.c 2013-06-03 07:20:49.000000000 +0800
> ++++ glib-2.36.3_new/gio/gtestdbus.c 2013-10-21 21:23:04.350552212 +0800
> +@@ -245,7 +245,11 @@
> + g_assert_not_reached ();
> + }
> +
> ++#ifdef HAVE_FORK
> + switch (fork ())
> ++#else
> ++ switch (vfork ())
Have you checked if this still works? The child closes some fds, which
is normally not allowed after vfork. Also, the child seems to wait for
input for the parent, but with vfork the parent is suspended until the
child exec's or exits.
> ++#endif
> + {
> + case -1:
> + g_warning ("fork() failed: %m");
> +diff -Nur glib-2.36.3/gio/tests/gdbus-non-socket.c glib-2.36.3_new/gio/tests/gdbus-non-socket.c
> +--- glib-2.36.3/gio/tests/gdbus-non-socket.c 2013-06-10 06:03:17.000000000 +0800
> ++++ glib-2.36.3_new/gio/tests/gdbus-non-socket.c 2013-10-22 00:07:55.686606621 +0800
For tests, we normally prefer to disable them rather than fixing fork
calls.
> +@@ -151,7 +151,11 @@
> + g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[1])));
> + g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[1])));
> +
> ++#ifdef HAVE_FORK
> + switch ((first_child = fork ()))
> ++#else
> ++ switch ((first_child = vfork ()))
> ++#endif
> + {
> + case -1:
> + g_assert_not_reached ();
> +@@ -271,7 +275,11 @@
> +
> + g_object_unref (connection);
> + g_main_loop_unref (loop);
> ++#ifdef HAVE_FORK
> + exit (0);
> ++#else
> ++ _exit (0);
> ++#endif
> + }
> +
> + #else /* G_OS_UNIX */
> +diff -Nur glib-2.36.3/gio/tests/socket.c glib-2.36.3_new/gio/tests/socket.c
> +--- glib-2.36.3/gio/tests/socket.c 2013-06-03 07:20:53.000000000 +0800
> ++++ glib-2.36.3_new/gio/tests/socket.c 2013-10-21 23:54:59.222602354 +0800
> +@@ -756,7 +756,11 @@
> + status = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
> + g_assert_cmpint (status, ==, 0);
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
> ++#endif
> + g_assert_cmpint (pid, >=, 0);
> +
> + /* Child: close its copy of the write end of the pipe, receive it
> +@@ -787,7 +791,11 @@
> + len = write (fd, TEST_DATA, sizeof (TEST_DATA));
> + while (len == -1 && errno == EINTR);
> + g_assert_cmpint (len, ==, sizeof (TEST_DATA));
> ++#ifdef HAVE_FORK
> + exit (0);
> ++#else
> ++ _exit (0);
> ++#endif
> + }
> + else
> + {
> +diff -Nur glib-2.36.3/glib/gbacktrace.c glib-2.36.3_new/glib/gbacktrace.c
> +--- glib-2.36.3/glib/gbacktrace.c 2013-06-03 07:20:49.000000000 +0800
> ++++ glib-2.36.3_new/glib/gbacktrace.c 2013-10-21 20:55:48.758543214 +0800
> +@@ -242,7 +242,11 @@
> + args[1] = (gchar*) prg_name;
> + args[2] = buf;
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
This also looks like one that can't be replaced with vfork.
> ++#endif
> + if (pid == 0)
> + {
> + stack_trace (args);
> +@@ -295,7 +299,11 @@
> + _exit (0);
> + }
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
Same here.
> ++#endif
> + if (pid == 0)
> + {
> + close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
> +diff -Nur glib-2.36.3/glib/gspawn.c glib-2.36.3_new/glib/gspawn.c
> +--- glib-2.36.3/glib/gspawn.c 2013-06-10 06:03:18.000000000 +0800
> ++++ glib-2.36.3_new/glib/gspawn.c 2013-10-21 19:39:13.410517935 +0800
> +@@ -1332,7 +1332,11 @@
> + if (standard_error && !make_pipe (stderr_pipe, error))
> + goto cleanup_and_fail;
> +
> ++#ifdef HAVE_FORK
> + pid = fork ();
> ++#else
> ++ pid = vfork ();
> ++#endif
> +
> + if (pid < 0)
> + {
> +@@ -1382,7 +1386,11 @@
> + */
> + GPid grandchild_pid;
> +
> ++#ifdef HAVE_FORK
> + grandchild_pid = fork ();
> ++#else
> ++ grandchild_pid = vfork ();
This looks like one that may work, but it really should be tested
extensively...
> ++#endif
> +
> + if (grandchild_pid < 0)
> + {
> +diff -Nur glib-2.36.3/glib/gtestutils.c glib-2.36.3_new/glib/gtestutils.c
> +--- glib-2.36.3/glib/gtestutils.c 2013-06-10 06:03:18.000000000 +0800
> ++++ glib-2.36.3_new/glib/gtestutils.c 2013-10-21 19:40:56.330518502 +0800
> +@@ -2204,7 +2204,11 @@
> + if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0)
> + g_error ("failed to create pipes to fork test program: %s", g_strerror (errno));
> + signal (SIGCHLD, SIG_DFL);
> ++#ifdef HAVE_FORK
> + test_trap_last_pid = fork ();
> ++#else
> ++ test_trap_last_pid = vfork ();
This one also does fd manipulation in the child so probably won't work.
> ++#endif
> + if (test_trap_last_pid < 0)
> + g_error ("failed to fork test program: %s", g_strerror (errno));
> + if (test_trap_last_pid == 0) /* child */
[snip]
Bottom line: you're going to have to work with upstream to fix these
things in a proper way. And I think it's going to take quite a bit of effort.
One possible work-around would be to disable the functions that rely on
fork, i.e. assert on entry. If possible, check with upstream what they
think of such a scenario, but this is something that may be acceptable
for us even if upstream doesn't like it.
Regards,
Arnout
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-11-12 9:15 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-21 17:16 [Buildroot] [PATCH] add no-mmu support for libglib-2.36.3 Aaron Wu
2013-10-21 22:56 ` Arnout Vandecappelle
2013-11-12 9:15 ` Wu, Aaron
2013-11-01 18:33 ` Thomas Petazzoni
2013-11-04 1:12 ` Wu, Aaron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox