DEFINITION MODULE Storage1; (********************************************************) (* *) (* Storage allocation with critical section protection *) (* *) (* Programmer: P. Moylan *) (* Last edited: 26 February 1995 *) (* Status: OK *) (* *) (********************************************************) (************************************************************************) (* This module supports the Modula-2 NEW and DISPOSE operations. *) (* *) (* Why should you use this module, when the standard module Storage *) (* already provides the necessary facilities? The answer is that *) (* most "normal" implementations of Storage don't provide critical *) (* section protection. Some very nasty things can happen if there's *) (* a task switch in the middle of heap manipulation; and the fault *) (* is typically non-repeatable and hard to track down. *) (* *) (* In the case of TopSpeed Modula-2 the MThread memory model takes *) (* care of this; but you might not want that solution, for two reasons:*) (* 1. It removes the possibility of using PMOS under the more *) (* economical memory models. *) (* 2. The TopSpeed solution is to disable interrupts, which could *) (* be unacceptable in real-time applications. The solution *) (* adopted in the present model is better in terms of *) (* interrupt latency. *) (* *) (************************************************************************) PROCEDURE ALLOCATE (VAR (*OUT*) p: ADDRESS; size: CARDINAL); (* Allocates a block of size bytes. *) PROCEDURE DEALLOCATE (VAR (*INOUT*) p: ADDRESS; size: CARDINAL); (* Deallocates memory that was allocated by ALLOCATE. *) END Storage1.