/[escript]/branches/windows_from_1456_trunk_1580_merged_in/paso/src/Common.h
ViewVC logotype

Diff of /branches/windows_from_1456_trunk_1580_merged_in/paso/src/Common.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1600 by phornby, Tue Jun 10 09:22:36 2008 UTC revision 1601 by phornby, Sat Jun 14 08:00:35 2008 UTC
# Line 28  Line 28 
28  /**************************************************************/  /**************************************************************/
29    
30  /* some system values */  /* some system values */
31    /* FIXME: This is not satisfactory. _ECC, __INTEL_COMPILER, and other               */
32    /*        intel compiler pre-defines need to be handled (__ICL, __ICC come to mind) */
33  #if ( defined __INTEL_COMPILER )  #if ( defined __INTEL_COMPILER )
34  #include <mathimf.h>  #include <mathimf.h>
35  #else  #else
36  #include <math.h>  #include <math.h>
37  #endif  #endif
38    
 #if (defined __OPENMP)  
 #include <omp.h>  
 #endif  
39    
40  #include <float.h>  #include <float.h>
41  #include <stdio.h>  #include <stdio.h>
# Line 88  typedef int err_t; Line 87  typedef int err_t;
87                                  _a1_=s; \                                  _a1_=s; \
88                                 }                                 }
89  /**************************************************************/  /**************************************************************/
   
90  /*    memory allocation:                                      */  /*    memory allocation:                                      */
91    /*    Wise to not use PASO_MALLOC/FREE/REALLOC and            */
92    /*    PASO_THREAD... directly. These are only for tailoring   */
93    /*    the main macros that follow                             */
94    /**************************************************************/
95    
96  /*  #if defined(_WIN32) // Use python for memory management on windows.
     This is useful for seeing what memory is being allocated if you get an "Out of memory" error  
 #define TMPMEMALLOC(_LENGTH_,_TYPE_) (printf("TMPMEMALLOC at %s %d #bytes=%d*%d=%d\n", __FILE__, __LINE__, _LENGTH_, sizeof(_TYPE_), ((size_t)(_LENGTH_) * sizeof(_TYPE_))) , (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_)))  
   
     This is useful for seeing where memory is being freed if you get an "glibc detected...free" error  
 #define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { printf("TMPMEMFREE AAA %s %d\n", __FILE__, __LINE__); free(_PTR_); (_PTR_) = NULL; printf("TMPMEMFREE BBB %s %d\n", __FILE__, __LINE__); }  
 */  
   
97    
 #if defined(__ECC)  
   /*#define MEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_)); if( !(_LENGTH_) ) printf( "Trying malloc(0) at %s %d\n", __FILE__, __LINE__ ); //else printf( "malloc(%d) at %s %d\n", _LENGTH_, __FILE__, __LINE__ );*/  
   #define TMPMEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { free(_PTR_); (_PTR_) = NULL; }  
   #define MEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define MEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { free(_PTR_); (_PTR_) = NULL; }  
   #ifdef _OPENMP  
       #define THREAD_MEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) kmp_malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
       #define THREAD_MEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { kmp_free(_PTR_); (_PTR_) = NULL; }  
   #else  
      #define THREAD_MEMALLOC(_LENGTH_,_TYPE_) TMPMEMALLOC(_LENGTH_,_TYPE_)  
      #define THREAD_MEMFREE(_PTR_) TMPMEMFREE(_PTR_)  
   #endif  
   
   /* do {} while(0) -  an old trick for bracketing a macro that */  
   /* makes sure a semi-colon does no harm.                      */  
   
   #define MEMREALLOC(_POINTER_,_LENGTH_,_TYPE_)                             \  
   do                                                                        \  
   {                                                                         \  
      if( (_POINTER_)!=NULL )                                                \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)realloc((void*)(_POINTER_),                    \  
                                      ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
      else                                                                   \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)malloc( ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
   } while(0)  
   
 #elif defined(_WIN32)  
   
   /* A little hokey-pokey to avoid windows looking for pythonxx_d.lib */  
   #ifdef _DEBUG  
     #define TMP_DEF_FLAG _DEBUG  
     #undef _DEBUG  
   #endif  
98    #include <python.h>    #include <python.h>
99    #ifdef TMP_DEF_FLAG  
100      #define _DEBUG TMP_DEF_FLAG    #define PASO_MALLOC PyMem_Malloc
101      #undef TMP_DEF_FLAG    #define PASO_FREE PyMem_Free
102    #endif    #define PASO_REALLOC PyMem_Realloc
   
   #define TMPMEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*)  PyMem_Malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { PyMem_Free(_PTR_); (_PTR_) = NULL; }  
   #define MEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*)  PyMem_Malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define MEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { PyMem_Free(_PTR_); (_PTR_) = NULL; }  
   #define THREAD_MEMALLOC(_LENGTH_,_TYPE_) TMPMEMALLOC(_LENGTH_,_TYPE_)  
   #define THREAD_MEMFREE(_PTR_) TMPMEMFREE(_PTR_)  
   #define MEMREALLOC(_POINTER_,_LENGTH_,_TYPE_)                             \  
   do                                                                        \  
   {                                                                         \  
      if( (_POINTER_)!=NULL )                                                \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)PyMem_Realloc((void*)(_POINTER_),              \  
                                      ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
      else                                                                   \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)PyMem_Malloc( ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
   } while(0)  
103    
104  #else  #else
   #define TMPMEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { free(_PTR_); (_PTR_) = NULL; }  
   #define MEMALLOC(_LENGTH_,_TYPE_) (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))  
   #define MEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { free(_PTR_); (_PTR_) = NULL; }  
   #define THREAD_MEMALLOC(_LENGTH_,_TYPE_) TMPMEMALLOC(_LENGTH_,_TYPE_)  
   #define THREAD_MEMFREE(_PTR_) TMPMEMFREE(_PTR_)  
   #define MEMREALLOC(_POINTER_,_LENGTH_,_TYPE_)                             \  
   do                                                                        \  
   {                                                                         \  
      if( (_POINTER_)!=NULL )                                                \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)realloc((void*)(_POINTER_),                    \  
                                      ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
      else                                                                   \  
      {                                                                      \  
         _POINTER_ = (_TYPE_*)malloc( ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \  
      }                                                                      \  
   } while(0)  
105    
106      #include <malloc.h>
107    
108      #define PASO_MALLOC malloc
109      #define PASO_FREE free
110      #define PASO_REALLOC realloc
111    
112    #endif
113    
114    
115    /* FIXME: This is not satisfactory. _ECC, __INTEL_COMPILER, and other               */
116    /*        intel compiler pre-defines need to be handled (__ICL, __ICC come to mind) */
117    /*        Also, _WIN32 may take this branch one day...                              */
118    /*        SO KEEP ALL THREAD_MEMALLOC/FREEs CONFINED TO THE PASO LIBRARY.           */
119    
120    #if defined(__ECC) && defined(_OPENMP) // ECC version of intel compiler with openmp.
121      #include <omp.h>
122      #define PASO_THREAD_MALLOC kmp_malloc
123      #define PASO_THREAD_FREE kmp_free
124    #else
125      #define PASO_THREAD_MALLOC PASO_MALLOC
126      #define PASO_THREAD_FREE PASO_FREE
127  #endif  #endif
128    
129  #define TMPMEMALLOC_AND_PASOCHECK(_LENGTH_,_TYPE_) ( MEMALLOC(_LENGTH_,_TYPE_);  /******************The main macros ************************************/
130    
131    #define MEMALLOC(_LENGTH_,_TYPE_)                                     \
132      (_TYPE_*) PASO_MALLOC(((size_t)(_LENGTH_))*sizeof(_TYPE_))
133    
134    /* do {} while(0) -  an old trick for bracketing a macro that */
135    /* makes sure a semi-colon does no harm.                      */
136    
137    #define MEMFREE(_PTR_)                                                  \
138    do                                                                      \
139    {                                                                       \
140      if ((void *)(_PTR_) != NULL ) { PASO_FREE(_PTR_); (_PTR_) = NULL; }   \
141    } while(0)
142    
143    #define MEMREALLOC(_POINTER_,_LENGTH_,_TYPE_)                             \
144    do                                                                        \
145    {                                                                         \
146       if( (_POINTER_)!=NULL )                                                \
147       {                                                                      \
148          _POINTER_ = (_TYPE_*)PASO_REALLOC((void*)(_POINTER_),               \
149                                       ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \
150       }                                                                      \
151       else                                                                   \
152       {                                                                      \
153          _POINTER_ = (_TYPE_*)PASO_MALLOC( ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \
154       }                                                                      \
155    } while(0)
156    
157    #define TMPMEMALLOC MEMALLOC
158    #define TMPMEMFREE MEMFREE
159    
160    #define THREAD_MEMALLOC(_LENGTH_,_TYPE_)                          \
161       (_TYPE_*) PASO_THREAD_MALLOC/**/(((size_t)(_LENGTH_))*sizeof(_TYPE_))
162    
163    #define THREAD_MEMFREE(_PTR_)                                                \
164    do                                                                           \
165    {                                                                            \
166      if ((void *)(_PTR_) != NULL ) { PASO_THREAD_FREE(_PTR_); (_PTR_) = NULL; } \
167    } while(0)
168    
169    
170    /*
171        This was useful for seeing what memory is being allocated if you get an "Out of memory" error
172            if used again, bracket with do {} while(0)
173    #define TMPMEMALLOC(_LENGTH_,_TYPE_) (printf("TMPMEMALLOC at %s %d #bytes=%d*%d=%d\n", __FILE__, __LINE__, _LENGTH_, sizeof(_TYPE_), ((size_t)(_LENGTH_) * sizeof(_TYPE_))) , (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_)))
174    
175        This was useful for seeing where memory is being freed if you get an "glibc detected...free" error
176            if used again, bracket with do {} while(0)
177    #define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { printf("TMPMEMFREE AAA %s %d\n", __FILE__, __LINE__); free(_PTR_); (_PTR_) = NULL; printf("TMPMEMFREE BBB %s %d\n", __FILE__, __LINE__); }
178    */
179    
180  #endif /* #ifndef INC_PASO_COMMON */  #endif /* #ifndef INC_PASO_COMMON */

Legend:
Removed from v.1600  
changed lines
  Added in v.1601

  ViewVC Help
Powered by ViewVC 1.1.26