Deleted Added
full compact
27c27
< * $FreeBSD: head/sys/dev/sound/pcm/sound.h 170161 2007-05-31 18:43:33Z ariff $
---
> * $FreeBSD: head/sys/dev/sound/pcm/sound.h 170815 2007-06-16 03:37:28Z ariff $
140a141,144
> #define SD_F_BUSY 0x00000080
> #define SD_F_MPSAFE 0x00000100
> #define SD_F_REGISTERED 0x00000200
>
146a151,155
> #define PCM_ALIVE(x) ((x) != NULL && (x)->lock != NULL && \
> !((x)->flags & SD_F_DYING))
> #define PCM_REGISTERED(x) (PCM_ALIVE(x) && \
> ((x)->flags & SD_F_REGISTERED))
>
466a476,482
> #define SND_DEV_DSPHW_CD 15 /* s16le/stereo 44100Hz CD */
>
> #define SND_DEV_DSP_MMAP 16 /* OSSv4 compatible /dev/dsp_mmap */
>
> #define SND_DEV_LAST SND_DEV_DSP_MMAP
> #define SND_DEV_MAX PCMMAXDEV
>
567a584
> TAILQ_HEAD(dsp_cdevinfo_linkhead, dsp_cdevinfo) dsp_cdevinfo_pool;
582a600
> struct cv cv;
594a613,802
> /*
> * For PCM_CV_[WAIT | ACQUIRE | RELEASE], be sure to surround these
> * with pcm_lock/unlock() sequence, or I'll come to gnaw upon you!
> */
> #ifdef SND_DIAGNOSTIC
> #define PCM_WAIT(x) do { \
> if (mtx_owned((x)->lock) == 0) \
> panic("%s(%d): [PCM WAIT] Mutex not owned!", \
> __func__, __LINE__); \
> while ((x)->flags & SD_F_BUSY) { \
> if (snd_verbose > 3) \
> device_printf((x)->dev, \
> "%s(%d): [PCM WAIT] calling cv_wait().\n", \
> __func__, __LINE__); \
> cv_wait(&(x)->cv, (x)->lock); \
> } \
> } while(0)
>
> #define PCM_ACQUIRE(x) do { \
> if (mtx_owned((x)->lock) == 0) \
> panic("%s(%d): [PCM ACQUIRE] Mutex not owned!", \
> __func__, __LINE__); \
> if ((x)->flags & SD_F_BUSY) \
> panic("%s(%d): [PCM ACQUIRE] " \
> "Trying to acquire BUSY cv!", __func__, __LINE__); \
> (x)->flags |= SD_F_BUSY; \
> } while(0)
>
> #define PCM_RELEASE(x) do { \
> if (mtx_owned((x)->lock) == 0) \
> panic("%s(%d): [PCM RELEASE] Mutex not owned!", \
> __func__, __LINE__); \
> if ((x)->flags & SD_F_BUSY) { \
> (x)->flags &= ~SD_F_BUSY; \
> if ((x)->cv.cv_waiters != 0) { \
> if ((x)->cv.cv_waiters > 1 && snd_verbose > 3) \
> device_printf((x)->dev, \
> "%s(%d): [PCM RELEASE] " \
> "cv_waiters=%d > 1!\n", \
> __func__, __LINE__, \
> (x)->cv.cv_waiters); \
> cv_broadcast(&(x)->cv); \
> } \
> } else \
> panic("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!", \
> __func__, __LINE__); \
> } while(0)
>
> /* Quick version, for shorter path. */
> #define PCM_ACQUIRE_QUICK(x) do { \
> if (mtx_owned((x)->lock) != 0) \
> panic("%s(%d): [PCM ACQUIRE QUICK] Mutex owned!", \
> __func__, __LINE__); \
> pcm_lock(x); \
> PCM_WAIT(x); \
> PCM_ACQUIRE(x); \
> pcm_unlock(x); \
> } while(0)
>
> #define PCM_RELEASE_QUICK(x) do { \
> if (mtx_owned((x)->lock) != 0) \
> panic("%s(%d): [PCM RELEASE QUICK] Mutex owned!", \
> __func__, __LINE__); \
> pcm_lock(x); \
> PCM_RELEASE(x); \
> pcm_unlock(x); \
> } while(0)
>
> #define PCM_BUSYASSERT(x) do { \
> if (!((x) != NULL && ((x)->flags & SD_F_BUSY))) \
> panic("%s(%d): [PCM BUSYASSERT] " \
> "Failed, snddev_info=%p", __func__, __LINE__, x); \
> } while(0)
>
> #define PCM_GIANT_ENTER(x) do { \
> int _pcm_giant = 0; \
> if (mtx_owned((x)->lock) != 0) \
> panic("%s(%d): [GIANT ENTER] PCM lock owned!", \
> __func__, __LINE__); \
> if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \
> device_printf((x)->dev, \
> "%s(%d): [GIANT ENTER] Giant owned!\n", \
> __func__, __LINE__); \
> if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0) \
> do { \
> mtx_lock(&Giant); \
> _pcm_giant = 1; \
> } while(0)
>
> #define PCM_GIANT_EXIT(x) do { \
> if (mtx_owned((x)->lock) != 0) \
> panic("%s(%d): [GIANT EXIT] PCM lock owned!", \
> __func__, __LINE__); \
> if (!(_pcm_giant == 0 || _pcm_giant == 1)) \
> panic("%s(%d): [GIANT EXIT] _pcm_giant screwed!", \
> __func__, __LINE__); \
> if ((x)->flags & SD_F_MPSAFE) { \
> if (_pcm_giant == 1) \
> panic("%s(%d): [GIANT EXIT] MPSAFE Giant?", \
> __func__, __LINE__); \
> if (mtx_owned(&Giant) != 0 && snd_verbose > 3) \
> device_printf((x)->dev, \
> "%s(%d): [GIANT EXIT] Giant owned!\n", \
> __func__, __LINE__); \
> } \
> if (_pcm_giant != 0) { \
> if (mtx_owned(&Giant) == 0) \
> panic("%s(%d): [GIANT EXIT] Giant not owned!", \
> __func__, __LINE__); \
> _pcm_giant = 0; \
> mtx_unlock(&Giant); \
> } \
> } while(0)
> #else /* SND_DIAGNOSTIC */
> #define PCM_WAIT(x) do { \
> mtx_assert((x)->lock, MA_OWNED); \
> while ((x)->flags & SD_F_BUSY) \
> cv_wait(&(x)->cv, (x)->lock); \
> } while(0)
>
> #define PCM_ACQUIRE(x) do { \
> mtx_assert((x)->lock, MA_OWNED); \
> KASSERT(!((x)->flags & SD_F_BUSY), \
> ("%s(%d): [PCM ACQUIRE] Trying to acquire BUSY cv!", \
> __func__, __LINE__)); \
> (x)->flags |= SD_F_BUSY; \
> } while(0)
>
> #define PCM_RELEASE(x) do { \
> mtx_assert((x)->lock, MA_OWNED); \
> KASSERT((x)->flags & SD_F_BUSY, \
> ("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!", \
> __func__, __LINE__)); \
> (x)->flags &= ~SD_F_BUSY; \
> if ((x)->cv.cv_waiters != 0) \
> cv_broadcast(&(x)->cv); \
> } while(0)
>
> /* Quick version, for shorter path. */
> #define PCM_ACQUIRE_QUICK(x) do { \
> mtx_assert((x)->lock, MA_NOTOWNED); \
> pcm_lock(x); \
> PCM_WAIT(x); \
> PCM_ACQUIRE(x); \
> pcm_unlock(x); \
> } while(0)
>
> #define PCM_RELEASE_QUICK(x) do { \
> mtx_assert((x)->lock, MA_NOTOWNED); \
> pcm_lock(x); \
> PCM_RELEASE(x); \
> pcm_unlock(x); \
> } while(0)
>
> #define PCM_BUSYASSERT(x) KASSERT(x != NULL && \
> ((x)->flags & SD_F_BUSY), \
> ("%s(%d): [PCM BUSYASSERT] " \
> "Failed, snddev_info=%p", \
> __func__, __LINE__, x))
>
> #define PCM_GIANT_ENTER(x) do { \
> int _pcm_giant = 0; \
> mtx_assert((x)->lock, MA_NOTOWNED); \
> if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0) \
> do { \
> mtx_lock(&Giant); \
> _pcm_giant = 1; \
> } while(0)
>
> #define PCM_GIANT_EXIT(x) do { \
> mtx_assert((x)->lock, MA_NOTOWNED); \
> KASSERT(_pcm_giant == 0 || _pcm_giant == 1, \
> ("%s(%d): [GIANT EXIT] _pcm_giant screwed!", \
> __func__, __LINE__)); \
> KASSERT(!((x)->flags & SD_F_MPSAFE) || \
> (((x)->flags & SD_F_MPSAFE) && _pcm_giant == 0), \
> ("%s(%d): [GIANT EXIT] MPSAFE Giant?", \
> __func__, __LINE__)); \
> if (_pcm_giant != 0) { \
> mtx_assert(&Giant, MA_OWNED); \
> _pcm_giant = 0; \
> mtx_unlock(&Giant); \
> } \
> } while(0)
> #endif /* !SND_DIAGNOSTIC */
>
> #define PCM_GIANT_LEAVE(x) \
> PCM_GIANT_EXIT(x); \
> } while(0)
>