lkml.org 
[lkml]   [2007]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
Subjectwhatever happened to down_timeout()?

There has been some discussion on lkml about a function that would
either down a semaphore or else abort if it couldn't get the semaphore
in a certain amount of time. Something along the lines of:

down_timeout(struct semaphore *sem, long timeout);


Does something like this exist? Does anyone have a working
implementation? Does anyone see anything obviously wrong with the
following version (that I loosely based on one by Rupert Eibauer)?



semaphore.h:

extern int __down_timeout(struct semaphore * sem, unsigned int timeout);


/* "timeout" is the number of jiffies to wait.
* Returns -ETIME if timeout period expires.
*/
static inline int down_timeout(struct semaphore * sem, unsigned int timeout)
{
int ret = down_trylock(sem);
if (!ret)
ret = __down_timeout(sem, timeout);
return ret;
}




kernel/timer.c

int __down_timeout(struct semaphore * sem, int timeout)
{
int ret;
unsigned long expire;
struct timer_list timer;

expire = jiffies + timeout;
init_timer(&timer);
timer.expires = expire;
timer.data = (unsigned long) current;
timer.function = process_timeout;
add_timer(&timer);

ret = down_interruptible(sema);
if (ret && (jiffies > expire))
ret = -ETIME;
else
del_timer_sync(&timer);

return ret;
}


Thanks,
Chris
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2007-02-13 23:45    [W:0.038 / U:1.624 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site