Name Data::Layout::BuddySystem - Layout data in memory allocated via a buddy system Synopsis use Test::More tests=>10; use Data::Layout::BuddySystem; use utf8; my $b = Data::Layout::BuddySystem::new; # Create a new buddy system $b->allocField(@$_) for # Allocate fields in the buddy system [𝝳=>6], [𝝰=>0], [𝝙=>6],[𝝱=>0],[𝞈 =>4], [𝝺=>5], [𝝲=>0], [𝝖=>3], [𝝗=>3]; # Name and log2 size of each field my $s = $b->generateStructureFields('Struct'); # Generate structure definition ok nws($s->()) eq nws(<<'END'); # String representation of methods associated with generated structure package Struct; use utf8; sub 𝝰 :lvalue {vec($_[1], 0, 1 )} sub 𝝱 :lvalue {vec($_[1], 1, 1 )} sub 𝝲 :lvalue {vec($_[1], 2, 1 )} sub 𝝖 :lvalue {vec($_[1], 1, 8 )} sub 𝝗 :lvalue {vec($_[1], 2, 8 )} sub 𝞈 :lvalue {vec($_[1], 2, 16 )} sub 𝝺 :lvalue {vec($_[1], 2, 32 )} sub 𝝳 :lvalue {vec($_[1], 2, 64 )} sub 𝝙 :lvalue {vec($_[1], 3, 64 )} END if (1) # Set fields {$s->𝝰(my $𝕄) = 1; ok $𝕄 eq "\1"; $s->𝝱( $𝕄) = 0; ok $𝕄 eq "\1"; $s->𝝲( $𝕄) = 1; ok $𝕄 eq "\5"; $s->𝝖( $𝕄) = 3; ok $𝕄 eq "\x05\x03"; # Byte fields $s->𝝗( $𝕄) = 7; ok $𝕄 eq "\x05\x03\x07"; $s->𝞈( $𝕄) = 9; ok $𝕄 eq "\x05\x03\x07\x00\x00\x09"; # Word field } if (1) # Set and get an integer field {$s->𝝺(my $𝕄) = 2; ok $s->𝝺($𝕄) == 2; # Set field $s->𝝺( $𝕄)++; ok $s->𝝺($𝕄) == 3; # Increment field ok $𝕄 eq "\0\0\0\0\0\0\0\0\0\0\0\3"; # Dump the memory organised by the buddy system } Description Implements the buddy system described at in 100% Pure Perl. Blocks can be identified by names or addresses which remain invariant even after one buddy system has been copied to a new one to compact free space. Each named allocation can be accessed via a generated method which identifies an lvalue area of a "vec" in perlfunc string used to back the memory organised by the buddy system. Methods new() Create a new Buddy system allocField($buddySystem, $name, $size) Allocate a block in the buddy system, give it a name that is invariant even after this buddy system has been copied to a new buddy system to compact its storage, and return the address of its location in the buddy system Parameter Description 1 $buddySystem Buddy system 2 $name name of block 3 $size integer log2(size of allocation) alloc($buddySystem, $size) Allocate a block and return its address Parameter Description 1 $buddySystem Buddy system 2 $size integer log2(size of allocation) locateAddress($buddySystem, $alloc) Find the current location of a block by its original address after it has been copied to a new buddy system Parameter Description 1 $buddySystem Buddy system 2 $alloc address at which the block was originally located locateName($buddySystem, $name) Find the current location of a named block after it has been copied to a new buddy system Parameter Description 1 $buddySystem Buddy system 2 $name name of the block freeName($buddySystem, $name) Free an allocated block via its name Parameter Description 1 $buddySystem Buddy system 2 $name name used to allocate block free($buddySystem, $alloc) Free an allocation via its original allocation address Parameter Description 1 $buddySystem Buddy system 2 $alloc original allocation address Statistics These methods provide statistics on memory usage in the buddy system usedSpace($buddySystem) Total allocated space in this buddy system Parameter Description 1 $buddySystem Buddy system freeSpace($buddySystem) Total free space that can still be allocated in this buddy system without changing its size Parameter Description 1 $buddySystem Buddy system totalSpace($buddySystem) Total space currently occupied by this buddy system Parameter Description 1 $buddySystem Buddy system Relocation These methods copy one buddy system to another compacting free space in the process. copy($buddySystem, $order, $copy) Copy a buddy system to compact its free space, the largest blocks are placed in (0) - ascending, (1) - descending order of size, blocks that get relocated to new positions in the new buddy system will still be accessible by their original address or name Parameter Description 1 $buddySystem Buddy system 2 $order order 3 $copy optional copy method to copy an old allocation into its corresponding new allocation copyLargestLast($buddySystem, $copy) Copy a buddy system, compacting free space, the new addresses of allocations can be found in wentTo, the largest blocks are placed last Parameter Description 1 $buddySystem BuddySystem 2 $copy copy method to copy an old allocation into a new allocation copyLargestFirst($buddySystem, $copy) Copy a buddy system, compacting free space, the new addresses of allocations can be found in wentTo, the largest blocks are placed first Parameter Description 1 $buddySystem BuddySystem 2 $copy copy method to copy an old allocation into a new allocation Structure This method generates a blessed sub whose methods provide named access to allocations backed by a "vec" in perlfunc string generateStructureFields($buddySystem, $package) Return a blessed sub whose methods access the named blocks in the buddy system. The blessed sub returns a text representation of the method definitions Parameter Description 1 $buddySystem Buddy system 2 $package structure name Index The following methods will be exported by the :all tag "alloc($buddySystem, $size)" "allocField($buddySystem, $name, $size)" "copy($buddySystem, $order, $copy)" "copyLargestFirst($buddySystem, $copy)" "copyLargestLast($buddySystem, $copy)" "free($buddySystem, $alloc)" "freeName($buddySystem, $name)" "freeSpace($buddySystem)" "generateStructureFields($buddySystem, $package)" "locateAddress($buddySystem, $alloc)" "locateName($buddySystem, $name)" "new()" "totalSpace($buddySystem)" "usedSpace($buddySystem)" Installation This module is written in 100% Pure Perl and is thus easy to read, modify and install. Standard Module::Build process for building and installing modules: perl Build.PL ./Build ./Build test ./Build install Author philiprbrenan@gmail.com http://www.appaapps.com Copyright Copyright (c) 2016 Philip R Brenan. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.