/*lock{} is a compiler stmt
which places asm LOCK inst
prefixes on code.  Only use it on
read-modify-write statements.
It will generate invalid insts
if you misuse it and it will crash.
U() to see what code was generated.
*/

#define COUNT   0x1000000

I64 global;

U0 MPUnlockedInc(I64)
{
        I64 i;

        for (i = 0; i < COUNT; i++)
                global++;
}

U0 UnlockedInc()
{
        CJob *tmpm0, *tmpm1;

        global= 0;
        tmpm0 = JobQueue(&MPUnlockedInc, NULL, 0, 0);
        tmpm1 = JobQueue(&MPUnlockedInc, NULL, 1, 0);
        JobResGet(tmpm0);
        JobResGet(tmpm1);
        "Correct Count:%X Actual Count:%X\n", COUNT * 2, global;
}

U0 MPLockedInc(I64)
{
        I64 i;

        for (i = 0; i < COUNT; i++)
                lock /*Can be used without {} */ global++;
}

U0 LockedInc()
{
        CJob *tmpm0, *tmpm1;

        global = 0;
        tmpm0 = JobQueue(&MPLockedInc, NULL, 0, 0);
        tmpm1 = JobQueue(&MPLockedInc, NULL, 1, 0);
        JobResGet(tmpm0);
        JobResGet(tmpm1);
        "Correct Count:%X Actual Count:%X\n", COUNT * 2, global;
}

UnlockedInc;
LockedInc;