diff options
author | Tom Rondeau <tom@trondeau.com> | 2015-02-26 14:35:26 -0500 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2015-02-26 14:35:26 -0500 |
commit | e5646398bd8d05f6bbffd0f18710f5d8e53df4b4 (patch) | |
tree | 117a026783f77905f2989b292e4dc2f6001d45a0 | |
parent | 5fd3e3f85fbf797183e9d506aa43397ca91085cd (diff) |
pmt: moves the rest of the PMT constants from static globals to using get_ functions.
-rw-r--r-- | gnuradio-runtime/include/pmt/pmt.h | 25 | ||||
-rw-r--r-- | gnuradio-runtime/lib/pmt/pmt.cc | 62 | ||||
-rw-r--r-- | gnuradio-runtime/python/pmt/__init__.py | 3 | ||||
-rw-r--r-- | gnuradio-runtime/swig/pmt_swig.i | 12 |
4 files changed, 75 insertions, 27 deletions
diff --git a/gnuradio-runtime/include/pmt/pmt.h b/gnuradio-runtime/include/pmt/pmt.h index cb6fdf44d5..f601c85348 100644 --- a/gnuradio-runtime/include/pmt/pmt.h +++ b/gnuradio-runtime/include/pmt/pmt.h @@ -88,6 +88,25 @@ public: notimplemented(const std::string &msg, pmt_t obj); }; + +/* + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + +PMT_API pmt_t get_PMT_NIL(); +PMT_API pmt_t get_PMT_T(); +PMT_API pmt_t get_PMT_F(); +PMT_API pmt_t get_PMT_EOF(); + +#define PMT_NIL get_PMT_NIL() +#define PMT_T get_PMT_T() +#define PMT_F get_PMT_F() +#define PMT_EOF get_PMT_EOF() + + + /* * ------------------------------------------------------------------------ * Booleans. Two constants, #t and #f. @@ -96,8 +115,6 @@ public: * I.e., there is a single false value, #f. * ------------------------------------------------------------------------ */ -extern PMT_API const pmt_t PMT_T; //< \#t : boolean true constant -extern PMT_API const pmt_t PMT_F; //< \#f : boolean false constant //! Return true if obj is \#t or \#f, else return false. PMT_API bool is_bool(pmt_t obj); @@ -259,9 +276,6 @@ PMT_API std::complex<double> to_complex(pmt_t z); * ------------------------------------------------------------------------ */ -#define PMT_NIL get_PMT_NIL() -PMT_API pmt_t get_PMT_NIL(); - //! Return true if \p x is the empty list, otherwise return false. PMT_API bool is_null(const pmt_t& x); @@ -815,7 +829,6 @@ PMT_API bool list_has(pmt_t list, const pmt_t& item); * read / write * ------------------------------------------------------------------------ */ -extern PMT_API const pmt_t PMT_EOF; //< The end of file object //! return true if obj is the EOF object, otherwise return false. PMT_API bool is_eof_object(pmt_t obj); diff --git a/gnuradio-runtime/lib/pmt/pmt.cc b/gnuradio-runtime/lib/pmt/pmt.cc index da830e1aed..51fb86e58c 100644 --- a/gnuradio-runtime/lib/pmt/pmt.cc +++ b/gnuradio-runtime/lib/pmt/pmt.cc @@ -34,11 +34,16 @@ namespace pmt { -static const int CACHE_LINE_SIZE = 64; // good guess - # if (PMT_LOCAL_ALLOCATOR) -static pmt_pool global_pmt_pool(sizeof(pmt_pair), CACHE_LINE_SIZE); +static const int +get_cache_line_size() +{ + static const int CACHE_LINE_SIZE = 64; // good guess + return CACHE_LINE_SIZE; +} + +static pmt_pool global_pmt_pool(sizeof(pmt_pair), get_cache_line_size()); void * pmt_base::operator new(size_t size) @@ -46,7 +51,7 @@ pmt_base::operator new(size_t size) void *p = global_pmt_pool.malloc(); // fprintf(stderr, "pmt_base::new p = %p\n", p); - assert((reinterpret_cast<intptr_t>(p) & (CACHE_LINE_SIZE - 1)) == 0); + assert((reinterpret_cast<intptr_t>(p) & (get_cache_line_size() - 1)) == 0); return p; } @@ -158,14 +163,28 @@ _any(pmt_t x) // Globals //////////////////////////////////////////////////////////////////////////// -const pmt_t PMT_T = pmt_t(new pmt_bool()); // singleton -const pmt_t PMT_F = pmt_t(new pmt_bool()); // singleton -const pmt_t PMT_EOF = cons(PMT_NIL, PMT_NIL); // singleton - pmt_t get_PMT_NIL() { - static pmt_t NIL = pmt_t(new pmt_null()); - return NIL; + static pmt_t _NIL = pmt_t(new pmt_null()); + return _NIL; +} + +pmt_t get_PMT_T() +{ + static const pmt_t _T = pmt_t(new pmt_bool()); + return _T; +} + +pmt_t get_PMT_F() +{ + static const pmt_t _F = pmt_t(new pmt_bool()); + return _F; +} + +pmt_t get_PMT_EOF() +{ + static const pmt_t _EOF = cons(get_PMT_NIL(), get_PMT_NIL()); + return _EOF; } //////////////////////////////////////////////////////////////////////////// @@ -212,8 +231,19 @@ to_bool(pmt_t val) // Symbols //////////////////////////////////////////////////////////////////////////// -static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; -static std::vector<pmt_t> s_symbol_hash_table(SYMBOL_HASH_TABLE_SIZE); +static const unsigned int +get_symbol_hash_table_size() +{ + static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; + return SYMBOL_HASH_TABLE_SIZE; +} + +static std::vector<pmt_t>* +get_symbol_hash_table() +{ + static std::vector<pmt_t> s_symbol_hash_table(get_symbol_hash_table_size()); + return &s_symbol_hash_table; +} pmt_symbol::pmt_symbol(const std::string &name) : d_name(name){} @@ -244,18 +274,18 @@ is_symbol(const pmt_t& obj) pmt_t string_to_symbol(const std::string &name) { - unsigned hash = hash_string(name) % SYMBOL_HASH_TABLE_SIZE; + unsigned hash = hash_string(name) % get_symbol_hash_table_size(); // Does a symbol with this name already exist? - for (pmt_t sym = s_symbol_hash_table[hash]; sym; sym = _symbol(sym)->next()){ + for (pmt_t sym = (*get_symbol_hash_table())[hash]; sym; sym = _symbol(sym)->next()){ if (name == _symbol(sym)->name()) return sym; // Yes. Return it } // Nope. Make a new one. pmt_t sym = pmt_t(new pmt_symbol(name)); - _symbol(sym)->set_next(s_symbol_hash_table[hash]); - s_symbol_hash_table[hash] = sym; + _symbol(sym)->set_next((*get_symbol_hash_table())[hash]); + (*get_symbol_hash_table())[hash] = sym; return sym; } diff --git a/gnuradio-runtime/python/pmt/__init__.py b/gnuradio-runtime/python/pmt/__init__.py index 1c7db73322..399fae8701 100644 --- a/gnuradio-runtime/python/pmt/__init__.py +++ b/gnuradio-runtime/python/pmt/__init__.py @@ -51,6 +51,9 @@ except ImportError: # due to changes in the PMT_NIL singleton for static builds, we force # this into Python here. PMT_NIL = get_PMT_NIL() +PMT_T = get_PMT_T() +PMT_F = get_PMT_F() +PMT_EOF = get_PMT_EOF() from pmt_to_python import pmt_to_python as to_python from pmt_to_python import python_to_pmt as to_pmt diff --git a/gnuradio-runtime/swig/pmt_swig.i b/gnuradio-runtime/swig/pmt_swig.i index c4b678222d..2063a5c972 100644 --- a/gnuradio-runtime/swig/pmt_swig.i +++ b/gnuradio-runtime/swig/pmt_swig.i @@ -80,13 +80,15 @@ namespace pmt{ swig_int_ptr.__repr__ = lambda self: write_string(self) %} - - extern const pmt_t PMT_T; - extern const pmt_t PMT_F; - extern const pmt_t PMT_EOF; - pmt_t get_PMT_NIL(); + pmt_t get_PMT_T(); + pmt_t get_PMT_F(); + pmt_t get_PMT_EOF(); + #define PMT_NIL get_PMT_NIL() + #define PMT_T get_PMT_T() + #define PMT_F get_PMT_F() + #define PMT_EOF get_PMT_EOF() bool is_bool(pmt_t obj); bool is_true(pmt_t obj); |