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: [EMAIL PROTECTED] 
Maintainer, Linux USB Mass Storage Driver

Somebody call an exorcist!
                                        -- Dust Puppy
User Friendly, 5/16/1998

PGP signature

Reply via email to