Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 23500
b: refs/heads/master
c: c08b8a4
h: refs/heads/master
v: v3
  • Loading branch information
Thomas Gleixner authored and Linus Torvalds committed Mar 25, 2006
1 parent 6b7e8b1 commit b998105
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 62 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 185ae6d7a32721e9062030a9f2d24ed714fa45df
refs/heads/master: c08b8a49100715b20e6f7c997e992428b5e06078
14 changes: 1 addition & 13 deletions trunk/arch/ia64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1166,19 +1166,7 @@ put_tv32 (struct compat_timeval __user *o, struct timeval *i)
asmlinkage unsigned long
sys32_alarm (unsigned int seconds)
{
struct itimerval it_new, it_old;
unsigned int oldalarm;

it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
it_new.it_value.tv_sec = seconds;
it_new.it_value.tv_usec = 0;
do_setitimer(ITIMER_REAL, &it_new, &it_old);
oldalarm = it_old.it_value.tv_sec;
/* ehhh.. We can't return 0 if we have an alarm pending.. */
/* And we'd better return too much than too little anyway */
if (it_old.it_value.tv_usec)
oldalarm++;
return oldalarm;
return alarm_setitimer(seconds);
}

/* Translations due to time_t size differences. Which affects all
Expand Down
22 changes: 1 addition & 21 deletions trunk/arch/mips/kernel/sysirix.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,27 +645,7 @@ static inline void getitimer_real(struct itimerval *value)

asmlinkage unsigned int irix_alarm(unsigned int seconds)
{
struct itimerval it_new, it_old;
unsigned int oldalarm;

if (!seconds) {
getitimer_real(&it_old);
del_timer(&current->real_timer);
} else {
it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
it_new.it_value.tv_sec = seconds;
it_new.it_value.tv_usec = 0;
do_setitimer(ITIMER_REAL, &it_new, &it_old);
}
oldalarm = it_old.it_value.tv_sec;
/*
* ehhh.. We can't return 0 if we have an alarm pending ...
* And we'd better return too much than too little anyway
*/
if (it_old.it_value.tv_usec)
oldalarm++;

return oldalarm;
return alarm_setitimer(seconds);
}

asmlinkage int irix_pause(void)
Expand Down
16 changes: 2 additions & 14 deletions trunk/arch/x86_64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,24 +430,12 @@ put_tv32(struct compat_timeval __user *o, struct timeval *i)
return err;
}

extern int do_setitimer(int which, struct itimerval *, struct itimerval *);
extern unsigned int alarm_setitimer(unsigned int seconds);

asmlinkage long
sys32_alarm(unsigned int seconds)
{
struct itimerval it_new, it_old;
unsigned int oldalarm;

it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
it_new.it_value.tv_sec = seconds;
it_new.it_value.tv_usec = 0;
do_setitimer(ITIMER_REAL, &it_new, &it_old);
oldalarm = it_old.it_value.tv_sec;
/* ehhh.. We can't return 0 if we have an alarm pending.. */
/* And we'd better return too much than too little anyway */
if (it_old.it_value.tv_usec)
oldalarm++;
return oldalarm;
return alarm_setitimer(seconds);
}

/* Translations due to time_t size differences. Which affects all
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ extern long do_utimes(int dfd, char __user *filename, struct timeval *times);
struct itimerval;
extern int do_setitimer(int which, struct itimerval *value,
struct itimerval *ovalue);
extern unsigned int alarm_setitimer(unsigned int seconds);
extern int do_getitimer(int which, struct itimerval *value);
extern void getnstimeofday(struct timespec *tv);

Expand Down
37 changes: 37 additions & 0 deletions trunk/kernel/itimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,43 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
return 0;
}

/**
* alarm_setitimer - set alarm in seconds
*
* @seconds: number of seconds until alarm
* 0 disables the alarm
*
* Returns the remaining time in seconds of a pending timer or 0 when
* the timer is not active.
*
* On 32 bit machines the seconds value is limited to (INT_MAX/2) to avoid
* negative timeval settings which would cause immediate expiry.
*/
unsigned int alarm_setitimer(unsigned int seconds)
{
struct itimerval it_new, it_old;

#if BITS_PER_LONG < 64
if (seconds > INT_MAX)
seconds = INT_MAX;
#endif
it_new.it_value.tv_sec = seconds;
it_new.it_value.tv_usec = 0;
it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;

do_setitimer(ITIMER_REAL, &it_new, &it_old);

/*
* We can't return 0 if we have an alarm pending ... And we'd
* better return too much than too little anyway
*/
if ((!it_old.it_value.tv_sec && it_old.it_value.tv_usec) ||
it_old.it_value.tv_usec >= 500000)
it_old.it_value.tv_sec++;

return it_old.it_value.tv_sec;
}

asmlinkage long sys_setitimer(int which,
struct itimerval __user *value,
struct itimerval __user *ovalue)
Expand Down
14 changes: 1 addition & 13 deletions trunk/kernel/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -956,19 +956,7 @@ void do_timer(struct pt_regs *regs)
*/
asmlinkage unsigned long sys_alarm(unsigned int seconds)
{
struct itimerval it_new, it_old;
unsigned int oldalarm;

it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
it_new.it_value.tv_sec = seconds;
it_new.it_value.tv_usec = 0;
do_setitimer(ITIMER_REAL, &it_new, &it_old);
oldalarm = it_old.it_value.tv_sec;
/* ehhh.. We can't return 0 if we have an alarm pending.. */
/* And we'd better return too much than too little anyway */
if ((!oldalarm && it_old.it_value.tv_usec) || it_old.it_value.tv_usec >= 500000)
oldalarm++;
return oldalarm;
return alarm_setitimer(seconds);
}

#endif
Expand Down

0 comments on commit b998105

Please sign in to comment.