Date: Sat, 30 Nov 2002 12:07:42 -0500 (EST) From: Daniel Eischen <eischen@pcnet1.pcnet.com> To: Brian Smith <dbsoft@technologist.com> Cc: Terry Lambert <tlambert2@mindspring.com>, "current@FreeBSD.ORG" <current@FreeBSD.ORG> Subject: Re: Are SysV semaphores thread-safe on CURRENT? Message-ID: <Pine.GSO.4.10.10211301204290.27919-100000@pcnet1.pcnet.com> In-Reply-To: <Pine.GSO.4.10.10211301128220.24768-100000@pcnet1.pcnet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 30 Nov 2002, Daniel Eischen wrote:
> On Sat, 30 Nov 2002, Brian Smith wrote:
>
> > On Mon, 18 Nov 2002 22:05:34 -0800, Terry Lambert wrote:
> >
> > >Use mmap of a backing-store file, and then use file locking to
> > >do record locking in the shared memory segment.
> >
> > Ok, I did this, and it actually works considerably better than
> > the SysV shared memory. However flock() has the same problem
> > as the SysV semaphores, where they block the entire process,
> > allowing the same deadlock situation to occur. Has this flock()
> > behavior changed in CURRENT?
>
> No, libc_r doesn't properly handle flock. Usually, all syscalls
> that take file descriptors as arguments honor the non-blocking
> mode of the file if set. I guess flock(2) doesn't and has its
> own option to the operation argument (LOCK_NB).
>
> I hacked libc_r to periodically check (every 100msecs) the
> flock. See if this fixes things:
Oops, I had the wrong operators. See below.
> --
> Dan Eischen
>
> Index: lib/libc_r/uthread/uthread_flock.c
> ===================================================================
> RCS file: /opt/d/CVS/src/lib/libc_r/uthread/uthread_flock.c,v
> retrieving revision 1.10
> diff -u -r1.10 uthread_flock.c
> --- lib/libc_r/uthread/uthread_flock.c 10 Apr 2001 04:19:20 -0000 1.10
> +++ lib/libc_r/uthread/uthread_flock.c 30 Nov 2002 16:23:59 -0000
> @@ -32,6 +32,7 @@
> * $FreeBSD: src/lib/libc_r/uthread/uthread_flock.c,v 1.10 2001/04/10 04:19:20 deischen Exp $
> */
> #include <sys/file.h>
> +#include <errno.h>
> #include <pthread.h>
> #include "pthread_private.h"
>
> @@ -40,10 +41,40 @@
> int
> _flock(int fd, int operation)
> {
> - int ret;
> + struct pthread *curthread;
> + struct timespec ts;
> + int ret;
>
> if ((ret = _FD_LOCK(fd, FD_RDWR, NULL)) == 0) {
> - ret = __sys_flock(fd, operation);
> + if ((operation & LOCK_NB) != 0) {
> + ret = __sys_flock(fd, operation);
> + }
> + else {
> + curthread = _get_curthread();
> + ts.tv_sec = 0;
> + ts.tv_nsec = 100000000; /* 100msecs */
> + while (((ret = __sys_flock(fd, operation | LOCK_NB)) == 0)
> + || (errno == EWOULDBLOCK)) {
The above two lines should be:
while (((ret = __sys_flock(fd, operation | LOCK_NB)) != 0)
&& (errno == EWOULDBLOCK)) {
> + curthread->data.fd.fd = fd;
> + _thread_kern_set_timeout(&ts);
> +
> + /* Reset the interrupted operation flag: */
> + curthread->interrupted = 0;
> +
> + _thread_kern_sched_state(PS_SLEEP_WAIT,
> + __FILE__, __LINE__);
> +
> + /*
> + * Check if the operation was interrupted
> + * by a signal
> + */
> + if (curthread->interrupted) {
> + errno = EINTR;
> + ret = -1;
> + break;
> + }
> + }
> + }
> _FD_UNLOCK(fd, FD_RDWR);
> }
> return (ret);
>
>
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-current" in the body of the message
>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10211301204290.27919-100000>
