Date: Tue, 3 Oct 2000 12:16:04 -0700 From: Alfred Perlstein <bright@wintelcom.net> To: Chuck Paterson <cp@bsdi.com> Cc: John Baldwin <jhb@FreeBSD.ORG>, arch@FreeBSD.ORG, John Polstra <jdp@polstra.com>, Daniel Eischen <eischen@vigrid.com>, Matt Dillon <dillon@earth.backplane.com>, Greg Lehey <grog@lemis.com> Subject: Re: Mutexes and semaphores Message-ID: <20001003121604.H27736@fw.wintelcom.net> In-Reply-To: <200010031528.JAA10873@berserker.bsdi.com>; from cp@bsdi.com on Tue, Oct 03, 2000 at 09:28:39AM -0600 References: <XFMail.001003010402.jhb@FreeBSD.org> <200010031528.JAA10873@berserker.bsdi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> On 27-Sep-00 Alfred Perlstein wrote: > > Right now I can't even do getpid() properly because we don't have > > read/write-barriers. > > We do have these. I have some helper functions I'll try to run by the > new-bus list tonight. > * Chuck Paterson <cp@bsdi.com> [001003 08:28] wrote: > Why do yo need a barier for getpid()? > A barrier really is not guaranteed to be sufficient > for the > > #if defined(COMPAT_43) || defined(COMPAT_SUNOS) > p->p_retval[1] = p->p_pptr->p_pid; > #endif From linux/kernel/timer.c: (It assumes struct proc is in stable storage) /* * This is not strictly SMP safe: p_opptr could change * from under us. However, rather than getting any lock * we can use an optimistic algorithm: get the parent * pid, and go back and check that the parent is still * the same. If it has changed (which is extremely unlikely * indeed), we just try again.. * * NOTE! This depends on the fact that even if we _do_ * get an old value of "parent", we can happily dereference * the pointer: we just can't necessarily trust the result * until we know that the parent pointer is valid. * * The "mb()" macro is a memory barrier - a synchronizing * event. It also makes sure that gcc doesn't optimize * away the necessary memory references.. The barrier doesn't * have to have all that strong semantics: on x86 we don't * really require a synchronizing instruction, for example. * The barrier is more important for code generation than * for any real memory ordering semantics (even if there is * a small window for a race, using the old pointer is * harmless for a while). */ asmlinkage long sys_getppid(void) { int pid; struct task_struct * me = current; struct task_struct * parent; parent = me->p_opptr; for (;;) { pid = parent->pid; #if CONFIG_SMP { struct task_struct *old = parent; mb(); parent = me->p_opptr; if (old != parent) continue; } #endif break; } return pid; } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001003121604.H27736>