Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 24239
b: refs/heads/master
c: 5f4e8fd
h: refs/heads/master
i:
  24237: c41488b
  24235: d8e6377
  24231: 5892158
  24223: 55326a7
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Mar 27, 2006
1 parent f27623e commit 014396f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1fbbd6844e6a84e5d166ab475dc298d3b89fa4bf
refs/heads/master: 5f4e8fd08f3993bc31a7dd91767fdb4da4fe6278
55 changes: 27 additions & 28 deletions trunk/arch/um/os-Linux/sigio.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ static int write_sigio_pid = -1;
* the descriptors closed after it is killed. So, it can't see them change.
* On the UML side, they are changed under the sigio_lock.
*/
static int write_sigio_fds[2] = { -1, -1 };
static int sigio_private[2] = { -1, -1 };
#define SIGIO_FDS_INIT {-1, -1}

static int write_sigio_fds[2] = SIGIO_FDS_INIT;
static int sigio_private[2] = SIGIO_FDS_INIT;

struct pollfds {
struct pollfd *poll;
Expand Down Expand Up @@ -270,49 +272,46 @@ void write_sigio_workaround(void)
/* Did we race? Don't try to optimize this, please, it's not so likely
* to happen, and no more than once at the boot. */
if(write_sigio_pid != -1)
goto out_unlock;

write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
CLONE_FILES | CLONE_VM, &stack, 0);
goto out_free;

if (write_sigio_pid < 0)
goto out_clear;
current_poll = ((struct pollfds) { .poll = p,
.used = 1,
.size = 1 });

if (write_sigio_irq(l_write_sigio_fds[0]))
goto out_kill;
goto out_clear_poll;

/* Success, finally. */
memcpy(write_sigio_fds, l_write_sigio_fds, sizeof(l_write_sigio_fds));
memcpy(sigio_private, l_sigio_private, sizeof(l_sigio_private));

current_poll = ((struct pollfds) { .poll = p,
.used = 1,
.size = 1 });
write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
CLONE_FILES | CLONE_VM, &stack, 0);

sigio_unlock();
return;
if (write_sigio_pid < 0)
goto out_clear;

out_kill:
l_write_sigio_pid = write_sigio_pid;
write_sigio_pid = -1;
sigio_unlock();
/* Going to call waitpid, avoid holding the lock. */
os_kill_process(l_write_sigio_pid, 1);
goto out_free;
return;

out_clear:
out_clear:
write_sigio_pid = -1;
out_unlock:
sigio_unlock();
out_free:
write_sigio_fds[0] = -1;
write_sigio_fds[1] = -1;
sigio_private[0] = -1;
sigio_private[1] = -1;
out_clear_poll:
current_poll = ((struct pollfds) { .poll = NULL,
.size = 0,
.used = 0 });
out_free:
kfree(p);
out_close2:
sigio_unlock();
out_close2:
close(l_sigio_private[0]);
close(l_sigio_private[1]);
out_close1:
out_close1:
close(l_write_sigio_fds[0]);
close(l_write_sigio_fds[1]);
return;
}

void sigio_cleanup(void)
Expand Down

0 comments on commit 014396f

Please sign in to comment.