* * * * *

                             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 [email protected]