Messages in this thread |  | | Date | Mon, 16 Oct 2000 15:24:52 -0700 | From | Matthew Dharm <> | Subject | Is this a valid construct? |
| |
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 Driver
Somebody call an exorcist! -- Dust Puppy User Friendly, 5/16/1998 [unhandled content-type:application/pgp-signature] |  |