mirror of
https://github.com/freebsd/freebsd-src
synced 2024-11-05 18:22:52 +00:00
Update select -> poll.
I am not particularly happy with this stuff, I have no way to test it.
This commit is contained in:
parent
f8f6cbba92
commit
ea8ef05f7e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=29367
7 changed files with 94 additions and 158 deletions
|
@ -491,43 +491,37 @@ audio_init (long mem_start)
|
|||
|
||||
#ifdef ALLOW_SELECT
|
||||
int
|
||||
audio_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
|
||||
audio_poll (int dev, struct fileinfo *file, int events, select_table * wait)
|
||||
{
|
||||
int l;
|
||||
char *dmabuf;
|
||||
int revents = 0;
|
||||
|
||||
dev = dev >> 4;
|
||||
|
||||
switch (sel_type)
|
||||
{
|
||||
case SEL_IN:
|
||||
if (audio_mode[dev] != AM_READ && /* Wrong direction */
|
||||
audio_mode[dev] != AM_NONE)
|
||||
return 0;
|
||||
if (events & (POLLIN | POLLRDNORM)) {
|
||||
if (audio_mode[dev] == AM_READ || /* Right direction */
|
||||
audio_mode[dev] == AM_NONE)
|
||||
|
||||
if (DMAbuf_getrdbuffer (dev, &dmabuf, &l,
|
||||
1 /* Don't block */ ) >= 0)
|
||||
return 1; /* We have data */
|
||||
if (DMAbuf_getrdbuffer (dev, &dmabuf, &l, 1 /* Don't block */ ) >= 0)
|
||||
revents |= events & (POLLIN | POLLRDNORM); /* We have data */
|
||||
else
|
||||
revents |= DMAbuf_poll (dev, file, events, wait);
|
||||
|
||||
return DMAbuf_select (dev, file, sel_type, wait);
|
||||
break;
|
||||
}
|
||||
|
||||
case SEL_OUT:
|
||||
if (audio_mode[dev] != AM_WRITE && /* Wrong direction */
|
||||
audio_mode[dev] != AM_NONE)
|
||||
return 0;
|
||||
if (events & (POLLOUT | POLLWRNORM)) {
|
||||
if (audio_mode[dev] == AM_WRITE || /* Right direction */
|
||||
audio_mode[dev] == AM_NONE)
|
||||
|
||||
if (wr_buff_no[dev] != -1)
|
||||
return 1; /* There is space in the current buffer */
|
||||
revents |= events & (POLLOUT | POLLWRNORM); /* There is space in the current buffer */
|
||||
else
|
||||
revents |= DMAbuf_poll (dev, file, events, wait);
|
||||
|
||||
return DMAbuf_select (dev, file, sel_type, wait);
|
||||
break;
|
||||
}
|
||||
|
||||
case SEL_EX:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return (revents);
|
||||
}
|
||||
|
||||
#endif /* ALLOW_SELECT */
|
||||
|
|
|
@ -1000,61 +1000,43 @@ DMAbuf_reset_dma (int dev)
|
|||
|
||||
#ifdef ALLOW_SELECT
|
||||
int
|
||||
DMAbuf_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
|
||||
DMAbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait)
|
||||
{
|
||||
struct dma_buffparms *dmap = audio_devs[dev]->dmap;
|
||||
unsigned long flags;
|
||||
int revents = 0;
|
||||
|
||||
switch (sel_type)
|
||||
{
|
||||
case SEL_IN:
|
||||
if (dmap->dma_mode != DMODE_INPUT)
|
||||
return 0;
|
||||
if (events & (POLLIN | POLLRDNORM))
|
||||
if (dmap->dma_mode == DMODE_INPUT) {
|
||||
|
||||
DISABLE_INTR (flags);
|
||||
|
||||
if (!dmap->qlen)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
dev_sleep_flag[dev].mode = WK_SLEEP;
|
||||
select_wait (&dev_sleeper[dev], wait);
|
||||
#endif
|
||||
RESTORE_INTR (flags);
|
||||
return 0;
|
||||
}
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else
|
||||
revents |= events & (POLLIN | POLLRDNORM);
|
||||
|
||||
RESTORE_INTR (flags);
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case SEL_OUT:
|
||||
if (dmap->dma_mode == DMODE_INPUT)
|
||||
return 0;
|
||||
|
||||
if (dmap->dma_mode == DMODE_NONE)
|
||||
return 1;
|
||||
|
||||
DISABLE_INTR (flags);
|
||||
if (!space_in_queue (dev))
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
dev_sleep_flag[dev].mode = WK_SLEEP;
|
||||
select_wait (&dev_sleeper[dev], wait);
|
||||
#endif
|
||||
RESTORE_INTR (flags);
|
||||
return 0;
|
||||
}
|
||||
RESTORE_INTR (flags);
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case SEL_EX:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (events & (POLLOUT | POLLWRNORM))
|
||||
if (dmap->dma_mode != DMODE_INPUT) {
|
||||
|
||||
if (dmap->dma_mode == DMODE_NONE)
|
||||
revents |= events & (POLLOUT | POLLWRNORM);
|
||||
else {
|
||||
DISABLE_INTR (flags);
|
||||
|
||||
if (!space_in_queue (dev))
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else
|
||||
revents |= events & (POLLOUT | POLLWRNORM);
|
||||
|
||||
RESTORE_INTR (flags);
|
||||
}
|
||||
}
|
||||
|
||||
return (revents);
|
||||
}
|
||||
|
||||
#endif /* ALLOW_SELECT */
|
||||
|
|
|
@ -418,45 +418,25 @@ MIDIbuf_ioctl (int dev, struct fileinfo *file,
|
|||
|
||||
#ifdef ALLOW_SELECT
|
||||
int
|
||||
MIDIbuf_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
|
||||
MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait)
|
||||
{
|
||||
int revents = 0;
|
||||
|
||||
dev = dev >> 4;
|
||||
|
||||
switch (sel_type)
|
||||
{
|
||||
case SEL_IN:
|
||||
if (!DATA_AVAIL (midi_in_buf[dev]))
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
input_sleep_flag[dev].mode = WK_SLEEP;
|
||||
select_wait (&input_sleeper[dev], wait);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
break;
|
||||
if (events & (POLLIN | POLLRDNORM))
|
||||
if (!DATA_AVAIL (midi_in_buf[dev]))
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else
|
||||
revents |= events & (POLLIN | POLLRDNORM);
|
||||
|
||||
case SEL_OUT:
|
||||
if (SPACE_AVAIL (midi_out_buf[dev]))
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
midi_sleep_flag[dev].mode = WK_SLEEP;
|
||||
select_wait (&midi_sleeper[dev], wait);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
break;
|
||||
if (events & (POLLOUT | POLLWRNORM))
|
||||
if (SPACE_AVAIL (midi_out_buf[dev]))
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else
|
||||
revents |= events & (POLLOUT | POLLWRNORM);
|
||||
|
||||
case SEL_EX:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return revents;
|
||||
}
|
||||
|
||||
#endif /* ALLOW_SELECT */
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <sys/filio.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/signalvar.h>
|
||||
|
|
|
@ -1770,55 +1770,34 @@ sequencer_ioctl (int dev, struct fileinfo *file,
|
|||
|
||||
#ifdef ALLOW_SELECT
|
||||
int
|
||||
sequencer_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
|
||||
sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait)
|
||||
{
|
||||
unsigned long flags;
|
||||
int revents = 0;
|
||||
|
||||
dev = dev >> 4;
|
||||
|
||||
switch (sel_type)
|
||||
{
|
||||
case SEL_IN:
|
||||
DISABLE_INTR (flags);
|
||||
if (!iqlen)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
midi_sleep_flag.mode = WK_SLEEP;
|
||||
select_wait (&midi_sleeper, wait);
|
||||
#endif
|
||||
RESTORE_INTR (flags);
|
||||
return 0;
|
||||
}
|
||||
DISABLE_INTR (flags);
|
||||
|
||||
if (events & (POLLIN | POLLRDNORM))
|
||||
if (!iqlen)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else {
|
||||
revents |= events & (POLLIN | POLLRDNORM);
|
||||
midi_sleep_flag.mode &= ~WK_SLEEP;
|
||||
RESTORE_INTR (flags);
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case SEL_OUT:
|
||||
DISABLE_INTR (flags);
|
||||
if (qlen >= SEQ_MAX_QUEUE)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
#else
|
||||
seq_sleep_flag.mode = WK_SLEEP;
|
||||
select_wait (&seq_sleeper, wait);
|
||||
#endif
|
||||
RESTORE_INTR (flags);
|
||||
return 0;
|
||||
}
|
||||
seq_sleep_flag.mode &= ~WK_SLEEP;
|
||||
RESTORE_INTR (flags);
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case SEL_EX:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (events & (POLLOUT | POLLWRNORM))
|
||||
if (qlen >= SEQ_MAX_QUEUE)
|
||||
selrecord(wait, &selinfo[dev]);
|
||||
else {
|
||||
revents |= events & (POLLOUT | POLLWRNORM);
|
||||
seq_sleep_flag.mode &= ~WK_SLEEP;
|
||||
}
|
||||
|
||||
RESTORE_INTR (flags);
|
||||
|
||||
return (revents);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1976,9 +1955,9 @@ sequencer_init (long mem_start)
|
|||
|
||||
#ifdef ALLOW_SELECT
|
||||
int
|
||||
sequencer_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
|
||||
sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait)
|
||||
{
|
||||
return RET_ERROR (EIO);
|
||||
return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLHUP);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -17,7 +17,7 @@ void DMAbuf_reset_dma (int dev);
|
|||
void DMAbuf_inputintr(int dev);
|
||||
void DMAbuf_outputintr(int dev, int underflow_flag);
|
||||
#ifdef ALLOW_SELECT
|
||||
int DMAbuf_select(int dev, struct fileinfo *file, int sel_type, select_table * wait);
|
||||
int DMAbuf_poll(int dev, struct fileinfo *file, int events, select_table * wait);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -34,7 +34,7 @@ int audio_lseek (int dev, struct fileinfo *file, off_t offset, int orig);
|
|||
long audio_init (long mem_start);
|
||||
|
||||
#ifdef ALLOW_SELECT
|
||||
int audio_select(int dev, struct fileinfo *file, int sel_type, select_table * wait);
|
||||
int audio_poll(int dev, struct fileinfo *file, int events, select_table * wait);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -56,7 +56,7 @@ void seq_input_event(unsigned char *event, int len);
|
|||
void seq_copy_to_input (unsigned char *event, int len);
|
||||
|
||||
#ifdef ALLOW_SELECT
|
||||
int sequencer_select(int dev, struct fileinfo *file, int sel_type, select_table * wait);
|
||||
int sequencer_poll(int dev, struct fileinfo *file, int events, select_table * wait);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -74,7 +74,7 @@ void MIDIbuf_bytes_received(int dev, unsigned char *buf, int count);
|
|||
long MIDIbuf_init(long mem_start);
|
||||
|
||||
#ifdef ALLOW_SELECT
|
||||
int MIDIbuf_select(int dev, struct fileinfo *file, int sel_type, select_table * wait);
|
||||
int MIDIbuf_poll(int dev, struct fileinfo *file, int events, select_table * wait);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: soundcard.c,v 1.51 1997/06/08 12:55:26 ache Exp $
|
||||
* $Id: soundcard.c,v 1.52 1997/07/20 11:58:40 bde Exp $
|
||||
*/
|
||||
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
|
@ -69,13 +69,13 @@ static d_close_t sndclose;
|
|||
static d_read_t sndread;
|
||||
static d_write_t sndwrite;
|
||||
static d_ioctl_t sndioctl;
|
||||
static d_select_t sndselect;
|
||||
static d_poll_t sndpoll;
|
||||
|
||||
#define CDEV_MAJOR 30
|
||||
static struct cdevsw snd_cdevsw =
|
||||
{ sndopen, sndclose, sndread, sndwrite, /*30*/
|
||||
sndioctl, nostop, nullreset, nodevtotty,/* sound */
|
||||
sndselect, nommap, NULL, "snd", NULL, -1 };
|
||||
sndpoll, nommap, NULL, "snd", NULL, -1 };
|
||||
|
||||
struct isa_driver opldriver = {sndprobe, sndattach, "opl"};
|
||||
struct isa_driver sbdriver = {sndprobe, sndattach, "sb"};
|
||||
|
@ -197,24 +197,24 @@ sndioctl (dev_t dev, int cmd, caddr_t arg, int flags, struct proc *p)
|
|||
}
|
||||
|
||||
static int
|
||||
sndselect (dev_t dev, int rw, struct proc *p)
|
||||
sndpoll (dev_t dev, int events, struct proc *p)
|
||||
{
|
||||
dev = minor (dev);
|
||||
|
||||
DEB (printk ("snd_select(dev=%d, rw=%d, pid=%d)\n", dev, rw, p->p_pid));
|
||||
DEB (printk ("snd_poll(dev=%d, rw=%d, pid=%d)\n", dev, rw, p->p_pid));
|
||||
#ifdef ALLOW_SELECT
|
||||
switch (dev & 0x0f)
|
||||
{
|
||||
#ifndef EXCLUDE_SEQUENCER
|
||||
case SND_DEV_SEQ:
|
||||
case SND_DEV_SEQ2:
|
||||
return sequencer_select (dev, &files[dev], rw, p);
|
||||
return sequencer_poll (dev, &files[dev], events, p);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifndef EXCLUDE_MIDI
|
||||
case SND_DEV_MIDIN:
|
||||
return MIDIbuf_select (dev, &files[dev], rw, p);
|
||||
return MIDIbuf_poll (dev, &files[dev], events, p);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
@ -222,7 +222,7 @@ sndselect (dev_t dev, int rw, struct proc *p)
|
|||
case SND_DEV_DSP:
|
||||
case SND_DEV_DSP16:
|
||||
case SND_DEV_AUDIO:
|
||||
return audio_select (dev, &files[dev], rw, p);
|
||||
return audio_poll (dev, &files[dev], events, p);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue