Also sprach Matthew Dharm:
} 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.
} 
Are you sure there isn't a race on the flagvar variable? Like, the
interrupt happens, it gets set to 0, then before we can ``up'' the
semaphore, it's set to 1 in the function_called_from_kernel_thread()?

-- 
|| Bill Wendling                        [EMAIL PROTECTED]

PGP signature

Reply via email to