CommonPreamble.h

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/common/CommonPreamble.h#26 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2005-2009 SQLstream, Inc.
00006 // Copyright (C) 2005-2009 LucidEra, Inc.
00007 // Portions Copyright (C) 1999-2009 John V. Sichi
00008 //
00009 // This program is free software; you can redistribute it and/or modify it
00010 // under the terms of the GNU General Public License as published by the Free
00011 // Software Foundation; either version 2 of the License, or (at your option)
00012 // any later version approved by The Eigenbase Project.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 */
00023 
00024 #ifndef Fennel_CommonPreamble_Included
00025 #define Fennel_CommonPreamble_Included
00026 
00027 // Autoconf definitions
00028 #include <config.h>
00029 
00030 // NOTE: CommonPreamble.h should be included by all fennel *.cpp files before
00031 // any other.
00032 
00033 // Common standard headers
00034 
00035 // NOTE: we include these first to make sure we get the desired limit
00036 // definitions
00037 #ifndef __MSVC__
00038 #define __STDC_LIMIT_MACROS
00039 #else
00040 #define NOMINMAX
00041 #pragma warning (disable : 4355)
00042 #endif
00043 
00044 #define _XOPEN_SOURCE 500
00045 #define _GNU_SOURCE 1
00046 
00047 // Request support for large file offsets (> 4G) without needing special
00048 // versions of standard I/O calls.
00049 #define _FILE_OFFSET_BITS 64
00050 
00051 #ifndef __MSVC__
00052 #include <inttypes.h>
00053 #endif
00054 
00055 #include <stddef.h>
00056 #include <limits.h>
00057 
00058 #include <stdio.h>
00059 #include <stdlib.h>
00060 #include <stdexcept>
00061 #include <iostream>
00062 #include <sstream>
00063 #include <string>
00064 #include <string.h>
00065 #include <time.h>
00066 #include <new>
00067 #include <cassert>
00068 #include <vector>
00069 #include <boost/thread/tss.hpp>
00070 
00071 #ifndef __MSVC__
00072 #if __WORDSIZE == 64
00073 #define FMT_INT64      "ld"
00074 #define FMT_UINT64     "lu"
00075 #else
00076 #define FMT_INT64      "lld"
00077 #define FMT_UINT64     "llu"
00078 #endif
00079 #else
00080 // MSVCRT.DLL printf treats ll as a 32-bit integer
00081 // and uses the prefix I64 for 64-bit integers
00082 #define FMT_INT64      "I64d"
00083 #define FMT_UINT64     "I64u"
00084 #define strtoll _strtoi64
00085 #define strtoull _strtoui64
00086 #define strncasecmp strnicmp
00087 #define isnan _isnan
00088 // TODO jvs 3-Mar-2009:  inline function instead
00089 #define round(x) (((x) >= 0) ? floor((x) + 0.5) : ceil((x) - 0.5))
00090 #define roundf round
00091 
00092 #endif
00093 
00094 typedef unsigned uint;
00095 
00096 // DLL export symbols for each component
00097 
00098 #ifdef __MSVC__
00099 
00100 #if defined(FENNEL_COMMON_EXPORTS) || defined(FENNEL_SYNCH_EXPORTS)
00101 #define FENNEL_COMMON_EXPORT __declspec(dllexport)
00102 #define FENNEL_SYNCH_EXPORT __declspec(dllexport)
00103 #else
00104 #define FENNEL_COMMON_EXPORT __declspec(dllimport)
00105 #define FENNEL_SYNCH_EXPORT __declspec(dllimport)
00106 #endif
00107 
00108 #ifdef FENNEL_DEVICE_EXPORTS
00109 #define FENNEL_DEVICE_EXPORT __declspec(dllexport)
00110 #else
00111 #define FENNEL_DEVICE_EXPORT __declspec(dllimport)
00112 #endif
00113 
00114 #ifdef FENNEL_CACHE_EXPORTS
00115 #define FENNEL_CACHE_EXPORT __declspec(dllexport)
00116 #else
00117 #define FENNEL_CACHE_EXPORT __declspec(dllimport)
00118 #endif
00119 
00120 #ifdef FENNEL_SEGMENT_EXPORTS
00121 #define FENNEL_SEGMENT_EXPORT __declspec(dllexport)
00122 #else
00123 #define FENNEL_SEGMENT_EXPORT __declspec(dllimport)
00124 #endif
00125 
00126 #ifdef FENNEL_TXN_EXPORTS
00127 #define FENNEL_TXN_EXPORT __declspec(dllexport)
00128 #else
00129 #define FENNEL_TXN_EXPORT __declspec(dllimport)
00130 #endif
00131 
00132 #ifdef FENNEL_TUPLE_EXPORTS
00133 #define FENNEL_TUPLE_EXPORT __declspec(dllexport)
00134 #else
00135 #define FENNEL_TUPLE_EXPORT __declspec(dllimport)
00136 #endif
00137 
00138 #ifdef FENNEL_EXEC_EXPORTS
00139 #define FENNEL_EXEC_EXPORT __declspec(dllexport)
00140 #else
00141 #define FENNEL_EXEC_EXPORT __declspec(dllimport)
00142 #endif
00143 
00144 #ifdef FENNEL_BTREE_EXPORTS
00145 #define FENNEL_BTREE_EXPORT __declspec(dllexport)
00146 #else
00147 #define FENNEL_BTREE_EXPORT __declspec(dllimport)
00148 #endif
00149 
00150 #ifdef FENNEL_DB_EXPORTS
00151 #define FENNEL_DB_EXPORT __declspec(dllexport)
00152 #else
00153 #define FENNEL_DB_EXPORT __declspec(dllimport)
00154 #endif
00155 
00156 #ifdef FENNEL_FTRS_EXPORTS
00157 #define FENNEL_FTRS_EXPORT __declspec(dllexport)
00158 #else
00159 #define FENNEL_FTRS_EXPORT __declspec(dllimport)
00160 #endif
00161 
00162 #ifdef FENNEL_SORTER_EXPORTS
00163 #define FENNEL_SORTER_EXPORT __declspec(dllexport)
00164 #else
00165 #define FENNEL_SORTER_EXPORT __declspec(dllimport)
00166 #endif
00167 
00168 #ifdef FENNEL_FLATFILE_EXPORTS
00169 #define FENNEL_FLATFILE_EXPORT __declspec(dllexport)
00170 #else
00171 #define FENNEL_FLATFILE_EXPORT __declspec(dllimport)
00172 #endif
00173 
00174 #ifdef FENNEL_HASHEXE_EXPORTS
00175 #define FENNEL_HASHEXE_EXPORT __declspec(dllexport)
00176 #else
00177 #define FENNEL_HASHEXE_EXPORT __declspec(dllimport)
00178 #endif
00179 
00180 #ifdef FENNEL_CALCULATOR_EXPORTS
00181 #define FENNEL_CALCULATOR_EXPORT __declspec(dllexport)
00182 #else
00183 #define FENNEL_CALCULATOR_EXPORT __declspec(dllimport)
00184 #endif
00185 
00186 #ifdef FENNEL_FARRAGO_EXPORTS
00187 #define FENNEL_FARRAGO_EXPORT __declspec(dllexport)
00188 #else
00189 #define FENNEL_FARRAGO_EXPORT __declspec(dllimport)
00190 #endif
00191 
00192 #ifdef FENNEL_TEST_EXPORTS
00193 #define FENNEL_TEST_EXPORT __declspec(dllexport)
00194 #else
00195 #define FENNEL_TEST_EXPORT __declspec(dllimport)
00196 #endif
00197 
00198 #if defined(FENNEL_LCS_EXPORTS) || defined(FENNEL_LBM_EXPORTS)
00199 #define FENNEL_LCS_EXPORT __declspec(dllexport)
00200 #define FENNEL_LBM_EXPORT __declspec(dllexport)
00201 #else
00202 #define FENNEL_LCS_EXPORT __declspec(dllimport)
00203 #define FENNEL_LBM_EXPORT __declspec(dllimport)
00204 
00205 #endif
00206 
00207 #else
00208 #define FENNEL_COMMON_EXPORT
00209 #define FENNEL_SYNCH_EXPORT
00210 #define FENNEL_DEVICE_EXPORT
00211 #define FENNEL_CACHE_EXPORT
00212 #define FENNEL_SEGMENT_EXPORT
00213 #define FENNEL_TXN_EXPORT
00214 #define FENNEL_TUPLE_EXPORT
00215 #define FENNEL_EXEC_EXPORT
00216 #define FENNEL_BTREE_EXPORT
00217 #define FENNEL_DB_EXPORT
00218 #define FENNEL_FTRS_EXPORT
00219 #define FENNEL_SORTER_EXPORT
00220 #define FENNEL_FLATFILE_EXPORT
00221 #define FENNEL_HASHEXE_EXPORT
00222 #define FENNEL_CALCULATOR_EXPORT
00223 #define FENNEL_FARRAGO_EXPORT
00224 #define FENNEL_TEST_EXPORT
00225 #define FENNEL_LCS_EXPORT
00226 #define FENNEL_LBM_EXPORT
00227 #endif
00228 
00229 #include "fennel/common/Namespace.h"
00230 
00231 // These macros are used to bracket code in all C++ files making up the
00232 // implementation of the record manager.  The parameter x should be a string
00233 // containing a revision control file Id tag, which is currently unused.
00234 
00235 #define FENNEL_BEGIN_CPPFILE(x) \
00236 FENNEL_BEGIN_NAMESPACE
00237 
00238 #define FENNEL_END_CPPFILE(x) \
00239 FENNEL_END_NAMESPACE
00240 
00241 #include "fennel/common/OpaqueInteger.h"
00242 #include "fennel/common/Types.h"
00243 
00244 // define OpaqueInteger hash fxn
00245 namespace std
00246 {
00247 
00248 template<class T,class Dummy>
00249 struct hash
00250 < fennel::OpaqueInteger<T,Dummy> >
00251 {
00252     size_t operator() (const fennel::OpaqueInteger<T,Dummy> &key) const
00253     {
00254         return hash<T>()(fennel::opaqueToInt(key));
00255     }
00256 };
00257 
00258 } // namespace std
00259 
00260 // Memory management
00261 
00262 // "placement new" definitions
00263 inline void *operator new(size_t,fennel::PBuffer pBuffer)
00264 {
00265     return pBuffer;
00266 }
00267 
00268 inline void *operator new[](size_t,fennel::PBuffer pBuffer)
00269 {
00270     return pBuffer;
00271 }
00272 
00273 FENNEL_BEGIN_NAMESPACE
00274 
00275 class FENNEL_COMMON_EXPORT VectorOfUint : public std::vector<uint>
00276 {
00277 };
00278 
00283 template <class T>
00284 inline void deleteAndNullify(T *&p)
00285 {
00286     if (p) {
00287         delete p;
00288         p = NULL;
00289     }
00290 }
00291 
00296 template <class T>
00297 inline void deleteAndNullifyArray(T *&p)
00298 {
00299     if (p) {
00300         delete [] p;
00301         p = NULL;
00302     }
00303 }
00304 
00305 
00306 // Memory alignment
00307 
00315 #if (__WORDSIZE == 64) || defined(sun)
00316 #define ARCH_ALIGN_BYTES 8
00317 #else
00318 #define ARCH_ALIGN_BYTES 4
00319 #endif
00320 
00324 #define ARCH_ALIGN_MASK (ARCH_ALIGN_BYTES - 1)
00325 
00329 template<class T>
00330 inline T alignRoundDown(T t)
00331 {
00332     return t & ~ARCH_ALIGN_MASK;
00333 }
00334 
00338 template<class T>
00339 inline T *alignRoundPtrDown(T *t)
00340 {
00341     return (T *) alignRoundDown(uint(t));
00342 }
00343 
00347 template<class T>
00348 inline T alignRoundUp(T t)
00349 {
00350     if (t & ARCH_ALIGN_MASK) {
00351         return alignRoundDown(t) + ARCH_ALIGN_BYTES;
00352     } else {
00353         return t;
00354     }
00355 }
00356 
00360 template<class T>
00361 inline T *alignRoundPtrUp(T *t)
00362 {
00363     return (T *) alignRoundUp(uint(t));
00364 }
00365 
00366 // calculate number of bytes needed to hold given number of bits
00367 inline uint bytesForBits(uint cBits)
00368 {
00369     return (cBits >> 3) + ((cBits & 7) ? 1 : 0);
00370 }
00371 
00372 
00373 // Misc types and utils
00374 
00375 // prints out a hex dump of the given block of memory
00376 // cb bytes are dumped with at most 16 bytes per line, with the offset
00377 // of each line printed on the left (with an optional additional offset)
00378 extern void FENNEL_COMMON_EXPORT hexDump(
00379     std::ostream &,void const *,uint cb,
00380     uint cbOffsetInitial = 0);
00381 
00382 template <class Numeric>
00383 inline Numeric sqr(Numeric n)
00384 {
00385     return n*n;
00386 }
00387 
00388 // NOTE jvs 18-Mar-2005:  neither boost nor stlport exposes this
00389 extern int FENNEL_COMMON_EXPORT getCurrentThreadId();
00390 
00391 extern std::logic_error FENNEL_COMMON_EXPORT constructAssertion(
00392     char const *pFilename,int lineNum,char const *condExpr);
00393 
00394 // Use permAssert to create an assertion which should be compiled even in
00395 // non-debug builds.  This is only appropriate for performance-insensitive
00396 // code. In debug-mode, does the same as assert.
00397 
00398 #ifdef NDEBUG
00399 
00400 #define permAssert(cond) \
00401 do { \
00402     if (!(cond)) { \
00403         throw fennel::constructAssertion(__FILE__,__LINE__,#cond); \
00404     } \
00405 } while (0)
00406 
00407 #else
00408 
00409 #define permAssert(cond) assert(cond)
00410 
00411 #endif
00412 
00413 // Use permFail to create an exception which indicates that an invariant has
00414 // been violated. For example:
00415 //
00416 // switch (x) {
00417 // case 1: return foo();
00418 // default: permFail("invalid value for x: " << x);
00419 // }
00420 
00421 #ifdef NDEBUG
00422 
00423 #define permFail(msg) \
00424 do { \
00425     std::ostringstream oss; \
00426     oss << msg; \
00427     throw fennel::constructAssertion(__FILE__,__LINE__, oss.str().c_str()); \
00428 } while (0)
00429 
00430 #else
00431 
00432 #define permFail(msg) \
00433 do { \
00434     std::cout << "Internal error: " << msg << std::endl; \
00435     assert(false); \
00436     throw 0; \
00437 } while (0)
00438 
00439 #endif
00440 
00441 // REVIEW: JK 1/19/2006: Replace with cpu_to_be64(x) ?
00442 // Network to Host conversion for 64 bit quantities
00443 #define ntohll(x) (((uint64_t) ntohl((uint32_t) (x)) << 32)\
00444                     | ntohl((uint32_t) (x >> 32)))
00445 
00446 #define htonll(x) ntohll(x)
00447 
00448 // Asynchronous I/O API selection
00449 
00450 #if defined(HAVE_LIBAIO_H) && defined(HAVE_LIBAIO)
00451 #define USE_LIBAIO_H
00452 #elif HAVE_AIO_H
00453 #define USE_AIO_H
00454 #endif
00455 
00456 FENNEL_END_NAMESPACE
00457 
00458 #endif
00459 
00460 // End CommonPreamble.h

Generated on Mon Jun 22 04:00:18 2009 for Fennel by  doxygen 1.5.1