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
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦