Messages in this thread | | | Date | Thu, 19 Apr 2001 05:08:32 -0400 (EDT) | From | Alexander Viro <> | Subject | Re: light weight user level semaphores |
| |
On Thu, 19 Apr 2001, Abramo Bagnara wrote:
> Alon Ziv wrote: > > > > Hmm... > > I already started (long ago, and abandoned since due to lack of time :-( ) > > down another path; I'd like to resurrect it... > > > > My lightweight-semaphores were actually even simpler in userspace: > > * the userspace struct was just a signed count and a file handle. > > * Uncontended case is exactly like Linus' version (i.e., down() is decl + > > js, up() is incl()). > > * The contention syscall was (in my implementation) an ioctl on the FH; the > > FH was a special one, from a private syscall (although with the new VFS I'd > > have written it as just another specialized FS, or even referred into the > > SysVsem FS). > > > > So, there is no chance for user corruption of kernel data (as it just ain't > > there...); and the contended-case cost is probably equivalent (VFS cost vs. > > validation). > > This would also permit: > - to have poll() > - to use mmap() to obtain the userspace area > > It would become something very near to sacred Unix dogmas ;-)
I suspect that simple pipe with would be sufficient to handle contention case - nothing fancy needed (read when you need to block, write upon up() when you have contenders)
Would something along the lines of (inline as needed, etc.)
down: lock decl count js __down_failed down_done: ret
up: lock incl count jle __up_waking up_done: ret
__down_failed: call down_failed jmp down_done __up_waking: call up_waking jmp up_done
down_failed() { read(pipe_fd, &dummy, 1); }
up_waking() { write(pipe_fd, &dummy, 1); }
be enough? Al
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |