| 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 b :> mtb first | |
| 19 | while exists:b | |
| 20 | var Pointer:MtBufferBuffer n :> b next | |
| 21 | memory_free addressof:b | |
| 22 | b :> 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 b :> mtb first | |
| 34 | while exists:b and b:used | |
| 35 | b :> b next | |
| 36 | if exists:b | |
| 37 | b used := true | |
| 38 | mtb:sem release | |
| 39 | else | |
| 40 | mtb:sem release | |
| 41 | b :> (memory_allocate MtBufferBuffer:size+mtb:buffer_size addressof:mtb) map MtBufferBuffer | |
| 42 | b used := true | |
| 43 | b next :> null map MtBufferBuffer | |
| 44 | mtb:sem request | |
| 45 | var (Pointer Pointer:MtBufferBuffer) p :>> mtb first | |
| 46 | while exists:p | |
| 47 | p :>> p next | |
| 48 | p :> b | |
| 49 | mtb:sem release | |
| 50 | adr := addressof:b translate MtBufferBuffer | |
| 51 | ||
| 52 | method mtb free adr | |
| 53 | arg_rw MtBuffer mtb ; arg Address adr | |
| 54 | var Pointer:MtBufferBuffer b :> adr map MtBufferBuffer -1 | |
| 55 | b used := false | |
| 56 | ||
| 57 | export MtBuffer '. size :=' '. allocate' '. free' | |
| 58 | ||