Sys-Info-Driver-Linux
view release on metacpan or search on metacpan
lib/Sys/Info/Driver/Linux/Device/CPU.pm view on Meta::CPAN
package Sys::Info::Driver::Linux::Device::CPU;
$Sys::Info::Driver::Linux::Device::CPU::VERSION = '0.7911';
use strict;
use warnings;
use parent qw(Sys::Info::Base);
use Sys::Info::Driver::Linux;
use Unix::Processors;
use POSIX ();
use Carp qw( croak );
sub identify {
my $self = shift;
if ( ! $self->{META_DATA} ) {
my $mach = $self->uname->{machine};
my $arch = $mach =~ m{ i [0-9] 86 }xmsi ? 'x86'
: $mach =~ m{ ia64 }xmsi ? 'IA64'
: $mach =~ m{ x86_64 }xmsi ? 'AMD-64'
: $mach
;
my @raw = split m{\n\n}xms,
$self->trim( $self->slurp( proc->{cpuinfo} ) );
$self->{META_DATA} = [];
my $device_model;
foreach my $e ( @raw ) {
my %i = $self->_parse_cpuinfo($e);
if ( $i{__meta_key} ) {
$device_model = $i{Model};
next;
}
push @{ $self->{META_DATA} },
{ %i, architecture => $arch };
}
if ( $device_model ) {
for my $e ( @{ $self->{META_DATA} } ) {
$e->{__device_model} = $device_model;
$e->{model} ||= $device_model;
}
}
}
return $self->_serve_from_cache(wantarray);
}
sub bitness {
my $self = shift;
my @cpu = $self->identify;
my $flags = $cpu[0]->{flags};
if ( $flags ) {
my $lm = grep { $_ eq 'lm' } @{$flags};
return '64' if $lm;
}
return $cpu[0]->{architecture} =~ m{64}xms ? '64' : '32';
}
sub load {
my $self = shift;
my $level = shift;
my @loads = split /\s+/xms, $self->slurp( proc->{loadavg} );
return $loads[$level];
}
sub _parse_cpuinfo {
my $self = shift;
my $raw = shift || croak 'Parser called without data';
my($k, $v);
my %cpu;
foreach my $line (split /\n/xms, $raw) {
($k, $v) = split /\s+:\s+/xms, $line;
$cpu{$k} = $v;
}
if ( $cpu{Model} && $cpu{Revision} && $cpu{Serial} ) {
return %cpu, __meta_key => 1;
}
my @flags = $cpu{flags} ? (split /\s+/xms, $cpu{flags}) : ();
my %flags = map { $_ => 1 } @flags;
my $up = Unix::Processors->new;
my $name = $cpu{'model name'};
( run in 0.889 second using v1.01-cache-2.11-cpan-71847e10f99 )