summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authordrochner <drochner@NetBSD.org>1998-06-16 13:31:59 +0000
committerdrochner <drochner@NetBSD.org>1998-06-16 13:31:59 +0000
commit5a3dd2249a5d43da2d26998bb07abcf123246540 (patch)
tree9d4cbd020bec97bff26476b2284835be8811d485 /sys/dev
parent26609292fdf49d131cf3d6409c7baaf0c6984ece (diff)
change initialization order to avoid a race condition if a switch is
performed at the same time
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/wscons/wsdisplay_compat_usl.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/sys/dev/wscons/wsdisplay_compat_usl.c b/sys/dev/wscons/wsdisplay_compat_usl.c
index a83e508d839..0df3c7beee3 100644
--- a/sys/dev/wscons/wsdisplay_compat_usl.c
+++ b/sys/dev/wscons/wsdisplay_compat_usl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay_compat_usl.c,v 1.2 1998/06/13 14:36:32 drochner Exp $ */
+/* $NetBSD: wsdisplay_compat_usl.c,v 1.3 1998/06/16 13:31:59 drochner Exp $ */
/*
* Copyright (c) 1998
@@ -61,7 +61,8 @@ struct usl_syncdata {
void *s_cbarg;
};
-static int usl_sync_init __P((struct wsscreen *, struct usl_syncdata **));
+static int usl_sync_init __P((struct wsscreen *, struct usl_syncdata **,
+ struct proc *, int, int, int));
static void usl_sync_done __P((struct usl_syncdata *));
static int usl_sync_check __P((struct usl_syncdata *));
static struct usl_syncdata *usl_sync_get __P((struct wsscreen *));
@@ -83,9 +84,11 @@ static const struct wscons_syncops usl_syncops = {
};
static int
-usl_sync_init(scr, sdp)
+usl_sync_init(scr, sdp, p, acqsig, relsig, frsig)
struct wsscreen *scr;
struct usl_syncdata **sdp;
+ struct proc *p;
+ int acqsig, relsig, frsig;
{
struct usl_syncdata *sd;
int res;
@@ -94,7 +97,12 @@ usl_sync_init(scr, sdp)
if (!sd)
return (ENOMEM);
sd->s_scr = scr;
+ sd->s_proc = p;
+ sd->s_pid = p->p_pid;
sd->s_flags = 0;
+ sd->s_acqsig = acqsig;
+ sd->s_relsig = relsig;
+ sd->s_frsig = frsig;
res = wsscreen_attach_sync(scr, &usl_syncops, sd);
if (res) {
free(sd, M_DEVBUF);
@@ -276,14 +284,10 @@ wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p)
case VT_SETMODE:
#define newmode ((struct vt_mode *)data)
if (newmode->mode == VT_PROCESS) {
- res = usl_sync_init(scr, &sd);
+ res = usl_sync_init(scr, &sd, p, newmode->acqsig,
+ newmode->relsig, newmode->frsig);
if (res)
return (res);
- sd->s_proc = p;
- sd->s_pid = p->p_pid;
- sd->s_relsig = newmode->relsig;
- sd->s_acqsig = newmode->acqsig;
- sd->s_frsig = newmode->frsig;
} else {
sd = usl_sync_get(scr);
if (sd)