2 * Copyright (c) 2007 Ariff Abdullah <ariff@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: head/sys/dev/sound/clone.h 170719 2007-06-14 11:10:21Z ariff $
32 struct snd_clone_entry
;
36 * 750 milisecond default deadline. Short enough to not cause excessive
37 * garbage collection, long enough to indicate stalled VFS.
39 #define SND_CLONE_DEADLINE_DEFAULT 750
42 * Fit within 24bit MAXMINOR. In DragonFly the minor mask
43 * is 0xffff00ff so set this to something that won't mess up.
44 * (the assertions should just be removed, frankly).
46 #define SND_CLONE_MAXUNIT 0xffffffff
49 * Creation flags, mostly related to the behaviour of garbage collector.
51 * SND_CLONE_ENABLE - Enable clone allocation.
52 * SND_CLONE_GC_ENABLE - Enable garbage collector operation, automatically
53 * or if explicitly called upon.
54 * SND_CLONE_GC_UNREF - Garbage collect during unref operation.
55 * SND_CLONE_GC_LASTREF - Garbage collect during last reference
57 * SND_CLONE_GC_EXPIRED - Don't garbage collect unless the global clone
58 * handler has been expired.
59 * SND_CLONE_GC_REVOKE - Revoke clone invocation status which has been
60 * expired instead of removing and freeing it.
61 * SND_CLONE_WAITOK - malloc() is allowed to sleep while allocating
64 #define SND_CLONE_ENABLE 0x00000001
65 #define SND_CLONE_GC_ENABLE 0x00000002
66 #define SND_CLONE_GC_UNREF 0x00000004
67 #define SND_CLONE_GC_LASTREF 0x00000008
68 #define SND_CLONE_GC_EXPIRED 0x00000010
69 #define SND_CLONE_GC_REVOKE 0x00000020
70 #define SND_CLONE_WAITOK 0x80000000
72 #define SND_CLONE_GC_MASK (SND_CLONE_GC_ENABLE | \
73 SND_CLONE_GC_UNREF | \
74 SND_CLONE_GC_LASTREF | \
75 SND_CLONE_GC_EXPIRED | \
78 #define SND_CLONE_MASK (SND_CLONE_ENABLE | SND_CLONE_GC_MASK | \
82 * Runtime clone device flags
84 * These are mostly private to the clone manager operation:
86 * SND_CLONE_NEW - New clone allocation in progress.
87 * SND_CLONE_INVOKE - Cloning being invoked, waiting for next VFS operation.
88 * SND_CLONE_BUSY - In progress, being referenced by living thread/proc.
90 #define SND_CLONE_NEW 0x00000001
91 #define SND_CLONE_INVOKE 0x00000002
92 #define SND_CLONE_BUSY 0x00000004
95 * Nothing important, just for convenience.
97 #define SND_CLONE_ALLOC (SND_CLONE_NEW | SND_CLONE_INVOKE | \
100 #define SND_CLONE_DEVMASK SND_CLONE_ALLOC
103 void snd_timestamp(struct timespec
*);
105 struct snd_clone
*snd_clone_create(int, int, int, uint32_t);
106 int snd_clone_busy(struct snd_clone
*);
107 int snd_clone_enable(struct snd_clone
*);
108 int snd_clone_disable(struct snd_clone
*);
109 int snd_clone_getsize(struct snd_clone
*);
110 int snd_clone_getmaxunit(struct snd_clone
*);
111 int snd_clone_setmaxunit(struct snd_clone
*, int);
112 int snd_clone_getdeadline(struct snd_clone
*);
113 int snd_clone_setdeadline(struct snd_clone
*, int);
114 int snd_clone_gettime(struct snd_clone
*, struct timespec
*);
115 uint32_t snd_clone_getflags(struct snd_clone
*);
116 uint32_t snd_clone_setflags(struct snd_clone
*, uint32_t);
117 int snd_clone_getdevtime(struct cdev
*, struct timespec
*);
118 uint32_t snd_clone_getdevflags(struct cdev
*);
119 uint32_t snd_clone_setdevflags(struct cdev
*, uint32_t);
120 int snd_clone_gc(struct snd_clone
*);
121 void snd_clone_destroy(struct snd_clone
*);
122 int snd_clone_acquire(struct cdev
*);
123 int snd_clone_release(struct cdev
*);
124 int snd_clone_ref(struct cdev
*);
125 int snd_clone_unref(struct cdev
*);
126 void snd_clone_register(struct snd_clone_entry
*, struct cdev
*);
127 struct snd_clone_entry
*snd_clone_alloc(struct snd_clone
*, struct cdev
**,
130 #define snd_clone_enabled(x) ((x) != NULL && \
131 (snd_clone_getflags(x) & SND_CLONE_ENABLE))
132 #define snd_clone_disabled(x) (!snd_clone_enabled(x))
134 #endif /* !_SND_CLONE_H */