Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c1935b4d
Commit
c1935b4d
authored
Apr 04, 2005
by
Jaroslav Kysela
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ALSA] timer - added tread semaphore
Timer Midlevel Signed-off-by:
Jaroslav Kysela
<
perex@suse.cz
>
parent
54ab87e6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
37 additions
and
20 deletions
+37
-20
sound/core/timer.c
sound/core/timer.c
+37
-20
No files found.
sound/core/timer.c
View file @
c1935b4d
...
...
@@ -69,6 +69,7 @@ typedef struct {
struct
timespec
tstamp
;
/* trigger tstamp */
wait_queue_head_t
qchange_sleep
;
struct
fasync_struct
*
fasync
;
struct
semaphore
tread_sem
;
}
snd_timer_user_t
;
/* list of timers */
...
...
@@ -1208,6 +1209,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file)
return
-
ENOMEM
;
spin_lock_init
(
&
tu
->
qlock
);
init_waitqueue_head
(
&
tu
->
qchange_sleep
);
init_MUTEX
(
&
tu
->
tread_sem
);
tu
->
ticks
=
1
;
tu
->
queue_size
=
128
;
tu
->
queue
=
(
snd_timer_read_t
*
)
kmalloc
(
tu
->
queue_size
*
sizeof
(
snd_timer_read_t
),
GFP_KERNEL
);
...
...
@@ -1454,18 +1456,23 @@ static int snd_timer_user_tselect(struct file *file, snd_timer_select_t __user *
snd_timer_user_t
*
tu
;
snd_timer_select_t
tselect
;
char
str
[
32
];
int
err
;
int
err
=
0
;
tu
=
file
->
private_data
;
if
(
tu
->
timeri
)
down
(
&
tu
->
tread_sem
);
if
(
tu
->
timeri
)
{
snd_timer_close
(
tu
->
timeri
);
if
(
copy_from_user
(
&
tselect
,
_tselect
,
sizeof
(
tselect
)))
return
-
EFAULT
;
tu
->
timeri
=
NULL
;
}
if
(
copy_from_user
(
&
tselect
,
_tselect
,
sizeof
(
tselect
)))
{
err
=
-
EFAULT
;
goto
__err
;
}
sprintf
(
str
,
"application %i"
,
current
->
pid
);
if
(
tselect
.
id
.
dev_class
!=
SNDRV_TIMER_CLASS_SLAVE
)
tselect
.
id
.
dev_sclass
=
SNDRV_TIMER_SCLASS_APPLICATION
;
if
((
err
=
snd_timer_open
(
&
tu
->
timeri
,
str
,
&
tselect
.
id
,
current
->
pid
))
<
0
)
return
err
;
goto
__
err
;
if
(
tu
->
queue
)
{
kfree
(
tu
->
queue
);
...
...
@@ -1477,23 +1484,27 @@ static int snd_timer_user_tselect(struct file *file, snd_timer_select_t __user *
}
if
(
tu
->
tread
)
{
tu
->
tqueue
=
(
snd_timer_tread_t
*
)
kmalloc
(
tu
->
queue_size
*
sizeof
(
snd_timer_tread_t
),
GFP_KERNEL
);
if
(
tu
->
tqueue
==
NULL
)
{
snd_timer_close
(
tu
->
timeri
);
return
-
ENOMEM
;
}
if
(
tu
->
tqueue
==
NULL
)
err
=
-
ENOMEM
;
}
else
{
tu
->
queue
=
(
snd_timer_read_t
*
)
kmalloc
(
tu
->
queue_size
*
sizeof
(
snd_timer_read_t
),
GFP_KERNEL
);
if
(
tu
->
queue
==
NULL
)
{
snd_timer_close
(
tu
->
timeri
);
return
-
ENOMEM
;
}
if
(
tu
->
queue
==
NULL
)
err
=
-
ENOMEM
;
}
tu
->
timeri
->
flags
|=
SNDRV_TIMER_IFLG_FAST
;
tu
->
timeri
->
callback
=
tu
->
tread
?
snd_timer_user_tinterrupt
:
snd_timer_user_interrupt
;
tu
->
timeri
->
ccallback
=
snd_timer_user_ccallback
;
tu
->
timeri
->
callback_data
=
(
void
*
)
tu
;
return
0
;
if
(
err
<
0
)
{
snd_timer_close
(
tu
->
timeri
);
tu
->
timeri
=
NULL
;
}
else
{
tu
->
timeri
->
flags
|=
SNDRV_TIMER_IFLG_FAST
;
tu
->
timeri
->
callback
=
tu
->
tread
?
snd_timer_user_tinterrupt
:
snd_timer_user_interrupt
;
tu
->
timeri
->
ccallback
=
snd_timer_user_ccallback
;
tu
->
timeri
->
callback_data
=
(
void
*
)
tu
;
}
__err:
up
(
&
tu
->
tread_sem
);
return
err
;
}
static
int
snd_timer_user_info
(
struct
file
*
file
,
snd_timer_info_t
__user
*
_info
)
...
...
@@ -1685,11 +1696,17 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, unsigned l
{
int
xarg
;
if
(
tu
->
timeri
)
/* too late */
down
(
&
tu
->
tread_sem
);
if
(
tu
->
timeri
)
{
/* too late */
up
(
&
tu
->
tread_sem
);
return
-
EBUSY
;
if
(
get_user
(
xarg
,
p
))
}
if
(
get_user
(
xarg
,
p
))
{
up
(
&
tu
->
tread_sem
);
return
-
EFAULT
;
}
tu
->
tread
=
xarg
?
1
:
0
;
up
(
&
tu
->
tread_sem
);
return
0
;
}
case
SNDRV_TIMER_IOCTL_GINFO
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment