Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
seq_memory.h
Go to the documentation of this file.
1 /*
2  * ALSA sequencer Memory Manager
3  * Copyright (c) 1998 by Frank van de Pol <[email protected]>
4  *
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 #ifndef __SND_SEQ_MEMORYMGR_H
22 #define __SND_SEQ_MEMORYMGR_H
23 
24 #include <sound/seq_kernel.h>
25 #include <linux/poll.h>
26 
27 struct snd_info_buffer;
28 
29 /* container for sequencer event (internal use) */
32  struct snd_seq_pool *pool; /* used pool */
33  struct snd_seq_event_cell *next; /* next cell */
34 };
35 
36 /* design note: the pool is a contiguous block of memory, if we dynamicly
37  want to add additional cells to the pool be better store this in another
38  pool as we need to know the base address of the pool when releasing
39  memory. */
40 
41 struct snd_seq_pool {
42  struct snd_seq_event_cell *ptr; /* pointer to first event chunk */
43  struct snd_seq_event_cell *free; /* pointer to the head of the free list */
44 
45  int total_elements; /* pool size actually allocated */
46  atomic_t counter; /* cells free */
47 
48  int size; /* pool size to be allocated */
49  int room; /* watermark for sleep/wakeup */
50 
51  int closing;
52 
53  /* statistics */
54  int max_used;
58 
59  /* Write locking */
61 
62  /* Pool lock */
64 };
65 
66 void snd_seq_cell_free(struct snd_seq_event_cell *cell);
67 
69  struct snd_seq_event_cell **cellp, int nonblock, struct file *file);
70 
71 /* return number of unused (free) cells */
72 static inline int snd_seq_unused_cells(struct snd_seq_pool *pool)
73 {
74  return pool ? pool->total_elements - atomic_read(&pool->counter) : 0;
75 }
76 
77 /* return total number of allocated cells */
78 static inline int snd_seq_total_cells(struct snd_seq_pool *pool)
79 {
80  return pool ? pool->total_elements : 0;
81 }
82 
83 /* init pool - allocate events */
84 int snd_seq_pool_init(struct snd_seq_pool *pool);
85 
86 /* done pool - free events */
87 int snd_seq_pool_done(struct snd_seq_pool *pool);
88 
89 /* create pool */
90 struct snd_seq_pool *snd_seq_pool_new(int poolsize);
91 
92 /* remove pool */
93 int snd_seq_pool_delete(struct snd_seq_pool **pool);
94 
95 /* init memory */
97 
98 /* release event memory */
99 void snd_sequencer_memory_done(void);
100 
101 /* polling */
102 int snd_seq_pool_poll_wait(struct snd_seq_pool *pool, struct file *file, poll_table *wait);
103 
105  struct snd_seq_pool *pool, char *space);
106 
107 #endif