misc/89775: kevent hangs on second wait for /dev/dsp
Yuri
yuri at tsoft.com
Wed Nov 30 20:20:06 GMT 2005
>Number: 89775
>Category: misc
>Synopsis: kevent hangs on second wait for /dev/dsp
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Nov 30 20:20:03 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Yuri
>Release: 5.4 stable
>Organization:
N/A
>Environment:
FreeBSD xxx.xxx.xxx 5.4-RELEASE-p3 FreeBSD 5.4-RELEASE-p3 #0: Thu Jul 7 22:03:34 PDT 2005 xxx at xxx.xxx.xxx:/usr/src/sys/i386/compile/GENERIC i386
>Description:
If kernel queue has sound device /dev/dsp in it kevent only being triggered once.
Second call to it hangs although data is obviously continuously available from soundcard.
relevant dmesg messages describing the card are:
pcm0: <Creative EMU10K1> port 0xdc00-0xdc1f irq 17 at device 6.0 on pci0
pcm0: <TriTech TR28602 AC97 Codec>
>How-To-Repeat:
compile and run the following code:
----code------
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <sys/types.h>
#include <sys/event.h>
int
main(int argc, char *argv[]) {
int res, kq;
int dsp;
kq = kqueue();
printf("kqueue returned %i\n", kq);
char buf[1024];
dsp = open("/dev/dsp", O_RDONLY);
struct kevent kev;
EV_SET(&kev, dsp, EVFILT_READ, EV_ADD, 0/*fflags*/, 0/*data*/, NULL);
struct kevent result_events[256];
// 1
printf(">kevent1\n");
res = kevent(kq,
&kev, 1,
&result_events[0], 256,
NULL
);
printf("<kevent1 returned %i\n", res);
printf(">read returned %i\n", res);
res = read(dsp, buf, sizeof(buf));
printf("<read returned %i\n", res);
// 2
printf(">kevent2\n");
res = kevent(kq,
NULL/*&kev*/, 0,
&result_events[0], 256,
NULL
);
printf("<kevent2 returned %i\n", res);
//
close(dsp);
return (0);
}
>Fix:
N/A
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list