X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tests%2Fmapping-test.c;h=9128e357072fcdd3a5367a0848748abbcf1bddcf;hb=35a53bbb6b02e9e6dc09c03d55b1ffbeeb61c8fb;hp=1a10b190bc687727640d2cc5a9561e2af5f3f713;hpb=d8ca6404229e5b64d2bf2e1a3660ad9fe7feefdd;p=platform%2Fupstream%2Fglib.git
diff --git a/tests/mapping-test.c b/tests/mapping-test.c
index 1a10b19..9128e35 100644
--- a/tests/mapping-test.c
+++ b/tests/mapping-test.c
@@ -12,27 +12,26 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see .
*/
-#include "config.h"
-
#include
#include
-#ifdef HAVE_UNISTD_H
-#include
-#endif
#include
#include
#include "glib.h"
#include "gstdio.h"
+#ifdef G_OS_UNIX
+#include
+#endif
+
static gchar *dir, *filename, *displayname, *childname;
static gboolean stop = FALSE;
+static gint parent_pid;
+
#ifndef G_OS_WIN32
static void
@@ -94,27 +93,41 @@ map_or_die (const gchar *filename,
return map;
}
-
+
+static gboolean
+signal_parent (gpointer data)
+{
+#ifndef G_OS_WIN32
+ kill (parent_pid, SIGUSR1);
+#endif
+ return G_SOURCE_REMOVE;
+}
+
static int
child_main (int argc, char *argv[])
{
GMappedFile *map;
GMainLoop *loop;
+ parent_pid = atoi (argv[2]);
map = map_or_die (filename, FALSE);
-
- loop = g_main_loop_new (NULL, FALSE);
#ifndef G_OS_WIN32
signal (SIGUSR1, handle_usr1);
#endif
+ loop = g_main_loop_new (NULL, FALSE);
g_idle_add (check_stop, loop);
+ g_idle_add (signal_parent, NULL);
g_main_loop_run (loop);
+ g_message ("test_child_private: received parent signal");
+
write_or_die (childname,
g_mapped_file_get_contents (map),
g_mapped_file_get_length (map));
+ signal_parent (NULL);
+
return 0;
}
@@ -132,6 +145,7 @@ test_mapping (void)
map = map_or_die (filename, TRUE);
g_assert (g_mapped_file_get_length (map) == 3);
g_mapped_file_free (map);
+ g_message ("test_mapping: ok");
}
static void
@@ -162,6 +176,7 @@ test_private (void)
g_assert (strcmp (buffer, "ABC") == 0);
g_free (buffer);
+ g_message ("test_private: ok");
}
static void
@@ -171,8 +186,10 @@ test_child_private (gchar *argv0)
GMappedFile *map;
gchar *buffer;
gsize len;
- gchar *child_argv[3];
+ gchar *child_argv[4];
GPid child_pid;
+ GMainLoop *loop;
+ gchar pid[100];
#ifdef G_OS_WIN32
g_remove ("STOP");
@@ -182,9 +199,15 @@ test_child_private (gchar *argv0)
write_or_die (filename, "ABC", -1);
map = map_or_die (filename, TRUE);
+#ifndef G_OS_WIN32
+ signal (SIGUSR1, handle_usr1);
+#endif
+
+ g_snprintf (pid, sizeof(pid), "%d", getpid ());
child_argv[0] = argv0;
child_argv[1] = "mapchild";
- child_argv[2] = NULL;
+ child_argv[2] = pid;
+ child_argv[3] = NULL;
if (!g_spawn_async (dir, child_argv, NULL,
0, NULL, NULL, &child_pid, &error))
{
@@ -192,9 +215,18 @@ test_child_private (gchar *argv0)
error->message);
exit (1);
}
+ g_message ("test_child_private: child spawned");
- /* give the child some time to set up its mapping */
+#ifndef G_OS_WIN32
+ loop = g_main_loop_new (NULL, FALSE);
+ g_idle_add (check_stop, loop);
+ g_main_loop_run (loop);
+ stop = FALSE;
+#else
g_usleep (2000000);
+#endif
+
+ g_message ("test_child_private: received first child signal");
buffer = (gchar *)g_mapped_file_get_contents (map);
buffer[0] = '1';
@@ -208,8 +240,14 @@ test_child_private (gchar *argv0)
g_file_set_contents ("STOP", "Hey there\n", -1, NULL);
#endif
- /* give the child some time to write the file */
+#ifndef G_OS_WIN32
+ g_idle_add (check_stop, loop);
+ g_main_loop_run (loop);
+#else
g_usleep (2000000);
+#endif
+
+ g_message ("test_child_private: received second child signal");
if (!g_file_get_contents (childname, &buffer, &len, &error))
{
@@ -222,6 +260,8 @@ test_child_private (gchar *argv0)
g_assert (len == 3);
g_assert (strcmp (buffer, "ABC") == 0);
g_free (buffer);
+
+ g_message ("test_child_private: ok");
}
static int
@@ -244,13 +284,33 @@ int
main (int argc,
char *argv[])
{
+ int ret;
+#ifndef G_OS_WIN32
+ sigset_t sig_mask, old_mask;
+
+ sigemptyset (&sig_mask);
+ sigaddset (&sig_mask, SIGUSR1);
+ if (sigprocmask (SIG_UNBLOCK, &sig_mask, &old_mask) == 0)
+ {
+ if (sigismember (&old_mask, SIGUSR1))
+ g_message ("SIGUSR1 was blocked, unblocking it");
+ }
+#endif
+
dir = g_get_current_dir ();
filename = g_build_filename (dir, "maptest", NULL);
displayname = g_filename_display_name (filename);
childname = g_build_filename (dir, "mapchild", NULL);
if (argc > 1)
- return child_main (argc, argv);
+ ret = child_main (argc, argv);
else
- return parent_main (argc, argv);
+ ret = parent_main (argc, argv);
+
+ g_free (childname);
+ g_free (filename);
+ g_free (displayname);
+ g_free (dir);
+
+ return ret;
}