PREV UP next StackThreads/MP: version 0.77 User's Guide

6.2.2: Setup TLS Pointers

The method just described is suitable when the following conditions are satisfied:

There are situations where the method is not very appropriate. For example, you may want to write a tiny procedure for comparing two items and pass it to qsort function or write a tiny callback procedure that just displays a menu. Such procedures have nothing to do with parallelism, hence creating a worker group for each callback is impractical.

StackThreads/MP provides a way to declare that a StackThreads/MP procedure may be called from a sequential procedure. Specifically, A StackThreads/MP procedure can be safely called from a sequential procedure when the following conditions are met:

Procedures written according to these rules may be called both from sequential procedures and from StackThreads/MP procedures. Here is an example:

int less_than_p(void * a, void * b)
{
@  ST_CALLBACK_BEGIN();
@  int xa = evaluate(a);
@  int xb = evaluate(b);
@  ST_CALLBACK_END();
@  return xa - xb;
}

Here, evaluate may be a sequential procedure, a regular StackThreads/MP procedure, or another StackThreads/MP procedure that again surrounds its body by ST_CALLBACK_BEGIN() and ST_CALLBACK_END().

With this setup, you can pass the function less_than_p to the qsort:

qsort(a, n, sizeof(element), less_than_p);

In the above three rules, the last one is very restrictive. In essence, it says that even though such a callback procedure is compiled as a StackThreads/MP procedure, it must stay sequential, in the sense it does not use any threading operation. In our example, evaluate may not use StackThreads/MP primitives such as ST_POLLING, ST_THREAD_CREATE, and other synchronization primitives.

You might ask, "Given a callback cannot call any StackThreads/MP primitives after all, why do I want to write it as a StackThreads/MP procedure?" As a matter of fact, you can always write all such procedures in a separate file and compile them using plain gcc. What the current StackThreads/MP currently supports is no more powerful than this solution. We provide these declarations to allow callbacks and proper StackThreads/MP procedures to be written in a single file.