lkml.org 
[lkml]   [2000]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: Is this a valid construct?
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 wendling@ganymede.isdn.uiuc.edu
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2005-03-22 12:41    [W:0.030 / U:4.224 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site