Subject: pkg/23571: devel/pth is unable to read audio device in various packages
To: None <gnats-bugs@gnats.netbsd.org>
From: None <Michal@pr93.lublin.sdi.tpnet.pl,>
List: netbsd-bugs
Date: 11/25/2003 21:08:29
>Number:         23571
>Category:       pkg
>Synopsis:       devel/pth is unable to read audio device in various packages
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Nov 25 21:16:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Michal Pasternak
>Release:        NetBSD 1.6.1
>Organization:
Good People With Bad Reputation
>Environment:
	
	
System: NetBSD mainframe.w.lub.pl 1.6.1 NetBSD 1.6.1 (GENERIC) #0: Tue Apr 8 12:05:52 UTC 2003 autobuild@tgm.daemon.org:/autobuild/netbsd-1-6/i386/OBJ/autobuild/netbsd-1-6/src/sys/arch/i386/compile/GENERIC i386
Architecture: i386
Machine: i386
>Description:

	devel/pth is GNU Lightweight Threads package, working mainly as
	a replacement layer for POSIX thread.
	
	On NetBSD-1.6.1 at the time of writing it is unable to read
	/dev/audio . I don't know about the underlying cause, but it
	could mean it is unable to read other special files as well.
	It could also mean a bug in underlying layers (libc?)
	
	The problem results in unability to record sound in packages
	like audio/sweep, wip/portaudio, wip/py-fastaudio, lang/python23-pth,
	lang/python22-pth and propably many other packages.

>How-To-Repeat:

	1) install one of above packages
	2) try to record sound.
	
	Python's proof of concept:
	- we'll use this simple one-liner to demonstrate the bug:
	
		open("/dev/audio", "rb").read(10)
		
	- on non-pth Python (I have used 2.0.1):
	
	Python 2.0.1 (#1, Nov 25 2003, 21:42:48) 
	[...]
	>>> open("/dev/audio", "rb").read(10)     
	'\377\377\377\377\377\377\377\377\377\377'
	
		- it reads the static. Good!

	- on a Pth-enabled Python you will wait for this read _forever_

>Fix:

        Fix is _crazy_, but first let me talk for a minute.
	
	All GNU Pth programs that utilize Pthread simulation are in
	reality a "standard", single-thread, event-driven applications.
	GNU Pth uses re-defined blocking functions, as you can easy
	check by running:
	
		grep pthread_read /usr/pkg/include/pthread.h
		
	Substituted read function (in reality, pthread_read) is declared
	in pth_high.c .
	
	I have debugged this and found out, that all programs stop
	at pth_high.c:788 , in pth_wait. 

	This stop is either caused by bad event mask set in pth_high.c:785
	(and no, adding PTH_EVENT_FD_EXCEPTION didn't help at all), or - 
	pth_event has some bugs, which occur while using /dev/audio .
	
	The thing, that helps is... adding PTH_UNTIL_FD_WRITEABLE in
	pth_high.c at line 785 .
	
	And, guess what? Sweep allows me to record my freestyle raps, I can
	finally write my Python VoIP software with py-fastaudio, everyone
	is happy.
	
	Send patch, you say.

	Someone with bigger knowledge than mine could write up a patch 
	for this . First, you need to check if it's only /dev/audio, or
	does it hit other devices as well . Second, we need to create
	a patch, that will apply only to devices, which are handled
	in a broken (blocking) way by Pth. And no, testing by fstat(2)
	in pth_high.c if the fd is a device won't give you proper results
	(it seems it can read other "devices" without blocking)
>Release-Note:
>Audit-Trail:
>Unformatted: