Re: oaf locking bug ...
- From: Maciej Stachowiak <mjs noisehavoc org>
- To: Michael Meeks <michael ximian com>
- Cc: Maciej Stachowiak <mjs eazel com>, gnome-components-list gnome org
- Subject: Re: oaf locking bug ...
- Date: Wed, 26 Sep 2001 22:15:27 -0700
On 26Sep2001 11:32PM (-0400), Michael Meeks wrote:
>
> Found it:
>
> We have to open the lockfile RW to take a the lock we need, the
> fcntl was always failing silently;
>
> May I commit ?
Hi Michael,
I just committed a similar fix which I did this morning. Thanks for
your analysis on this problem.
- Maciej
>
> Regards,
>
> Michael.
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/oaf/ChangeLog,v
> retrieving revision 1.181
> diff -u -r1.181 ChangeLog
> --- ChangeLog 2001/09/12 23:15:51 1.181
> +++ ChangeLog 2001/09/27 03:28:31
> @@ -1,3 +1,9 @@
> +2001-09-28 Michael Meeks <michael ximian com>
> +
> + * liboaf/oaf-registration.c (rloc_file_lock): open a
> + writable lock read / write or we'll can't do proper locking,
> + add a warning on this error for the future.
> +
> 2001-09-12 Darin Adler <darin bentspoon com>
>
> * oafd/ac-corba.c: Add a missing include of config.h.
> Index: liboaf/oaf-registration.c
> ===================================================================
> RCS file: /cvs/gnome/oaf/liboaf/oaf-registration.c,v
> retrieving revision 1.31
> diff -u -r1.31 oaf-registration.c
> --- liboaf/oaf-registration.c 2001/09/04 03:46:52 1.31
> +++ liboaf/oaf-registration.c 2001/09/27 03:28:34
> @@ -450,19 +451,25 @@
> struct flock lock;
>
> fn = g_strdup_printf ("/tmp/orbit-%s/oaf-register.lock", g_get_user_name ());
> +
> + lock_fd = open (fn, O_CREAT | O_RDWR, 0700);
>
> - lock_fd = open (fn, O_CREAT | O_RDONLY, 0700);
> fcntl (lock_fd, F_SETFD, FD_CLOEXEC);
>
> if (lock_fd >= 0) {
> + int ret;
> lock.l_type = F_WRLCK;
> lock.l_whence = SEEK_SET;
> lock.l_start = 0;
> lock.l_len = 1;
> lock.l_pid = getpid ();
>
> - while (fcntl (lock_fd, F_SETLKW, &lock) < 0
> + while ((ret = fcntl (lock_fd, F_SETLKW, &lock)) < 0
> && errno == EINTR) /**/;
> +
> + if (ret < 0)
> + g_warning ("%d: locking error '%s'",
> + getpid (), strerror (errno));
> }
>
> g_free (fn);
>
> And:
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/bonobo-activation/ChangeLog,v
> retrieving revision 1.227
> diff -u -r1.227 ChangeLog
> --- ChangeLog 2001/09/26 07:57:59 1.227
> +++ ChangeLog 2001/09/27 03:31:08
> @@ -1,3 +1,10 @@
> +2001-09-28 Michael Meeks <michael ximian com>
> +
> + * bonobo-activation/bonobo-activation-base-service.c
> + (rloc_file_lock): open file read / write - since there is no
> + chance of EEXIST being raised since we don't use O_EXCL, need
> + read/write to be able to F_SETLKW with a F_WRLCK
> +
> 2001-09-26 Maciej Stachowiak <mjs noisehavoc org>
>
> * NEWS, configure.in: Updated for 0.9.2.
> Index: bonobo-activation/bonobo-activation-base-service.c
> ===================================================================
> RCS file:
> /cvs/gnome/bonobo-activation/bonobo-activation/bonobo-activation-base-service.c,v
> retrieving revision 1.32
> diff -u -r1.32 bonobo-activation-base-service.c
> --- bonobo-activation/bonobo-activation-base-service.c 2001/08/01
> 01:57:02 1.32
> +++ bonobo-activation/bonobo-activation-base-service.c 2001/09/27
> 03:31:14
> @@ -456,35 +456,25 @@
>
> fn = g_strdup_printf ("/tmp/orbit-%s/oaf-register.lock",
> g_get_user_name ());
>
> - while ((lock_fd = open (fn, O_CREAT | O_RDONLY, 0700)) < 0) {
> - if (errno == EEXIST) {
> -#ifdef HAVE_USLEEP
> - usleep (10000);
> -#elif defined(HAVE_NANOSLEEP)
> - {
> - struct timespec timewait;
> - timewait.tv_sec = 0;
> - timewait.tv_nsec = 1000000;
> - nanosleep (&timewait, NULL);
> - }
> -#else
> - sleep (1);
> -#endif
> - } else
> - break;
> - }
> + lock_fd = open (fn, O_CREAT | O_RDWR, 0700);
>
> fcntl (lock_fd, F_SETFD, FD_CLOEXEC);
>
> if (lock_fd >= 0) {
> + int ret;
> +
> lock.l_type = F_WRLCK;
> lock.l_whence = SEEK_SET;
> lock.l_start = 0;
> lock.l_len = 1;
> lock.l_pid = getpid ();
>
> - while (fcntl (lock_fd, F_SETLKW, &lock) < 0
> + while ((ret = fcntl (lock_fd, F_SETLKW, &lock)) < 0
> && errno == EINTR) /**/;
> +
> + if (ret < 0)
> + g_warning ("%d: locking error '%s'",
> + getpid (), strerror (errno));
> }
>
> g_free (fn);
>
>
> --
> mmeeks gnu org <><, Pseudo Engineer, itinerant idiot
>
>
> _______________________________________________
> gnome-components-list mailing list
> gnome-components-list gnome org
> http://mail.gnome.org/mailman/listinfo/gnome-components-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]