locking in a device driver

Scott Long scottl at samsco.org
Wed Nov 2 13:16:00 PST 2005

Dinesh Nair wrote:
> On 11/03/05 03:12 Warner Losh said the following:
>> Yes.  if you tsleep with signals enabled, the periodic timer will go
>> off, and you'll return early.  This typically isn't what you want
>> either.
> looks like i've got a lot of work to do, poring thru all the ioctls for 
> the device and trying to use another method to wait instead of tsleep().

Note that a thread can block on select/poll in 4.x and still allow other
threads to run.  I used this to solve a very similar problem to your in
a 4.x app of mine.  I have the app thread wait on select() on the device
node for the driver.  When the driver gets to a state when an ioctl
won't block (like data being available to read), then it does the
appropriate magic in it's d_poll method.  select in userland sees this,
allows the thread to resume running, and the thread then calls ioctl.
Of course you have to be careful that you don't have multiple threads
competing for the same data or that the data won't somehow disappear
before the ioctl call runs.  But it does work.  Look at the aac(4)
driver for my example of this.

The other option is to use rfork, aka 'linuxthreads' to similate threads
via linked processes that share their address space.  Each 'thread' is
actually a process, and if one 'thread' blocks the rest are still 
allowed to run.  It's more heavy-weight than real threads, but it does
also work.

>> works.  If you use libc_r on 5, you'll see exactly this behavior.  If
>> you use libpthread or libthr, you won't.
> i use gcc -pthread, so it's libc_r on 4.x. what does 'gcc -pthread' link 
> to on 5.x ?

lpthread, I believe.


More information about the freebsd-hackers mailing list