Date: Fri, 6 Sep 2002 10:58:02 -0700 From: Alfred Perlstein <alfred@freebsd.org> To: Michal Mertl <mime@traveller.cz> Cc: current@freebsd.org Subject: Re: bug in sysv semaphores on -CURRENT Message-ID: <20020906175802.GE21806@elvis.mu.org> In-Reply-To: <Pine.BSF.4.41.0209061411380.77195-200000@prg.traveller.cz> References: <Pine.BSF.4.41.0209061411380.77195-200000@prg.traveller.cz>
next in thread | previous in thread | raw e-mail | index | archive | help
* Michal Mertl <mime@traveller.cz> [020906 06:10] wrote:
> There seems to be bug in $SUBJ. When I run attached program on recent
> -CURRENT, it always (after several seconds) triggers the bug. I first
> suspected a problem in the program's logic but on stable in runs just
> fine.
>
> Esentially I use piece of shm memory to pass some data between several
> processes. I implemented simple locking functions with semaphores and
> noticed it behaves strange on -CURRENT and ok on -STABLE.
>
> CCing Alfred because he made some changes into the kernel part of $SUBJ. I
> don't expect the bug is new though.
>
> May I ask someone with older -CURRENT to try running the program for a
> minute?
I found your bug.
In the function ipc_unlock() you do this:
> int
> ipc_unlock(void)
> {
> struct sembuf sem_buf;
> int err;
>
> if (ipc_cfg->sem_owner != getpid()) {
> fprintf(stderr, "%d: can't unlock (bug), owner: %d\n",
> getpid(), ipc_cfg->sem_owner);
> return (-1);
> }
> if (semctl(ipc_cfg->sem_id, 0, GETVAL) != 0) {
> fprintf(stderr, "%d: can't unlock (bug), not locked\n",
> getpid());
> return (-1);
> }
> printf("%d: ipc_unlock()\n", getpid());
> sem_buf.sem_num = 0;
> sem_buf.sem_op = 1;
> sem_buf.sem_flg = 0;
> err = semop(ipc_cfg->sem_id, &sem_buf, 1);
> if (err == -1) {
> fprintf(stderr, "%d: semop()\n", getpid());
> return (-1);
> }
> ipc_cfg->sem_owner = -1;
> return (0);
> }
Problem is that you're messing with lock state after dropping your
semaphore!
If you move the
ipc_cfg->sem_owner = -1;
to before the semop() call it seems to fix things.
-Alfred
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?20020906175802.GE21806>
