greenplumn CJobFactory 源码
greenplumn CJobFactory 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/search/CJobFactory.h
//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2011 EMC Corp.
//
//	@filename:
//		CJobFactory.h
//
//	@doc:
//		Highly concurrent job factory;
//		Uses bulk memory allocation and atomic primitives to
//		create and recycle jobs with minimal sychronization;
//---------------------------------------------------------------------------
#ifndef GPOPT_CJobFactory_H
#define GPOPT_CJobFactory_H
#include "gpos/base.h"
#include "gpos/common/CSyncPool.h"
#include "gpopt/search/CJob.h"
#include "gpopt/search/CJobGroupExploration.h"
#include "gpopt/search/CJobGroupExpressionExploration.h"
#include "gpopt/search/CJobGroupExpressionImplementation.h"
#include "gpopt/search/CJobGroupExpressionOptimization.h"
#include "gpopt/search/CJobGroupImplementation.h"
#include "gpopt/search/CJobGroupOptimization.h"
#include "gpopt/search/CJobTest.h"
#include "gpopt/search/CJobTransformation.h"
namespace gpopt
{
using namespace gpos;
//---------------------------------------------------------------------------
//	@class:
//		CJobFactory
//
//	@doc:
//		Highly concurrent job factory
//
//		The factory uses bulk memory allocation to create and recycle jobs with
//		minimal synchronization. The factory maintains a lock-free list defined
//		by the class CSyncPool for each job type. This allows concurrent
//		retrieval of jobs from the lists without the need for synchronization
//		through heavy locking operations.
//		A lock-free list is pre-allocated as an array of given size. The
//		allocation of lock-free lists happens lazily when the first job of a
//		given type is created.
//		Each job is given a unique id. When a job needs to be retrieved from
//		the list, atomic operations are used to reserve a free job object and
//		return it to the caller.
//
//---------------------------------------------------------------------------
class CJobFactory
{
private:
	// memory pool
	CMemoryPool *m_mp;
	// number of jobs in each pool
	const ULONG m_ulJobs;
	// container for testing jobs
	CSyncPool<CJobTest> *m_pspjTest;
	// container for group optimization jobs
	CSyncPool<CJobGroupOptimization> *m_pspjGroupOptimization;
	// container for group implementation jobs
	CSyncPool<CJobGroupImplementation> *m_pspjGroupImplementation;
	// container for group exploration jobs
	CSyncPool<CJobGroupExploration> *m_pspjGroupExploration;
	// container for group expression optimization jobs
	CSyncPool<CJobGroupExpressionOptimization>
		*m_pspjGroupExpressionOptimization;
	// container for group expression implementation jobs
	CSyncPool<CJobGroupExpressionImplementation>
		*m_pspjGroupExpressionImplementation;
	// container for group expression exploration jobs
	CSyncPool<CJobGroupExpressionExploration> *m_pspjGroupExpressionExploration;
	// container for transformation jobs
	CSyncPool<CJobTransformation> *m_pspjTransformation;
	// retrieve job of specific type
	template <class T>
	T *
	PtRetrieve(CSyncPool<T> *&pspt)
	{
		if (nullptr == pspt)
		{
			pspt = GPOS_NEW(m_mp) CSyncPool<T>(m_mp, m_ulJobs);
			pspt->Init(GPOS_OFFSET(T, m_id));
		}
		return pspt->PtRetrieve();
	}
	// release job
	template <class T>
	void
	Release(T *pt, CSyncPool<T> *pspt)
	{
		GPOS_ASSERT(nullptr != pt);
		GPOS_ASSERT(nullptr != pspt);
		pspt->Recycle(pt);
	}
	// truncate job pool
	template <class T>
	void
	TruncatePool(CSyncPool<T> *&pspt)
	{
		GPOS_DELETE(pspt);
		pspt = nullptr;
	}
public:
	CJobFactory(const CJobFactory &) = delete;
	// ctor
	CJobFactory(CMemoryPool *mp, ULONG ulJobs);
	// dtor
	~CJobFactory();
	// create job of specific type
	CJob *PjCreate(CJob::EJobType ejt);
	// release completed job
	void Release(CJob *pj);
	// truncate the container for the specific job type
	void Truncate(CJob::EJobType ejt);
};	// class CJobFactory
}  // namespace gpopt
#endif	// !GPOPT_CJobFactory_H
// EOF
相关信息
相关文章
greenplumn CGroupExpression 源码
greenplumn CJobGroupExploration 源码
greenplumn CJobGroupExpression 源码
                        
                            0
                        
                        
                             赞
                        
                    
                    
                热门推荐
- 
                        2、 - 优质文章
 - 
                        3、 gate.io
 - 
                        7、 openharmony
 - 
                        9、 golang