Skip to content

Commit

Permalink
[PATCH] hrtimer: create generic sleeper
Browse files Browse the repository at this point in the history
The removal of the data field in the hrtimer structure enforces the
embedding of the timer into another data structure.  nanosleep now uses a
private implementation of the most common used timer callback function
(simple task wakeup).

In order to avoid the reimplentation of such functionality all over the
place a generic hrtimer_sleeper functionality is created.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Thomas Gleixner authored and Linus Torvalds committed Mar 31, 2006
1 parent 2bfb646 commit 00362e3
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
16 changes: 16 additions & 0 deletions include/linux/hrtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,19 @@ struct hrtimer {
struct hrtimer_base *base;
};

/**
* struct hrtimer_sleeper - simple sleeper structure
*
* @timer: embedded timer structure
* @task: task to wake up
*
* task is set to NULL, when the timer expires.
*/
struct hrtimer_sleeper {
struct hrtimer timer;
struct task_struct *task;
};

/**
* struct hrtimer_base - the timer base for a specific clock
*
Expand Down Expand Up @@ -127,6 +140,9 @@ extern long hrtimer_nanosleep(struct timespec *rqtp,
const enum hrtimer_mode mode,
const clockid_t clockid);

extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
struct task_struct *tsk);

/* Soft interrupt function to run the hrtimer queues: */
extern void hrtimer_run_queues(void);

Expand Down
19 changes: 19 additions & 0 deletions kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,25 @@ void hrtimer_run_queues(void)
* Sleep related functions:
*/

static int hrtimer_wakeup(struct hrtimer *timer)
{
struct hrtimer_sleeper *t =
container_of(timer, struct hrtimer_sleeper, timer);
struct task_struct *task = t->task;

t->task = NULL;
if (task)
wake_up_process(task);

return HRTIMER_NORESTART;
}

void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, task_t *task)
{
sl->timer.function = hrtimer_wakeup;
sl->task = task;
}

struct sleep_hrtimer {
struct hrtimer timer;
struct task_struct *task;
Expand Down

0 comments on commit 00362e3

Please sign in to comment.