Wednesday, May 23, 2001
They never learn …
According to SlashDot, there's a new OS called, appropriately enough, NewOS. Okay, I have an interest in these things, and, unlike some others, this one seems to actually be in a working state.
I download the code and peruse it.
Not five minutes and already I find a horrible bug:
void aquire_spinlock(int *lock) { if(smp_num_cpus > 1) { while(1) { while(*lock != 0) ; if(test_and_set(lock, 1) == 0) break; } } } void release_spinlock(int *lock) { *lock = 0; }
newos/kernel/smp.c:48
It works if you have more than one CPU, but on your typical single-CPU system, this
fails to do The Right Thing and you end up with very hard to track down
bugs. Also, the code for test_and_set()
is needlessly complicated:
test_and_set: movl 4(%esp),%edx /* load address of variable into edx */ _test_and_set1: movl 8(%esp),%ecx /* load the value to set the lock to */ movl (%edx),%eax /* load the value of variable into eax */ cmpl $0, %eax /* see if someone else got it */ jnz _test_and_set2 /* if so, bail out */ lock cmpxchg %ecx,(%edx) jnz _test_and_set1 /* if zf = 0, cmpxchng failed so redo it */ _test_and_set2: ret
newos/kernel/arch/i386/arch_i386.S:61
Sigh. It's not hard or complicated.