Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sound/pcm/sound.h
| Show First 20 Lines • Show All 245 Lines • ▼ Show 20 Lines | |||||
| #define PCM_TRYLOCK(d) mtx_trylock((d)->lock) | #define PCM_TRYLOCK(d) mtx_trylock((d)->lock) | ||||
| #define PCM_LOCKASSERT(d) mtx_assert((d)->lock, MA_OWNED) | #define PCM_LOCKASSERT(d) mtx_assert((d)->lock, MA_OWNED) | ||||
| #define PCM_UNLOCKASSERT(d) mtx_assert((d)->lock, MA_NOTOWNED) | #define PCM_UNLOCKASSERT(d) mtx_assert((d)->lock, MA_NOTOWNED) | ||||
| /* | /* | ||||
| * For PCM_[WAIT | ACQUIRE | RELEASE], be sure to surround these | * For PCM_[WAIT | ACQUIRE | RELEASE], be sure to surround these | ||||
| * with PCM_LOCK/UNLOCK() sequence, or I'll come to gnaw upon you! | * with PCM_LOCK/UNLOCK() sequence, or I'll come to gnaw upon you! | ||||
| */ | */ | ||||
| #ifdef SND_DIAGNOSTIC | |||||
| #define PCM_WAIT(x) do { \ | #define PCM_WAIT(x) do { \ | ||||
| if (!PCM_LOCKOWNED(x)) \ | |||||
| 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 (!PCM_LOCKOWNED(x)) \ | |||||
| 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 (!PCM_LOCKOWNED(x)) \ | |||||
| panic("%s(%d): [PCM RELEASE] Mutex not owned!", \ | |||||
| __func__, __LINE__); \ | |||||
| if ((x)->flags & SD_F_BUSY) { \ | |||||
| (x)->flags &= ~SD_F_BUSY; \ | |||||
| 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 (PCM_LOCKOWNED(x)) \ | |||||
| 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 (PCM_LOCKOWNED(x)) \ | |||||
| 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 (PCM_LOCKOWNED(x)) \ | |||||
| 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 (PCM_LOCKOWNED(x)) \ | |||||
| 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 { \ | |||||
| PCM_LOCKASSERT(x); \ | PCM_LOCKASSERT(x); \ | ||||
| while ((x)->flags & SD_F_BUSY) \ | while ((x)->flags & SD_F_BUSY) \ | ||||
| cv_wait(&(x)->cv, (x)->lock); \ | cv_wait(&(x)->cv, (x)->lock); \ | ||||
| } while (0) | } while (0) | ||||
| #define PCM_ACQUIRE(x) do { \ | #define PCM_ACQUIRE(x) do { \ | ||||
| PCM_LOCKASSERT(x); \ | PCM_LOCKASSERT(x); \ | ||||
| KASSERT(!((x)->flags & SD_F_BUSY), \ | KASSERT(!((x)->flags & SD_F_BUSY), \ | ||||
| ▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | KASSERT(!((x)->flags & SD_F_MPSAFE) || \ | ||||
| ("%s(%d): [GIANT EXIT] MPSAFE Giant?", \ | ("%s(%d): [GIANT EXIT] MPSAFE Giant?", \ | ||||
| __func__, __LINE__)); \ | __func__, __LINE__)); \ | ||||
| if (_pcm_giant != 0) { \ | if (_pcm_giant != 0) { \ | ||||
| mtx_assert(&Giant, MA_OWNED); \ | mtx_assert(&Giant, MA_OWNED); \ | ||||
| _pcm_giant = 0; \ | _pcm_giant = 0; \ | ||||
| mtx_unlock(&Giant); \ | mtx_unlock(&Giant); \ | ||||
| } \ | } \ | ||||
| } while (0) | } while (0) | ||||
| #endif /* SND_DIAGNOSTIC */ | |||||
| #define PCM_GIANT_LEAVE(x) \ | #define PCM_GIANT_LEAVE(x) \ | ||||
| PCM_GIANT_EXIT(x); \ | PCM_GIANT_EXIT(x); \ | ||||
| } while (0) | } while (0) | ||||
| #endif /* _KERNEL */ | #endif /* _KERNEL */ | ||||
| /* make figuring out what a format is easier. got AFMT_STEREO already */ | /* make figuring out what a format is easier. got AFMT_STEREO already */ | ||||
| ▲ Show 20 Lines • Show All 67 Lines • Show Last 20 Lines | |||||