John Baldwin wrote:
On Monday 12 March 2007 16:03, Pawel Jakub Dawidek wrote:
On Mon, Mar 12, 2007 at 03:35:21PM -0400, John Baldwin wrote:
On Monday 12 March 2007 14:56, Pawel Jakub Dawidek wrote:
On Mon, Mar 12, 2007 at 11:16:23AM -0400, John Baldwin wrote:
On Saturday 10 March 2007 15:52, Pawel Jakub Dawidek wrote:
What about something like this:
#define cv_wait(cv, lock) do {
switch (LO_CLASSINDEX((struct lock_object *)(lock))) {
The problem with a cast is you use type checking. Might as well do
this:
#define cv_wait(cv, lock) _cv_wait((cv), (struct lock_object *)(lock))
This will skip type checking and my version only cast to provide type
checking, so when you pass some random variable it will give you an
error.
Not really, you may pass some garbage and the LO_CLASSINDEX turns out to
be a
mutex. :) You only get a runtime error, not a compile-time one.
Type-checking by the compiler is nice because you get compile-time errors.
I'll get compile-time error, because cv_wait_mtx() takes
'struct condvar *' and 'struct mtx *' as arguments. So even if some
garbage returns 1, which turns out to be a mutex, call to cv_wait_mtx()
will generate compile-time error.
Err, no, actually, yours will always give compile errors actually. Keep in
mind that LO_CLASSINDEX() is a run-time check. This:
#define cv_wait(cv, lock) do {
switch (LO_CLASSINDEX((struct lock_object *)(lock))) {
case 1:
cv_wait_mtx(cv, lock);
break;
case 2:
cv_wait_sx(cv, lock);
break;
case 3:
cv_wait_rw(cv, lock);
break;
default:
panic("Invalid lock.");
}
} while (0)
Will try to pass 'lock' to three different functions, at least 2 of which will
trigger compile errors. :) The kernel won't choose which one to run until
runtime though. The key is that I want a compile error, not a panic(). :)
I've been asking for awhile that for example spin and sleep mutexes should
be different types so that we could catch those problems at compile time.
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"