greenplumn CJobFactory 源码

  • 2022-08-18
  • 浏览 (11)

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 源码目录

相关文章

greenplumn CBinding 源码

greenplumn CGroup 源码

greenplumn CGroupExpression 源码

greenplumn CGroupProxy 源码

greenplumn CJob 源码

greenplumn CJobGroup 源码

greenplumn CJobGroupExploration 源码

greenplumn CJobGroupExpression 源码

greenplumn CJobGroupExpressionExploration 源码

greenplumn CJobGroupExpressionImplementation 源码

0  赞