Currently job artifacts in CI/CD pipelines on LRZ GitLab never expire. Starting from Wed 26.1.2022 the default expiration time will be 30 days (GitLab default). Currently existing artifacts in already completed jobs will not be affected by the change. The latest artifacts for all jobs in the latest successful pipelines will be kept. More information: https://gitlab.lrz.de/help/user/admin_area/settings/continuous_integration.html#default-artifacts-expiration

Commit 215b212e authored by Christian Schulte zu Berge's avatar Christian Schulte zu Berge
Browse files

Refactoring pipeline concept #1: Rename VisualizationPipeline to AutoEvaluationPipeline

parent 53ba5fe9
......@@ -49,7 +49,7 @@
#include "core/tools/simplejobprocessor.h"
#include "core/tools/quadrenderer.h"
#include "core/pipeline/abstractpipeline.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
namespace campvis {
......@@ -78,7 +78,7 @@ namespace campvis {
tgtAssert(_initialized == false, "Destructing initialized CampVisApplication, deinitialize first!");
// delete everything in the right order:
for (std::vector< std::pair<VisualizationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
for (std::vector< std::pair<AutoEvaluationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
delete it->second;
}
for (std::vector<AbstractPipeline*>::iterator it = _pipelines.begin(); it != _pipelines.end(); ++it) {
......@@ -167,7 +167,7 @@ namespace campvis {
}
// Now init painters:
for (std::vector< std::pair<VisualizationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
for (std::vector< std::pair<AutoEvaluationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
it->second->init();
}
......@@ -190,7 +190,7 @@ namespace campvis {
}
// Now deinit painters:
for (std::vector< std::pair<VisualizationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
for (std::vector< std::pair<AutoEvaluationPipeline*, CampVisPainter*> >::iterator it = _visualizations.begin(); it != _visualizations.end(); ++it) {
it->second->deinit();
}
......@@ -243,7 +243,7 @@ namespace campvis {
s_PipelinesChanged();
}
void CampVisApplication::addVisualizationPipeline(const std::string& name, VisualizationPipeline* vp) {
void CampVisApplication::addVisualizationPipeline(const std::string& name, AutoEvaluationPipeline* vp) {
tgtAssert(_initialized == false, "Adding pipelines after initialization is currently not supported.");
tgtAssert(vp != 0, "Pipeline must not be 0.");
......
......@@ -46,7 +46,7 @@ namespace campvis {
class AbstractPipeline;
class MainWindow;
class CampVisPainter;
class VisualizationPipeline;
class AutoEvaluationPipeline;
/**
* The CampVisApplication class wraps Pipelines, Evaluators and Painters all together and takes
......@@ -105,9 +105,9 @@ namespace campvis {
*
* \note You do \b not need to call addPipeline.
* \param name Name of the OpenGL context to create for the pipeline.
* \param vp VisualizationPipeline to add.
* \param vp AutoEvaluationPipeline to add.
*/
void addVisualizationPipeline(const std::string& name, VisualizationPipeline* vp);
void addVisualizationPipeline(const std::string& name, AutoEvaluationPipeline* vp);
/**
* Adds a dock widget to the main window.
......@@ -132,7 +132,7 @@ namespace campvis {
/// All pipelines (incuding VisualizationPipelines)
std::vector<AbstractPipeline*> _pipelines;
/// All visualisations (i.e. VisualizationPipelines with their corresponding painters/canvases)
std::vector< std::pair<VisualizationPipeline*, CampVisPainter*> > _visualizations;
std::vector< std::pair<AutoEvaluationPipeline*, CampVisPainter*> > _visualizations;
/// A local OpenGL context used for initialization
tgt::QtThreadedCanvas* _localContext;
......
......@@ -41,7 +41,7 @@
#include "core/datastructures/imagedata.h"
#include "core/datastructures/renderdata.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
#include "core/tools/job.h"
#include "core/tools/opengljobprocessor.h"
#include "core/tools/quadrenderer.h"
......@@ -49,7 +49,7 @@
namespace campvis {
const std::string CampVisPainter::loggerCat_ = "CAMPVis.core.CampVisPainter";
CampVisPainter::CampVisPainter(tgt::GLCanvas* canvas, VisualizationPipeline* pipeline)
CampVisPainter::CampVisPainter(tgt::GLCanvas* canvas, AutoEvaluationPipeline* pipeline)
: Runnable()
, tgt::Painter(canvas)
, _pipeline(0)
......@@ -175,7 +175,7 @@ namespace campvis {
}
}
void CampVisPainter::setPipeline(VisualizationPipeline* pipeline) {
void CampVisPainter::setPipeline(AutoEvaluationPipeline* pipeline) {
tgtAssert(pipeline != 0, "The given pipeline must not be 0.");
if (_pipeline != 0) {
_pipeline->s_renderTargetChanged.disconnect(this);
......
......@@ -44,16 +44,16 @@ namespace tgt {
}
namespace campvis {
class VisualizationPipeline;
class AutoEvaluationPipeline;
/**
* Painter class for CAMPVis, rendering the render target of a VisualizationPipeline.
* Painter class for CAMPVis, rendering the render target of a AutoEvaluationPipeline.
* This painter implements Runnable, hence, it runs in its own thread and the associated canvas
* must be of type QtThreadedCanvas.
* Rendering is implemented using condidional wait - hence the canvas is only updated when
* \a pipeline emits the s_RenderTargetChanged signal.
*
* \sa Runnable, VisualizationPipeline
* \sa Runnable, AutoEvaluationPipeline
*/
class CampVisPainter : public Runnable, public tgt::Painter, public sigslot::has_slots<> {
public:
......@@ -62,7 +62,7 @@ namespace campvis {
* \param canvas Canvas to render on
* \param pipeline Pipeline to render
*/
CampVisPainter(tgt::GLCanvas* canvas, VisualizationPipeline* pipeline);
CampVisPainter(tgt::GLCanvas* canvas, AutoEvaluationPipeline* pipeline);
/**
* Destructor, stops and waits for the rendering thread if it's still running.
......@@ -106,7 +106,7 @@ namespace campvis {
* Pipeline with the render target to render.
* \param pipeline Pipeline to render
*/
void setPipeline(VisualizationPipeline* pipeline);
void setPipeline(AutoEvaluationPipeline* pipeline);
/**
* Slot being notified when the pipeline's render target changed.
......@@ -121,7 +121,7 @@ namespace campvis {
static const std::string loggerCat_;
VisualizationPipeline* _pipeline; ///< Pipeline to render
AutoEvaluationPipeline* _pipeline; ///< Pipeline to render
tgt::Shader* _copyShader; ///< Shader for copying the render target to the framebuffer.
tbb::atomic<bool> _dirty; ///< Flag whether render result is dirty and needs to be rerendered.
std::condition_variable _renderCondition; ///< conditional wait condition for rendering
......
......@@ -27,7 +27,7 @@
//
// ================================================================================================
#include "visualizationpipeline.h"
#include "autoevaluationpipeline.h"
#include "tgt/tgt_gl.h"
#include "tgt/glcanvas.h"
#include "tgt/glcontext.h"
......@@ -57,27 +57,27 @@ namespace {
}
namespace campvis {
const std::string VisualizationPipeline::loggerCat_ = "CAMPVis.core.datastructures.VisualizationPipeline";
const std::string AutoEvaluationPipeline::loggerCat_ = "CAMPVis.core.datastructures.AutoEvaluationPipeline";
VisualizationPipeline::VisualizationPipeline()
AutoEvaluationPipeline::AutoEvaluationPipeline()
: AbstractPipeline()
, tgt::EventHandler()
, tgt::EventListener()
, _ignoreCanvasSizeUpdate(false)
, _canvasSize("CanvasSize", "Canvas Size", tgt::ivec2(128, 128), tgt::ivec2(1, 1), tgt::ivec2(4096, 4096))
, _renderTargetID("renderTargetID", "Render Target ID", "VisualizationPipeline.renderTarget", DataNameProperty::READ)
, _renderTargetID("renderTargetID", "Render Target ID", "AutoEvaluationPipeline.renderTarget", DataNameProperty::READ)
, _canvas(0)
{
_data.s_dataAdded.connect(this, &VisualizationPipeline::onDataContainerDataAdded);
_data.s_dataAdded.connect(this, &AutoEvaluationPipeline::onDataContainerDataAdded);
addProperty(&_renderTargetID);
addProperty(&_canvasSize);
_renderTargetID.s_changed.connect<VisualizationPipeline>(this, &VisualizationPipeline::onPropertyChanged);
_renderTargetID.s_changed.connect<AutoEvaluationPipeline>(this, &AutoEvaluationPipeline::onPropertyChanged);
}
VisualizationPipeline::~VisualizationPipeline() {
AutoEvaluationPipeline::~AutoEvaluationPipeline() {
}
void VisualizationPipeline::onEvent(tgt::Event* e) {
void AutoEvaluationPipeline::onEvent(tgt::Event* e) {
// copy and paste from tgt::EventHandler::onEvent() but without deleting e
for (size_t i = 0 ; i < listeners_.size() ; ++i) {
// check if current listener listens to the eventType of e
......@@ -89,50 +89,50 @@ namespace campvis {
}
}
void VisualizationPipeline::init() {
void AutoEvaluationPipeline::init() {
AbstractPipeline::init();
}
void VisualizationPipeline::deinit() {
void AutoEvaluationPipeline::deinit() {
_data.s_dataAdded.disconnect(this);
_renderTargetID.s_changed.disconnect(this);
AbstractPipeline::deinit();
}
const tgt::ivec2& VisualizationPipeline::getRenderTargetSize() const {
const tgt::ivec2& AutoEvaluationPipeline::getRenderTargetSize() const {
return _canvasSize.getValue();
}
void VisualizationPipeline::setRenderTargetSize(const tgt::ivec2& size) {
void AutoEvaluationPipeline::setRenderTargetSize(const tgt::ivec2& size) {
if (_canvasSize.getValue() != size && !_ignoreCanvasSizeUpdate) {
_canvasSize.setValue(size);
}
}
void VisualizationPipeline::onDataContainerDataAdded(const std::string& name, const DataHandle& dh) {
void AutoEvaluationPipeline::onDataContainerDataAdded(const std::string& name, const DataHandle& dh) {
if (name == _renderTargetID.getValue()) {
s_renderTargetChanged();
}
}
const std::string& VisualizationPipeline::getRenderTargetID() const {
const std::string& AutoEvaluationPipeline::getRenderTargetID() const {
return _renderTargetID.getValue();
}
void VisualizationPipeline::lockGLContextAndExecuteProcessor(AbstractProcessor* processor) {
void AutoEvaluationPipeline::lockGLContextAndExecuteProcessor(AbstractProcessor* processor) {
tgtAssert(_canvas != 0, "Set a valid canvas before calling this method!");
GLJobProc.enqueueJob(
_canvas,
makeJobOnHeap<VisualizationPipeline, AbstractProcessor*, bool>(this, &VisualizationPipeline::executeProcessor, processor, true),
makeJobOnHeap<AutoEvaluationPipeline, AbstractProcessor*, bool>(this, &AutoEvaluationPipeline::executeProcessor, processor, true),
OpenGLJobProcessor::SerialJob);
}
void VisualizationPipeline::setCanvas(tgt::GLCanvas* canvas) {
void AutoEvaluationPipeline::setCanvas(tgt::GLCanvas* canvas) {
_canvas = canvas;
}
void VisualizationPipeline::onPropertyChanged(const AbstractProperty* prop) {
void AutoEvaluationPipeline::onPropertyChanged(const AbstractProperty* prop) {
if (prop == &_renderTargetID)
s_renderTargetChanged();
else if (prop == &_canvasSize && _canvas != 0 && !_ignoreCanvasSizeUpdate) {
......@@ -146,7 +146,7 @@ namespace campvis {
AbstractPipeline::onPropertyChanged(prop);
}
void VisualizationPipeline::onProcessorInvalidated(AbstractProcessor* processor) {
void AutoEvaluationPipeline::onProcessorInvalidated(AbstractProcessor* processor) {
if (_canvas == 0)
return;
......@@ -156,11 +156,11 @@ namespace campvis {
// is VisualizationProcessor
GLJobProc.enqueueJob(
_canvas,
makeJobOnHeap<VisualizationPipeline, AbstractProcessor*>(this, &VisualizationPipeline::executeProcessorAndCheckOpenGLState, processor),
makeJobOnHeap<AutoEvaluationPipeline, AbstractProcessor*>(this, &AutoEvaluationPipeline::executeProcessorAndCheckOpenGLState, processor),
OpenGLJobProcessor::SerialJob);
}
else {
SimpleJobProc.enqueueJob(makeJob<VisualizationPipeline, AbstractProcessor*, bool>(this, &VisualizationPipeline::executeProcessor, processor, false));
SimpleJobProc.enqueueJob(makeJob<AutoEvaluationPipeline, AbstractProcessor*, bool>(this, &AutoEvaluationPipeline::executeProcessor, processor, false));
}
}
else {
......@@ -169,12 +169,12 @@ namespace campvis {
}
}
void VisualizationPipeline::addProcessor(AbstractProcessor* processor) {
void AutoEvaluationPipeline::addProcessor(AbstractProcessor* processor) {
_isVisProcessorMap.insert(std::make_pair(processor, (dynamic_cast<VisualizationProcessor*>(processor) != 0)));
AbstractPipeline::addProcessor(processor);
}
void VisualizationPipeline::executeProcessorAndCheckOpenGLState(AbstractProcessor* processor) {
void AutoEvaluationPipeline::executeProcessorAndCheckOpenGLState(AbstractProcessor* processor) {
AbstractPipeline::executeProcessor(processor, true);
#ifdef CAMPVIS_DEBUG
......
......@@ -52,17 +52,17 @@ namespace campvis {
* Abstract base class for CAMPVis Pipelines.
*
*/
class VisualizationPipeline : public AbstractPipeline, public tgt::EventHandler, public tgt::EventListener {
class AutoEvaluationPipeline : public AbstractPipeline, public tgt::EventHandler, public tgt::EventListener {
public:
/**
* Creates a VisualizationPipeline.
* Creates a AutoEvaluationPipeline.
*/
VisualizationPipeline();
AutoEvaluationPipeline();
/**
* Virtual Destructor
**/
virtual ~VisualizationPipeline();
virtual ~AutoEvaluationPipeline();
/**
......
......@@ -79,7 +79,7 @@ namespace campvis {
// ================================================================================================
DigraphVisualizationPipeline::DigraphVisualizationPipeline()
: VisualizationPipeline()
: AutoEvaluationPipeline()
{
}
......@@ -95,7 +95,7 @@ namespace campvis {
tgtAssert(processor != 0, "Processor must not be 0!");
// add processor to processor list and connect signals
VisualizationPipeline::addProcessor(processor);
AutoEvaluationPipeline::addProcessor(processor);
processor->s_invalidated.connect<DigraphVisualizationPipeline>(this, &DigraphVisualizationPipeline::onProcessorInvalidated);
// create DependencyNode
......
......@@ -33,7 +33,7 @@
#include "sigslot/sigslot.h"
#include "tgt/vector.h"
#include "tgt/event/eventlistener.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
#include "core/properties/genericproperty.h"
#include <map>
......@@ -43,12 +43,12 @@ namespace campvis {
class VisualizationProcessor;
/**
* Specialization of the VisualizationPipeline that performs automatic evaluation based on
* Specialization of the AutoEvaluationPipeline that performs automatic evaluation based on
* an acyclic directed dependency graph.
*
* \todo Implement thread-safety. The current graph implementation is \b not thread-safe.
*/
class DigraphVisualizationPipeline : public VisualizationPipeline {
class DigraphVisualizationPipeline : public AutoEvaluationPipeline {
public:
/**
* Creates a DigraphVisualizationPipeline.
......
......@@ -88,7 +88,7 @@ namespace campvis {
}
void AdvancedUsVis::init() {
VisualizationPipeline::init();
AutoEvaluationPipeline::init();
_usReader.s_validated.connect(this, &AdvancedUsVis::onProcessorValidated);
......@@ -197,7 +197,7 @@ namespace campvis {
void AdvancedUsVis::deinit() {
_canvasSize.s_changed.disconnect(this);
VisualizationPipeline::deinit();
AutoEvaluationPipeline::deinit();
}
void AdvancedUsVis::execute() {
......
......@@ -51,7 +51,7 @@
namespace campvis {
CmBatchGeneration::CmBatchGeneration()
: VisualizationPipeline()
: AutoEvaluationPipeline()
, _usReader(&_canvasSize)
, _confidenceGenerator()
, _usBlurFilter()
......@@ -80,7 +80,7 @@ namespace campvis {
}
void CmBatchGeneration::init() {
VisualizationPipeline::init();
AutoEvaluationPipeline::init();
p_sourcePath.setValue("D:\\Medical Data\\US Confidence Vis\\Pasing 13-02-26\\04-02-22-212506_Perez11_20040222_212506_20040222_220332\\gallenblase");
p_targetPathColor.setValue("D:\\Medical Data\\US Confidence Vis\\Pasing 13-02-26\\04-02-22-212506_Perez11_20040222_212506_20040222_220332\\gallenblase\\color");
......@@ -124,7 +124,7 @@ namespace campvis {
}
void CmBatchGeneration::deinit() {
VisualizationPipeline::deinit();
AutoEvaluationPipeline::deinit();
}
void CmBatchGeneration::execute() {
......@@ -143,7 +143,7 @@ namespace campvis {
void CmBatchGeneration::onProcessorInvalidated(AbstractProcessor* processor) {
if (p_autoExecution.getValue())
VisualizationPipeline::onProcessorInvalidated(processor);
AutoEvaluationPipeline::onProcessorInvalidated(processor);
}
void CmBatchGeneration::executePass(int path) {
......
......@@ -31,7 +31,7 @@
#define CMBATCHGENERATION_H__
#include "core/datastructures/imagerepresentationlocal.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
#include "modules/devil/processors/devilimagereader.h"
#include "modules/io/processors/mhdimagereader.h"
#include "modules/io/processors/csvdimagereader.h"
......@@ -49,10 +49,10 @@
#include "core/properties/genericproperty.h"
namespace campvis {
class CmBatchGeneration : public VisualizationPipeline {
class CmBatchGeneration : public AutoEvaluationPipeline {
public:
/**
* Creates a VisualizationPipeline.
* Creates a AutoEvaluationPipeline.
*/
CmBatchGeneration();
......@@ -61,10 +61,10 @@ namespace campvis {
**/
virtual ~CmBatchGeneration();
/// \see VisualizationPipeline::init()
/// \see AutoEvaluationPipeline::init()
virtual void init();
/// \see VisualizationPipeline::deinit()
/// \see AutoEvaluationPipeline::deinit()
virtual void deinit();
/// \see AbstractPipeline::getName()
......
......@@ -40,7 +40,7 @@
namespace campvis {
Columbia1::Columbia1()
: VisualizationPipeline()
: AutoEvaluationPipeline()
, _camera("camera", "Camera")
, _boundsData("BoundsData", "Bounds Data", "sfr", DataNameProperty::READ)
, _imageReader()
......@@ -88,7 +88,7 @@ namespace campvis {
}
void Columbia1::init() {
VisualizationPipeline::init();
AutoEvaluationPipeline::init();
_imageSplitter.s_validated.connect(this, &Columbia1::onProcessorValidated);
......@@ -148,7 +148,7 @@ namespace campvis {
void Columbia1::deinit() {
_canvasSize.s_changed.disconnect(this);
VisualizationPipeline::deinit();
AutoEvaluationPipeline::deinit();
}
const std::string Columbia1::getName() const {
......
......@@ -31,7 +31,7 @@
#define COLUMBIA1_H__
#include "core/eventhandlers/trackballnavigationeventlistener.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
#include "core/properties/cameraproperty.h"
......@@ -48,10 +48,10 @@
#include "modules/vis/processors/volumerenderer.h"
namespace campvis {
class Columbia1 : public VisualizationPipeline {
class Columbia1 : public AutoEvaluationPipeline {
public:
/**
* Creates a VisualizationPipeline.
* Creates a AutoEvaluationPipeline.
*/
Columbia1();
......@@ -60,10 +60,10 @@ namespace campvis {
**/
virtual ~Columbia1();
/// \see VisualizationPipeline::init()
/// \see AutoEvaluationPipeline::init()
virtual void init();
/// \see VisualizationPipeline::deinit()
/// \see AutoEvaluationPipeline::deinit()
virtual void deinit();
/// \see AbstractPipeline::getName()
......
......@@ -32,16 +32,16 @@
#include "tgt/assert.h"
#include <itkImage.h>
#include <itkImportImageFilter.h>
#include <itkImageRegionConstIterator.h>
#include <itkRGBPixel.h>
#include "core/tools/typetraits.h"
#include "core/datastructures/imagedata.h"
#include "core/datastructures/imagerepresentationlocal.h"
#include "core/datastructures/genericimagerepresentationlocal.h"
#include <itkImage.h>
#include <itkImportImageFilter.h>
#include <itkImageRegionConstIterator.h>
#include <itkRGBPixel.h>
#include <cstring> // memcpy
namespace campvis {
......
......@@ -41,7 +41,7 @@
namespace campvis {
OpenCLPipeline::OpenCLPipeline()
: VisualizationPipeline()
: AutoEvaluationPipeline()
, _camera("camera", "Camera")
, _imageReader()
, _pgGenerator()
......@@ -66,7 +66,7 @@ namespace campvis {
}
void OpenCLPipeline::init() {
VisualizationPipeline::init();
AutoEvaluationPipeline::init();
_camera.addSharedProperty(&_eepGenerator.p_camera);
_camera.addSharedProperty(&_clRaycaster._camera);
......@@ -98,7 +98,7 @@ namespace campvis {
void OpenCLPipeline::deinit() {
_canvasSize.s_changed.disconnect(this);
VisualizationPipeline::deinit();
AutoEvaluationPipeline::deinit();
}
const std::string OpenCLPipeline::getName() const {
......
......@@ -32,7 +32,7 @@
#include "core/datastructures/imagerepresentationlocal.h"
#include "core/eventhandlers/trackballnavigationeventlistener.h"
#include "core/pipeline/visualizationpipeline.h"
#include "core/pipeline/autoevaluationpipeline.h"
#include "core/properties/cameraproperty.h"
#include "modules/io/processors/mhdimagereader.h"
#include "modules/vis/processors/proxygeometrygenerator.h"
......@@ -40,10 +40,10 @@
#include "modules/opencl/processors/clraycaster.h"
namespace campvis {
class OpenCLPipeline : public VisualizationPipeline {
class OpenCLPipeline : public AutoEvaluationPipeline {
public:
/**
* Creates a VisualizationPipeline.
* Creates a AutoEvaluationPipeline.
*/
OpenCLPipeline();
......@@ -52,9 +52,9 @@ namespace campvis {
**/
virtual ~OpenCLPipeline();
/// \see VisualizationPipeline::init()
/// \see AutoEvaluationPipeline::init()
virtual void init();
/// \see VisualizationPipeline::deinit()
/// \see AutoEvaluationPipeline::deinit()
virtual void deinit();
/// \see AbstractPipeline::getName()
......
......@@ -34,7 +34,7 @@ namespace campvis {
UsCompounding::UsCompounding()
: VisualizationPipeline()
: AutoEvaluationPipeline()
, p_camera("Camera", "Camera")
, _reader()
, _renderer(&_canvasSize)
......@@ -54,7 +54,7 @@ namespace campvis {
}
void UsCompounding::init() {
VisualizationPipeline::init();
AutoEvaluationPipeline::init();
p_camera.addSharedProperty(&_renderer.p_camera);
......@@ -68,7 +68,7 @@ namespace campvis {
void UsCompounding::deinit() {
_canvasSize.s_changed.disconnect(this);
VisualizationPipeline::deinit();
AutoEvaluationPipeline::deinit();
}