/*lock{} is a compiler statement
which places asm LOCK instruction
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;