commit da7141765eb51f06ae592467cb150fcfe790de39
parent 32d8bb7488a50fb1e7a0b3834645dfe006c11090
Author: Kyle Milz <kyle@0x30.net>
Date: Sun, 18 Dec 2016 11:58:10 -0700
t: use Inline::C to get struct sizes
Diffstat:
M | src/lib.c | | | 5 | +---- |
M | t/shm.pm | | | 58 | ++++++++++++++++++++++++++++++++++++++++------------------ |
2 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/src/lib.c b/src/lib.c
@@ -50,7 +50,7 @@ extend(size_t req_bytes)
if ((len = lseek(fd, 0, SEEK_END)) < 0)
err(1, "lseek");
- /* Increase file length. */
+ /* Increase file length, filling with zeros. */
if (ftruncate(fd, len + aligned_bytes) < 0)
err(1, "ftruncate from %lld to %llu", len, len + aligned_bytes);
@@ -102,9 +102,6 @@ set_exited()
static void
add_header()
{
- /* This assumption is hardcoded elsewhere.*/
- assert(sizeof(struct citrun_header) < getpagesize());
-
header = extend(sizeof(struct citrun_header));
/* Must be exactly 4 bytes. */
diff --git a/t/shm.pm b/t/shm.pm
@@ -1,10 +1,9 @@
package t::shm;
use strict;
use warnings;
+use Inline 'C';
use POSIX;
-my $pagesize = POSIX::sysconf(POSIX::_SC_PAGESIZE);
-
sub new {
my ($class, $procfile) = @_;
@@ -12,9 +11,12 @@ sub new {
bless($self, $class);
open(my $fh, "<:mmap", $procfile) or die $!;
-
+ $self->{procfile} = $procfile;
$self->{fh} = $fh;
+ my $header_size = citrun_header_size();
+ my $aligned_size = get_aligned_size($header_size);
+
( $self->{magic},
$self->{major}, $self->{minor},
$self->{pids}[0], $self->{pids}[1], $self->{pids}[2],
@@ -23,38 +25,47 @@ sub new {
$self->{done},
$self->{progname},
$self->{cwd}
- ) = unpack("Z4I8Z1024Z1024", xread($fh, $pagesize));
+ ) = unpack("Z4I8Z1024Z1024", xread($fh, $aligned_size));
my @translation_units;
- $self->{size} = (stat $procfile)[7];
- while (tell $fh < $self->{size}) {
+ while (tell $fh < $self->stat_procfile()) {
my %tu;
- ($tu{size}, $tu{comp_file_name}, $tu{abs_file_path}) =
- unpack("IZ1024Z1024", xread($fh, 4 + 2 * 1024 + 4 + 8));
+ my $node_fixed_size = citrun_node_size();
+ (
+ $tu{size},
+ $tu{comp_file_name},
+ $tu{abs_file_path}
+ ) = unpack("IZ1024Z1024", xread($fh, $node_fixed_size));
$tu{exec_buf_pos} = tell $fh;
- xread($fh, $tu{size} * 8);
- $self->next_page();
- push @translation_units, (\%tu);
+ my $node_end = $tu{exec_buf_pos} + ($tu{size} * 8);
+ my $node_end_aligned = get_aligned_size($node_end);
- $self->{size} = (stat $procfile)[7];
+ seek $self->{fh}, $node_end_aligned, 0;
+
+ push @translation_units, (\%tu);
}
$self->{translation_units} = \@translation_units;
return $self;
}
-# Skips to the next page boundary. If exactly on a page boundary then stay
-# there.
-sub next_page {
+sub stat_procfile {
my ($self) = @_;
- my $page_mask = $pagesize - 1;
- my $cur_pos = tell $self->{fh};
+ $self->{size} = (stat $self->{fh})[7];
+ return $self->{size};
+}
- seek $self->{fh}, ($cur_pos + $page_mask) & ~$page_mask, 0;
+sub get_aligned_size {
+ my ($unaligned_size) = @_;
+
+ my $page_size = POSIX::sysconf(POSIX::_SC_PAGESIZE);
+ my $page_mask = $page_size - 1;
+
+ return ($unaligned_size + $page_mask) & ~$page_mask;
}
sub execs_for {
@@ -89,3 +100,14 @@ sub xread {
}
1;
+__DATA__
+__C__
+#include "/home/kyle/citrun/src/lib.h"
+
+size_t citrun_header_size() {
+ return sizeof(struct citrun_header);
+}
+
+size_t citrun_node_size() {
+ return sizeof(struct citrun_node);
+}