Unverified Commit 96bff973 authored by Victor Ananjevsky's avatar Victor Ananjevsky Committed by GitHub

Merge pull request #31 from step-/fix-two-race-conditions

Fix two race conditions (notebook and paned)
parents d6db65e4 f85496bd
......@@ -39,7 +39,6 @@ static GtkWidget *dialog = NULL;
static gint ret = YAD_RESPONSE_ESC;
YadNTabs *tabs;
gint t_sem;
#ifndef G_OS_WIN32
static void
......@@ -676,6 +675,10 @@ create_plug (void)
usleep (1000);
tabs = get_tabs (options.plug, FALSE);
}
while (!tabs[0].xid)
{
usleep (1000);
}
win = gtk_plug_new (0);
/* set window borders */
......@@ -690,10 +693,9 @@ create_plug (void)
gtk_widget_show_all (win);
/* add plug data */
/* notebook/paned will count non-zero xids */
tabs[options.tabnum].pid = getpid ();
tabs[options.tabnum].xid = gtk_plug_get_id (GTK_PLUG (win));
/* FIXME: may be a race here */
tabs[0].xid++;
shmdt (tabs);
}
......
......@@ -77,12 +77,24 @@ void
notebook_swallow_childs (void)
{
guint i, n_tabs;
gboolean all_registered;
n_tabs = g_slist_length (options.notebook_data.tabs);
/* wait until all children are register */
while (tabs[0].xid != n_tabs)
usleep (1000);
/* wait until all children are registered */
do
{
all_registered = TRUE;
for (i = 1; i <= n_tabs; i++)
if (!tabs[i].xid)
{
all_registered = FALSE;
break;
}
if (!all_registered)
usleep (1000);
}
while (!all_registered);
for (i = 1; i <= n_tabs; i++)
{
......@@ -117,7 +129,7 @@ notebook_close_childs (void)
{
guint i, n_tabs;
struct shmid_ds buf;
gboolean is_running = TRUE;
gboolean is_running;
n_tabs = g_slist_length (options.notebook_data.tabs);
for (i = 1; i <= n_tabs; i++)
......@@ -127,7 +139,7 @@ notebook_close_childs (void)
}
/* wait for stop subprocesses */
while (is_running)
do
{
is_running = FALSE;
for (i = 1; i <= n_tabs; i++)
......@@ -138,8 +150,10 @@ notebook_close_childs (void)
break;
}
}
usleep (1000);
if (is_running)
usleep (1000);
}
while (is_running);
/* cleanup shared memory */
shmctl (tabs[0].pid, IPC_RMID, &buf);
......
......@@ -77,8 +77,8 @@ paned_swallow_childs (void)
s1 = GTK_WIDGET (g_object_get_data (G_OBJECT (paned), "s1"));
s2 = GTK_WIDGET (g_object_get_data (G_OBJECT (paned), "s2"));
/* wait until all children are register */
while (tabs[0].xid != 2)
/* wait until all children are registered */
while (!tabs[1].xid || !tabs[2].xid)
usleep (1000);
if (tabs[1].pid != -1)
......
......@@ -370,6 +370,8 @@ get_tabs (key_t key, gboolean create)
t[i].xid = 0;
}
t[0].pid = shmid;
/* lastly, allow plugs to write shmem */
t[0].xid = 1;
}
return t;
......
......@@ -559,9 +559,8 @@ typedef struct {
/* pointer to shared memory for tabbed dialog */
/* 0 item used for special info: */
/* pid - memory id */
/* xid - count of registered tabs (for sync) */
/* xid - allow plugs to write shmem (for sync) */
extern YadNTabs *tabs;
extern gint t_sem;
void yad_options_init (void);
GOptionContext *yad_create_context (void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment