/[svn]/linuxsampler/trunk/src/common/Pool.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/common/Pool.h

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

revision 554 by schoenebeck, Thu May 19 19:25:14 2005 UTC revision 2335 by persson, Sat Mar 17 06:19:01 2012 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 Christian Schoenebeck                              *   *   Copyright (C) 2005 - 2012 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
9   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 44  Line 44 
44  const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated";  const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated";
45  #endif // CONFIG_DEVMODE  #endif // CONFIG_DEVMODE
46    
47    const std::string __err_msg_resize_while_in_use = "Pool::resizePool() ERROR: elements still in use!";
48    
49  // just symbol prototyping  // just symbol prototyping
50  template<typename T> class Pool;  template<typename T> class Pool;
51  template<typename T> class RTList;  template<typename T> class RTList;
# Line 260  class RTListBase { Line 262  class RTListBase {
262              return _begin.next == &_end;              return _begin.next == &_end;
263          }          }
264    
265            inline int count() {
266                int elements = 0;
267                for (Iterator it = first(); it != end(); ++it) ++elements;
268                return elements;
269            }
270    
271      protected:      protected:
272          Node _begin; // fake node (without data) which represents the begin of the list - not the first element!          Node _begin; // fake node (without data) which represents the begin of the list - not the first element!
273          Node _end;   // fake node (without data) which represents the end of the list - not the last element!          Node _end;   // fake node (without data) which represents the end of the list - not the last element!
274    
275          RTListBase() {          RTListBase() {
276                init();
277            }
278    
279            void init() {
280              // initialize boundary nodes              // initialize boundary nodes
281              _begin.prev = &_begin;              _begin.prev = &_begin;
282              _begin.next = &_end;              _begin.next = &_end;
# Line 369  class RTList : public RTListBase<T> { Line 381  class RTList : public RTListBase<T> {
381          RTList(Pool<T>* pPool) : RTListBase<T>::RTListBase() {          RTList(Pool<T>* pPool) : RTListBase<T>::RTListBase() {
382              this->pPool = pPool;              this->pPool = pPool;
383          }          }
384            
385            /**
386             * Copy constructor
387             */
388            RTList(RTList<T>& list) : RTListBase<T>::RTListBase() {
389                this->pPool = list.pPool;
390                Iterator it = list.first();
391                Iterator end = list.end();
392                for(; it != end; ++it) {
393                    if (poolIsEmpty()) break;
394                    *(allocAppend()) = *it;
395                }
396            }
397    
398          virtual ~RTList() {          virtual ~RTList() {
399              clear();              clear();
# Line 381  class RTList : public RTListBase<T> { Line 406  class RTList : public RTListBase<T> {
406          inline Iterator allocAppend() {          inline Iterator allocAppend() {
407              if (pPool->poolIsEmpty()) return RTListBase<T>::begin();              if (pPool->poolIsEmpty()) return RTListBase<T>::begin();
408              Iterator element = pPool->alloc();              Iterator element = pPool->alloc();
409              append(element);              this->append(element);
410              #if CONFIG_DEVMODE              #if CONFIG_DEVMODE
411              element.list = this;              element.list = this;
412              #endif // CONFIG_DEVMODE              #endif // CONFIG_DEVMODE
# Line 426  class Pool : public RTList<T> { Line 451  class Pool : public RTList<T> {
451          Node*         nodes;          Node*         nodes;
452          T*            data;          T*            data;
453          RTListBase<T> freelist; // not yet allocated elements          RTListBase<T> freelist; // not yet allocated elements
454            int           poolsize;
455    
456          Pool(int Elements) : RTList<T>::RTList(this) {          Pool(int Elements) : RTList<T>::RTList(this) {
457              data  = new T[Elements];              _init(Elements);
             nodes = new Node[Elements];  
             for (int i = 0; i < Elements; i++) {  
                 nodes[i].data = &data[i];  
                 freelist.append(&nodes[i]);  
             }  
458          }          }
459    
460          virtual ~Pool() {          virtual ~Pool() {
# Line 445  class Pool : public RTList<T> { Line 466  class Pool : public RTList<T> {
466              return freelist.isEmpty();              return freelist.isEmpty();
467          }          }
468    
469            /**
470             * Returns the current size of the pool, that is the amount of
471             * pre-allocated elements from the operating system. It equals the
472             * amount of elements given to the constructor unless resizePool()
473             * is called.
474             *
475             * @see resizePool()
476             */
477            int poolSize() const {
478                return poolsize;
479            }
480    
481            /**
482             * Alters the amount of elements to be pre-allocated from the
483             * operating system for this pool object.
484             *
485             * @e CAUTION: you MUST free all elements in use before calling this
486             * method ( e.g. by calling clear() )! Also make sure that no
487             * references of elements before this call will still be used after this
488             * call, since all elements will be reallocated and their old memory
489             * addresses become invalid!
490             *
491             * @see poolSize()
492             */
493            void resizePool(int Elements) {
494                if (freelist.count() != poolsize) {
495                    #if CONFIG_DEVMODE
496                    throw std::runtime_error(__err_msg_resize_while_in_use);
497                    #else
498                    std::cerr << __err_msg_resize_while_in_use << std::endl << std::flush;
499                    // if we're here something's terribly wrong, but we try to do the best
500                    RTList<T>::clear();
501                    #endif
502                }
503                if (nodes) delete[] nodes;
504                if (data)  delete[] data;
505                freelist.init();
506                RTListBase<T>::init();
507                _init(Elements);
508            }
509    
510      protected:      protected:
511          // caution: assumes pool (that is freelist) is not empty!          // caution: assumes pool (that is freelist) is not empty!
512          inline Iterator alloc() {          inline Iterator alloc() {
# Line 462  class Pool : public RTList<T> { Line 524  class Pool : public RTList<T> {
524          }          }
525    
526          friend class RTList<T>;          friend class RTList<T>;
527    
528        private:
529            void _init(int Elements) {
530                data  = new T[Elements];
531                nodes = new Node[Elements];
532                for (int i = 0; i < Elements; i++) {
533                    nodes[i].data = &data[i];
534                    freelist.append(&nodes[i]);
535                }
536                poolsize = Elements;
537            }
538  };  };
539    
540  #endif // __LS_POOL_H__  #endif // __LS_POOL_H__

Legend:
Removed from v.554  
changed lines
  Added in v.2335

  ViewVC Help
Powered by ViewVC