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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to