Return to BSD News archive
Newsgroups: comp.unix.bsd
Path: sserve!manuel.anu.edu.au!munnari.oz.au!spool.mu.edu!wupost!newsfeed.rice.edu!rice!news.Rice.edu!rich
From: rich@Rice.edu (& Murphey)
Subject: Re: More on pccons/XFree86 problems (keyboard hangs)
In-Reply-To: chmr@fstgds01.tu-graz.ac.at's message of Mon, 14 Dec 92 11:54:44 GMT
Message-ID: <RICH.92Dec14095633@superego.Rice.edu>
Sender: news@rice.edu (News)
Reply-To: Rich@rice.edu
Organization: Department of Electrical and Computer Engineering, Rice
University
References: <1992Dec13.172900.451@ponds.uucp> <1992Dec14.115444.12691@news.tu-graz.ac.at>
Date: Mon, 14 Dec 1992 15:56:33 GMT
Lines: 55
>>>>> In article <1992Dec14.115444.12691@news.tu-graz.ac.at>, chmr@fstgds01.tu-graz.ac.at (Christoph Robitschko) writes:
Christoph> In article <1992Dec13.172900.451@ponds.uucp> rivers@ponds.uucp (Thomas David Rivers) writes:
> Try it out yourself, inside of an X window, do a :
>
> kill -1 `cat /var/run/syslog.pid`
>
> and your keyboard will lock up.
>
>
>I will probably try and examine the stock pccons.c to determine where
>the problem can be corrected... but if someone has an idea/fix, feel
>free to beat me to it...
>
Christoph> The problem is that the pccons driver is used in two ways: first in
Christoph> the standard way through pcopen() etc., and second as a console device
Christoph> through cnopen().
Christoph> The cn???() calls simply call the corresponding pc???() routines, which
Christoph> is OK for open(), read() and write(), but not for close(), because
Christoph> the close routine is only to be called when the LAST reference to
Christoph> the device was closed. But when the last reference to the console device
Christoph> is closed (as happens when you kill or SIGHUP the syslogd), cnclose()
Christoph> calls pcclose(), no matter if there are any references to the pccons
Christoph> device (such as the keyboard input for your shell or X server).
Christoph> pcclose() then thinks there is no more reference to it and disables
Christoph> keyboard input.
Christoph> One possible solution would be to modify pcclose() to only do the real
Christoph> close operation if there are really no more files open on it (A sort of
Christoph> reference count or reference bits for each device type is needed).
Another solution might be to ignore the close while the X server is
running:
diff -cb pccons.c~ pccons.c
*** pccons.c~ Mon Dec 14 09:07:08 1992
--- pccons.c Mon Dec 14 09:07:52 1992
***************
*** 241,246 ****
--- 241,250 ----
int flag, mode;
struct proc *p;
{
+ #ifdef XSERVER
+ if (pc_xmode)
+ return (0);
+ #endif /* XSERVER */
(*linesw[pccons.t_line].l_close)(&pccons, flag);
ttyclose(&pccons);
return(0);
Christoph> I don't know if any of the replacement pccons (or codrv) drivers fix this.
codrv does fix this and should be supported in the next XFree86
release. Rich