[libmath-prime-util-perl] 16/16: Update for 0.06
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:44:27 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.06
in repository libmath-prime-util-perl.
commit 852bd5835829281353cb72f4c67d00533933a239
Author: Dana Jacobsen <dana at acm.org>
Date: Thu Jun 14 18:02:19 2012 -0500
Update for 0.06
---
Changes | 2 +-
README | 2 +-
XS.xs | 6 +++---
cache.c | 29 ++++++++++++++++++++++-------
cache.h | 6 ++++--
lib/Math/Prime/Util.pm | 4 ++--
sieve.c | 13 -------------
sieve.h | 1 -
util.c | 12 ++++++------
9 files changed, 39 insertions(+), 36 deletions(-)
diff --git a/Changes b/Changes
index bf0ce81..0ae8163 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
Revision history for Perl extension Math::Prime::Util.
-0.06 18 June 2012
+0.06 14 June 2012
- Change to New/Safefree from malloc. Oops.
0.05 11 June 2012
diff --git a/README b/README
index 36ed54e..ed662a0 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Math::Prime::Util version 0.05
+Math::Prime::Util version 0.06
A set of utilities related to prime numbers. These include multiple sieving
methods, is_prime, prime_count, nth_prime, approximations and bounds for
diff --git a/XS.xs b/XS.xs
index c43a013..4053120 100644
--- a/XS.xs
+++ b/XS.xs
@@ -139,9 +139,8 @@ segment_primes(IN UV low, IN UV high);
if (low < 7) low = 7;
if (low <= high) {
/* Call the segment siever one or more times */
- UV low_d, high_d;
- UV segment_size = SEGMENT_CHUNK_SIZE;
- unsigned char* sieve = get_prime_segment();
+ UV low_d, high_d, segment_size;
+ unsigned char* sieve = get_prime_segment(&segment_size);
if (sieve == 0)
croak("Could not get segment cache");
@@ -179,6 +178,7 @@ segment_primes(IN UV low, IN UV high);
low_d += range_d;
low = seghigh+2;
}
+ free_prime_segment(sieve);
}
RETVAL = newRV_noinc( (SV*) av );
OUTPUT:
diff --git a/cache.c b/cache.c
index 593564f..3ef511e 100644
--- a/cache.c
+++ b/cache.c
@@ -49,22 +49,36 @@ UV get_prime_cache(UV n, const unsigned char** sieve)
+#define SEGMENT_CHUNK_SIZE UVCONST(262144)
static unsigned char* prime_segment = 0;
-unsigned char* get_prime_segment(void) {
+unsigned char* get_prime_segment(UV *size) {
+ MPUassert(size != 0, "get_prime_segment given null size pointer");
if (prime_segment == 0)
New(0, prime_segment, SEGMENT_CHUNK_SIZE, unsigned char);
if (prime_segment == 0)
croak("Could not allocate %"UVuf" bytes for segment sieve", SEGMENT_CHUNK_SIZE);
+ *size = SEGMENT_CHUNK_SIZE;
return prime_segment;
}
-void free_prime_segment(void) {
- if (prime_segment != 0)
- Safefree(prime_segment);
- prime_segment = 0;
+void free_prime_segment(unsigned char* mem) {
+ /* Thanks for letting us know you're done. */
}
+void prime_precalc(UV n)
+{
+ if (n == 0) {
+ /* On initialization, make a few primes (2-30k using 1k memory) */
+ n = (1024-16)*30;
+ }
+
+ get_prime_cache(n, 0); /* Sieve to n */
+
+ /* TODO: should we prealloc the segment here? */
+}
+
+
void _prime_memfreeall(void)
{
if (prime_cache_sieve != 0)
@@ -72,7 +86,9 @@ void _prime_memfreeall(void)
prime_cache_sieve = 0;
prime_cache_size = 0;
- free_prime_segment();
+ if (prime_segment != 0)
+ Safefree(prime_segment);
+ prime_segment = 0;
}
void prime_memfree(void)
@@ -81,4 +97,3 @@ void prime_memfree(void)
prime_precalc(0);
}
-
diff --git a/cache.h b/cache.h
index 7423df2..b7a6da3 100644
--- a/cache.h
+++ b/cache.h
@@ -6,10 +6,12 @@
extern UV get_prime_cache_size(void);
extern UV get_prime_cache(UV n, const unsigned char** sieve);
+extern void free_prime_cache(unsigned char* sieve);
+extern void prime_precalc(UV x);
extern void prime_memfree(void);
-#define SEGMENT_CHUNK_SIZE UVCONST(262144)
-extern unsigned char* get_prime_segment(void);
+extern unsigned char* get_prime_segment(UV* size);
+extern void free_prime_segment(unsigned char* segment);
#endif
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index fc738a8..bced723 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -5,7 +5,7 @@ use Carp qw/croak confess/;
BEGIN {
$Math::Prime::Util::AUTHORITY = 'cpan:DANAJ';
- $Math::Prime::Util::VERSION = '0.05';
+ $Math::Prime::Util::VERSION = '0.06';
}
# parent is cleaner, and in the Perl 5.10.1 / 5.12.0 core, but not earlier.
@@ -208,7 +208,7 @@ Math::Prime::Util - Utilities related to prime numbers, including fast sieves an
=head1 VERSION
-Version 0.04
+Version 0.06
=head1 SYNOPSIS
diff --git a/sieve.c b/sieve.c
index e2b3662..196bf2f 100644
--- a/sieve.c
+++ b/sieve.c
@@ -8,19 +8,6 @@
#include "bitarray.h"
-void prime_precalc(UV n)
-{
- if (n == 0) {
- /* On initialization, make a few primes (2-30k using 1k memory) */
- n = (1024-16)*30;
- }
-
- get_prime_cache(n, 0); /* Sieve to n */
-
- /* TODO: should we prealloc the segment here? */
-}
-
-
UV* sieve_erat(UV end)
{
diff --git a/sieve.h b/sieve.h
index 587627f..c61b0d3 100644
--- a/sieve.h
+++ b/sieve.h
@@ -4,7 +4,6 @@
#include "EXTERN.h"
#include "perl.h"
-extern void prime_precalc(UV x);
extern UV* sieve_erat(UV end);
extern unsigned char* sieve_erat30(UV end);
extern int sieve_segment(unsigned char* mem, UV startd, UV endd);
diff --git a/util.c b/util.c
index b85fb21..b5ed802 100644
--- a/util.c
+++ b/util.c
@@ -542,10 +542,9 @@ UV prime_count(UV low, UV high)
}
/* More primes needed. Repeatedly segment sieve */
- segment_size = SEGMENT_CHUNK_SIZE;
- segment = get_prime_segment();
+ segment = get_prime_segment(&segment_size);
if (segment == 0)
- return 0;
+ croak("Could not get segment memory");
while (low_d <= high_d)
{
@@ -565,6 +564,7 @@ UV prime_count(UV low, UV high)
low_d += range_d;
}
+ free_prime_segment(segment);
return count;
}
@@ -746,10 +746,9 @@ UV nth_prime(UV n)
/* Start segment sieving. Get memory to sieve into. */
segbase = segment_size;
- segment_size = SEGMENT_CHUNK_SIZE;
- segment = get_prime_segment();
+ segment = get_prime_segment(&segment_size);
if (segment == 0)
- return 0;
+ croak("Could not get segment memory");
while (count < target) {
/* Limit the segment size if we know the answer comes earlier */
@@ -768,6 +767,7 @@ UV nth_prime(UV n)
if (count < target)
segbase += segment_size;
}
+ free_prime_segment(segment);
MPUassert(count == target, "nth_prime got incorrect count");
return ( (segbase*30) + p );
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list