/* Network-Integrated Multimedia Middleware (NMM)
 * http://www.motama.com/nmm.html
 *  
 * Copyright (C) 2006-2007
 * Motama GmbH, Saarbruecken, Germany
 * http://www.motama.com
 *  
 * This file is part of NMM. 
 * 
 * NMM is free software; you can redistribute it and/or modify it    
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; only version 2 of the License.      
 * 
 * NMM is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 
 * License for more details.  
 * 
 * You should have received a copy of the GNU General Public License 
 * along with NMM; if not, write to the Free Software Foundation,    
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */
#ifndef NMM_THREADPOOL_HPP
#define NMM_THREADPOOL_HPP

#include "nmm/nmm_prefix.hpp"

#include "WorkerThread.hpp"
#include "nmm/utils/Singleton.hpp"

#include <list>

#include "visibility.hpp"

namespace NMM {

/** Provides a pool of threads. By default 3 threads or in more details instances of WorkerThread 
 * will be allocated that can be used by other objects.
 */
class DLLEXPORT ThreadPool 
{
  DECLARE_SINGLETON(ThreadPool, CreateUsingNew, DefaultLifetime, MultiThreaded);
  friend class CreateUsingNew<ThreadPool>;
  public:
   /** Requests a new Thread. If the ThreadPool has a free WorkerThread it returns it, otherwise a new thread is spawned.
    *
    * @return WorkerThread that provides a thread that can be used. 
    */
    WorkerThread* requestThread();

   /** Releases WorkerThread that is no longer used. 
    * 
    * @param thread pointer to WorkerThread that is no longer used and can be reused by other objects. 
    */
    void releaseThread( WorkerThread* thread);

  private:
   /** Constructor
    */
    ThreadPool();

   /** Destructor
    */
    ~ThreadPool();

   /** Copy Constructor
    */
    ThreadPool(const ThreadPool& );

  private:
    std::list<WorkerThread*> __thread_pool;
    ThreadMutex              __thread_mutex;
    ThreadCondition          __thread_condition;
    unsigned int             __allocated_threads;
    bool                     __notify;
};
  typedef ThreadPool::Singleton SThreadPool; 
}

#include "nmm/nmm_suffix.hpp"

#endif // NMM_THREADPOOL_HPP
