Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Oct 2007 11:00:48 -0700
From:      Marcel Moolenaar <xcllnt@mac.com>
To:        Poul-Henning Kamp <phk@phk.freebsd.dk>
Cc:        Ivan Voras <ivoras@freebsd.org>, freebsd-arch@freebsd.org
Subject:   Re: C++ in the kernel
Message-ID:  <60B5543F-CB5D-4E1C-8F36-5BAE1818D1CE@mac.com>
In-Reply-To: <33676.1193689342@critter.freebsd.dk>
References:  <33676.1193689342@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help

On Oct 29, 2007, at 1:22 PM, Poul-Henning Kamp wrote:

> For instance, the entire "dual-address space" dictomy og system
> calls/copy{in,out} and the very concept of interrupts are very
> tricky to sensibly express in anything but C.

Serialization and multi-threading is another thing that cannot be
expressed in or isn't part of the language and as such a possible
cause for bugs. Those bugs are the result of invalid compiler
optimizations -- that is valid in the normal case, but invalid
related to locking or multi-threading.

Think for example about common sub-expression elimination (CSE) in
the context of:

	lock()
	a1 = x
	...
	x = a2
	unlock()

	...

	lock()
	b1 = x
	...
	x = b2
	unlock()

If the compiler knows that lock() and unlock() cannot change
the value of x (by virtue of making lock() and unlock() pure
and side-effect free) then it may end up generating:


	c = x

	...

	lock()
	a1 = c
	...
	x = a2
	unlock()

	...

	lock()
	b1 = c
	...
	x = b2
	unlock()

Now we have a reference to x that's not protected by
the lock and doesn't take multi-threading into account
(i.e. the second load cannot be eliminated because x
may have changed) and may result in runtime failures.

Making x volatile is just a pessimization because that
prevents valid CSE operations.

See also:
Hans Boehm, Reordering constraints for pthread-style locks,
ACM SIGPLAN, 2007
http://portal.acm.org/citation.cfm?id=1229470

-- 
Marcel Moolenaar
xcllnt@mac.com





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?60B5543F-CB5D-4E1C-8F36-5BAE1818D1CE>