* * * * * They never learn … According to SlashDot, [1] there's a new OS (Operating System) called, appropriately enough, NewOS. [2] Okay, I have an interest in these things, and, unlike some others, [3] 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 (Central Processing Unit), 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. [4] [1] http://slashdot.org/developers/01/05/23/0118250.shtml [2] http://www.newos.org/ [3] http://www.v2.nl/v2_os/ [4] gopher://gopher.conman.org/0Phlog:1999/12/08.2 Email author at sean@conman.org .