Data::Layout::BuddySystem - Layout data in memory allocated via a buddy system
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 }
Implements the buddy system described at https://en.wikipedia.org/wiki/Buddy_memory_allocation 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.
Create a new Buddy system
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)
Allocate a block and return its address
Parameter Description 1 $buddySystem Buddy system 2 $size integer log2(size of allocation)
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
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
Free an allocated block via its name
Parameter Description 1 $buddySystem Buddy system 2 $name name used to allocate block
Free an allocation via its original allocation address
Parameter Description 1 $buddySystem Buddy system 2 $alloc original allocation address
These methods provide statistics on memory usage in the buddy system
Total allocated space in this buddy system
Parameter Description 1 $buddySystem Buddy system
Total free space that can still be allocated in this buddy system without changing its size
Total space currently occupied by this buddy system
These methods copy one buddy system to another compacting free space in the process.
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
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
Copy a buddy system, compacting free space, the new addresses of allocations can be found in wentTo, the largest blocks are placed first
This method generates a blessed sub whose methods provide named access to allocations backed by a "vec" in perlfunc string
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
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)"
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
philiprbrenan@gmail.com
http://www.appaapps.com
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.
To install Data::Layout::BuddySystem, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Data::Layout::BuddySystem
CPAN shell
perl -MCPAN -e shell install Data::Layout::BuddySystem
For more information on module installation, please visit the detailed CPAN module installation guide.