[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