Several flags are used to specify the perimeters. These flags fall into three categories:
Define the presence and scope of the inner perimeter.
Define the presence of the outer perimeter (which can have only one scope).
Modify the default concurrency for the different entry points.
The inner perimeter is controlled by these mutually exclusive flags:
D_MTPERMOD: The module has an inner perimeter that encloses all the module's queues.
D_MTAPAIR: The module has an inner perimeter around each read/write pair of queues.
D_MTPERQ: The module has an inner perimeter around each queue.
None of the above: The module has no inner perimeter.
The presence of the outer perimeter is configured using:
D_MTOUTEPERIM: In addition to any inner perimeter (or none), the module has an outer perimeter that encloses all the module's queues. This can be combined with all the inner perimeter options except D_MTPERMOD.
Recall that by default all synchronous entry points enter the inner perimeter exclusively and enter the outer perimeter shared. This behavior can be modified in two ways:
D_MTOCEXCL: The framework invokes the open and close procedures with exclusive access at the outer perimeter (instead of the default shared access at the outer perimeter.)
D_MTPUTSHARED: The framework invokes the put procedures with shared access at the inner perimeter (instead of the default exclusive access at the inner perimeter).