[comp.sys.amiga.tech] Semaphore Bugs

451061@UOTTAWA.BITNET (Valentin Pepelea) (07/24/89)

I have been playing around with signalSemaphores lately. I have not had any
success FindSemaphore()ing after I have AddSemphore()d them. Incidentally, I
also found a bug in AddSemaphore():

;====================================================================
; AddSemaphore(signalSemaphore)(A1)
;====================================================================

AddSemaphore:
        jsr     InitSemaphore         ; InitSemaphore(signalSemaphore)(A0)
        lea     SemaphoreList(a6),a0  ; Point to the semaphore list
        bra     ProtectedEnqueue

The problem is obviously that InitSemaphore() requires its argument in A0,
unlike AddSemaphore which gets it in A1. The correct code should be:

AddSemaphore:
        move.l  a1,a0                 ; Transfer the semaphore pointer
        jsr     InitSemaphore
        lea     SemaphoreList(a6),a0
        bra     ProtectedEnqueue

If you cannot wait for OS 1.4 to solve this bug, you may force your C compiler
to generate acceptable code by forcing it to load the signalSemaphore pointer
in both the A0 and A1 registers. Just simply type:

main()
{
        AddSemaphore(&signalSemaphore,&signalSemaphore);
{

That is right, typing twice the argument will load up both A0 & A1 registers.
If you are using prototypes, remember to modify the AddSemaphore declaration.
If you are using pragmas, remember to change the AddSemaphore entry to:

AddSemaphore(signalSemaphore,signalSemaphore)(A0/A1)

And for our friendly neighborhood CATS, many bytes and instruction cycles
could be saved in the Exec code by replacing the

        jsr     Permit
        rts

instructions found in AllocAbs(), CloseDevice(), CloseLibrary(), FreeMem(),
FindPort(), ObtainSemaphore(), OldOpenLibrary(), OpenResource(),
ReleaseSemaphore(), RemLibrary(),  SumLibrary(), TypeOfMem() and perhaps a few
other routiines by a simple rts. Perhaps the source code looks something like

        CALLSYS Permit
        rts

so then define a new macro called JUMPSYS, equivalent to jmp LVO\1(a6).

Valentin
_________________________________________________________________________
"An  operating  system  without         Name:   Valentin Pepelea
 virtual memory is an operating         Phonet: (613) 231-7476 (New!)
 system without virtue."                Bitnet: 451061@Uottawa.bitnet
                                        Usenet: Use cunyvm.cuny.edu gate
         - Ancient Inca Proverb         Planet: 451061@acadvm1.UOttawa.CA