From ee4fa12f50ea195036c8816e90c0ac587b98fc2b Mon Sep 17 00:00:00 2001 From: Laurent Saboret Date: Thu, 24 May 2007 14:46:39 +0000 Subject: [PATCH] Fix of taucs_available_memory_size() in TAUCS for CGAL 3.3 alpha --- .../include/CGAL/Taucs_fix.h | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/Surface_mesh_parameterization/include/CGAL/Taucs_fix.h b/Surface_mesh_parameterization/include/CGAL/Taucs_fix.h index fdfade1b601..c5870a63c82 100644 --- a/Surface_mesh_parameterization/include/CGAL/Taucs_fix.h +++ b/Surface_mesh_parameterization/include/CGAL/Taucs_fix.h @@ -108,7 +108,6 @@ double taucs_system_memory_size() double m_sc; m_sc = (double) sysconf(_SC_PAGESIZE); m_sc *= (double) sysconf(_SC_PHYS_PAGES); -taucs_printf((char*)"taucs_system_memory_size returns %lfMB\n", m_sc/1048576.0); return m_sc; } #endif @@ -122,9 +121,8 @@ taucs_printf((char*)"taucs_system_memory_size returns %lfMB\n", m_sc/1048576.0); double taucs_system_memory_size() { double m_sc; - m_sc = (double) 4096; // page size + m_sc = (double) 4096; /* page size */ m_sc *= (double) sysconf(_SC_PHYS_PAGES); -taucs_printf((char*)"taucs_system_memory_size returns %lfMB\n", m_sc/1048576.0); return m_sc; } #endif @@ -140,7 +138,10 @@ taucs_printf((char*)"taucs_system_memory_size returns %lfMB\n", m_sc/1048576.0); /* Redirect calls to avoid link error */ #define taucs_available_memory_size cgal_taucs_available_memory_size #define taucs_malloc malloc -#define taucs_free free +#define taucs_free(ptr) if (ptr != NULL) free(ptr) + +/* LS 2007: if m_sys is meaningful, then we limit malloc test by 0.75*m_sys */ +#define limit_memory(mem) ((mem) < m_max ? (mem) : m_max) double taucs_available_memory_size() { @@ -151,20 +152,30 @@ double taucs_available_memory_size() double m_sys; double m,m_low,m_high,m_tol; char* p; + double m_max; m_sys = taucs_system_memory_size(); + /* LS 2007: if m_sys is meaningful, then we limit malloc test by 0.75*m_sys */ + + if (m_sys > 0) + m_max = floor(0.75 * m_sys); + else + m_max = DBL_MAX; + /* malloc test */ m = 1048576.0; - while ( (p=(char*) taucs_malloc( (size_t) (m*2.0) )) != NULL ) { + while ( (m < m_max-1) /* m_max not reached */ + && ((p=(char*) taucs_malloc( (size_t) limit_memory(m*2.0) )) != NULL) ) { + taucs_printf("taucs_avail_memory_size: %.0lf Mb\n", limit_memory(m*2.0) / 1048576.0); taucs_free(p); - m = m*2.0; + m = limit_memory(m*2.0); } m_low = m; - m_high = 2.0*m; + m_high = limit_memory(m*2.0); m_tol = m / 128.0; while ( m_high - m_low > m_tol ) { @@ -187,29 +198,22 @@ double taucs_available_memory_size() m_sys / 1048576.0 ); - /* if m_sys is meaningful, then we limit m by 0.75*m_sys */ - - if (m_sys > 0) { - m_sys = floor(0.75 * m_sys); - if (m_sys < m) m = m_sys; - } - return m; -#else // LS 2007: fix on Linux +#else /* LS 2007: workaround Linux optimistic memory allocation */ - double m_sys; /* size of physical memory */ - double m; /* size of memory available for allocation */ + double m_sys; /* size of physical memory */ + double m; /* size of memory available for allocation */ m_sys = (double) sysconf(_SC_PAGESIZE); m_sys *= (double) sysconf(_SC_PHYS_PAGES); - /* we limit m by 0.75*m_sys */ - m = floor(0.75 * m_sys); + /* we limit m by 0.75*m_sys */ + m = floor(0.75 * m_sys); - taucs_printf((char*)"taucs_available_memory_size returns %lfMB\n", m/1048576.0); + taucs_printf((char*)"taucs_available_memory_size returns %lfMB\n", m/1048576.0); - return m; + return m; #endif }