Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Reserved

...

Keyword

...

"next"

...

is

...

a

...

reserved

...

keyword

...

for

...

phasers.

...

The

...

frontend

...

will

...

throw

...

an

...

error

...

whenever

...

a

...

local

...

or

...

a

...

field

...

is

...

name

...

next.

...

IN

...

clause

...

  • Pitfall:

...

  • It

...

  • is

...

  • forbidden

...

  • to

...

  • pass

...

  • addresses

...

  • of

...

  • locals

...

  • on

...

  • stack

...

  • to

...

  • an

...

  • async

...

  • IN

...

  • clause

...

  • Solutions:

...

  •  
    • Use

...

    • the

...

    • OUT

...

    • clause

...

    • Pass

...

    • a

...

    • pointer

...

    • to

...

    • a

...

    • data-structure

...

    • allocated

...

    • on

...

    • the

...

    • heap
Code Block
// Invalid example => Non-deterministic runtime error
int a = 0;
int * ptr = &a;

finish async IN(ptr) { *ptr = 10; }
// Here the address of 'a' stored in ptr may now
// points to a deallocated portion of the stack.
Code Block
// Legal code
int * ptr = malloc(sizeof(int));

finish async IN(ptr) { *ptr = 10; }
// the address pointed to by ptr is
// allocated in the heap and remains so.
  • Pitfall:

...

  •  Arrays allocated

...

  • on

...

  • stack

...

  • are

...

  • currently

...

  • not

...

  • supported

...

  • Solutions:

...

  •  
    • Work

...

    • with

...

    • arrays

...

    • allocated

...

    • on

...

    • the

...

    • heap
Code Block
// Invalid example => Non-deterministic runtime error
int a [10];

finish async IN(a) { a[0] = 1; }
// Here the address of 'a' may now points
// to a deallocated portion of the stack.
  • Pitfall:

...

  •  Only a

...

  • single

...

  • IN,

...

  • OUT

...

  • or

...

  • INOUT

...

  • clause

...

  • can

...

  • be

...

  • provided

...

  • to

...

  • an

...

  • async.

...

  • Solution:

...

    • IN

...

    • can

...

    • take

...

    • several

...

    • arguments

...

    • (similarly

...

    • to

...

    • a

...

    • method

...

    • call

...

    • invocation).
Code Block
// Legal code: a single IN clause, that takes a list several arguments
async IN(a,b) OUT(x) { code }

// Invalid example => Compile time error (two IN clauses specified)
async IN(a) IN(b) OUT(x) { code }

OUT

...

clause

...

  • Pitfall:

...

  •  OUT variables

...

  • are

...

  • guaranteed

...

  • to

...

  • have

...

  • been

...

  • written

...

  • back

...

  • only

...

  • after

...

  • the

...

  • enclosing

...

  • finish

...

  • scope

...

  • is

...

  • finished
Code Block
int a = 0;
int x = 0; // 1
finish {
  async IN(a) OUT(x) {
    // compute something
    x = someValue; // 2
  }
  // here 'x' has an undetermined value could
  // be either the value x from 1 or x from 2
}
// here 'x' contains the value computed in the async