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] /boston/1999/12/08.2

Gemini Mention this post

Contact the author