/pliant/graphic/misc/mtbuffer.pli
 
 1  module "/pliant/language/compiler.pli" 
 2   
 3  type MtBufferBuffer 
 4    field CBool used 
 5    field Pointer:MtBufferBuffer next 
 6   
 7  type MtBuffer 
 8    field Pointer:MtBufferBuffer first 
 9    field FastSem sem 
 10    field Int buffer_size 
 11   
 12  function build mtb 
 13    arg_w MtBuffer mtb 
 14    mtb first :> null map MtBufferBuffer 
 15   
 16  function destroy mtb 
 17    arg_w MtBuffer mtb 
 18    var Pointer:MtBufferBuffer :> mtb first 
 19    while exists:b 
 20      var Pointer:MtBufferBuffer :> next 
 21      memory_free addressof:b 
 22      :> n 
 23   
 24  method mtb 'size :=' size 
 25    arg_rw MtBuffer mtb ; arg Int size 
 26    MtBuffer destroy_instance addressof:mtb 
 27    MtBuffer build_instance addressof:mtb 
 28    mtb buffer_size := size 
 29     
 30  method mtb allocate -> adr 
 31    arg_rw MtBuffer mtb ; arg Address adr 
 32    mtb:sem request 
 33    var Pointer:MtBufferBuffer :> mtb first 
 34    while exists:and b:used 
 35      :> next 
 36    if exists:b 
 37      used := true 
 38      mtb:sem release 
 39    else 
 40      mtb:sem release 
 41      :> (memory_allocate MtBufferBuffer:size+mtb:buffer_size addressof:mtb) map MtBufferBuffer 
 42      used := true 
 43      next :> null map MtBufferBuffer 
 44      mtb:sem request 
 45      var (Pointer Pointer:MtBufferBuffer) :>> mtb first 
 46      while exists:p 
 47        :>> next 
 48      :> b 
 49      mtb:sem release 
 50    adr := addressof:translate MtBufferBuffer 
 51   
 52  method mtb free adr 
 53    arg_rw MtBuffer mtb ; arg Address adr 
 54    var Pointer:MtBufferBuffer :> adr map MtBufferBuffer -1 
 55    used := false 
 56   
 57  export MtBuffer '. size :=' '. allocate' '. free' 
 58