Does the following pseudocode do what I think it does?
Assume the semaphore is properly initialized to locked.
int flagvar = 0;
struct semaphore blocking_sem;
void function_called_from_kernel_thread(void)
{
chew_on_hardware();
flagvar = 1;
down(blocking_sem);
if (flagvar)
printk("something went wrong")
else
printk("everything okay")
}
void function_called_from_interrupt_context()
{
flagvar = 0;
up(blocking_sem);
}
void function_to_call_from_timeout()
{
up(blocking_sem);
}
The idea is this -- I chew on the hardware, then sleep on the semaphore. I
then either get woken up by an IRQ (which may never come), or the timeout.
I then try to use the flagvar to determine which of the two happened.
This _looks_ valid to me... but I'm seeing occurances where I get the IRQ
(yes, I'm sure of it) but flagvar == 1, which confuses me.
Is this one of those places where I need the "volatile" keyword?
The code I'm working on is in the kernel... but this is the stripped-down
version. I can provide files/lines if people want to look at particulars.
Matt
-- Matthew Dharm Home: mdharm-usb@one-eyed-alien.net Maintainer, Linux USB Mass Storage DriverSomebody call an exorcist! -- Dust Puppy User Friendly, 5/16/1998
This archive was generated by hypermail 2b29 : Mon Oct 23 2000 - 21:00:10 EST