ExecutionUnitHandle.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #ifndef CNTM_EXECUTIONUNITHANDLE_H
00015 #define CNTM_EXECUTIONUNITHANDLE_H
00016 #include <Cntm/Concurrency/Internal/ExecutionUnitImpl.h>
00017 
00018 namespace Cntm
00019 {
00020 
00021         /**
00022          * Класс хэндла единицы выполнения. Является базовым классом для хэндлов асинхронных процедур (класс Cntm::AsyncProcHandle) и потоков активных объектов (класс Cntm::ActiveThreadHandle).
00023          *
00024          * Хэндл служит для управления асинхронной процедурой или потоком со стороны создателя единицы выполнения. По сути хэндл является ссылочным указателем на объект единицы выполнения, т.е. пока существует хотя бы один хэндл, связанный с объектом единицы выполнения, этот объект будет существовать.
00025          *
00026          * Хэндл может быть связан с единицей выполнения или нет. Это можно определить через свойство Assigned(). Разорвать связь между хэндлом и объектом единицы выполнения можно методом Unassign(). Также связь разрушается, когда происходит уничтожение хэндла. Значения хэндлов могут быть скопированы друг в друга. В этом случае связь со старым объектом разрывается и производится связь с тем объектом, с которым связан источник.
00027          *
00028          * Сам по себе объект единицы исполнения не доступен. Все управление этими объектами производится через их хэндлы  (создание асинхронных процедур и потоков активных объектов производится с помощью статических методов классов Cntm::AsyncProc и Cntm::ActiveThread, которые возвращают хэндлы созданных ими объектов единиц выполнения).
00029          *
00030          * Данный класс является базовым классом хэндла и предоставляет сервис по установке флага принудительного останова - метод Terminate().
00031          *
00032          * Класс поддерживает многопоточность.
00033          * @author Овсеевич Р.
00034          * \ingroup Concurrency
00035          */
00036         class ExecutionUnitHandle
00037         {
00038         public:
00039                 
00040                 /**
00041                  * Тип идентификатора единицы выполнения. С помощью идентификаторов можно определить, относятся ли хэндлы к одной и той же единице выполнения или нет.
00042                  *
00043                  * Тип имеет операторы сравнения, поэтому может использоваться для сортировки. Не имеет конструктора по умолчанию, поэтому при создании переменной этого типа она д.б. явно проинициализирована, например, специальным значением ExecutionUnitHandle::NullId().  
00044                  * 
00045                  * Значения идентификаторов могут быть использованы повторно после уничтожения единицы выполнения.
00046                  */ 
00047                 typedef void* UnitId;
00048                 
00049                 /**
00050                  * Конструктор по умолчанию. Создает пустой хэндл, не связанный с единицей выполнения. 
00051                  */
00052                 ExecutionUnitHandle() {}
00053                 
00054                 /**
00055                  * Конструктор копирования. Дублирует указанный хэндл.
00056                  * @param Src - дублируемый хэндл. 
00057                  */
00058                 ExecutionUnitHandle(const ExecutionUnitHandle& Src): impl(Src.impl) {}
00059                 
00060                 /**
00061                  * Специальное значение идентификатора единицы выполнения, означающее ее отсутствие.
00062                  */
00063                 static UnitId NullId() { return NULL; }
00064                 
00065                 /**
00066                  * Оператор присвоения. Уничтожает связь со старым объектом единицы выполнения и устанавливает с новым, взятым из Src.
00067                  * @param Src - дублируемый хэндл. 
00068                  */
00069                 ExecutionUnitHandle& operator= (const ExecutionUnitHandle& Src) { impl = Src.impl; return *this; }
00070                 
00071                 /**
00072                  * Идентификатор текущей единицы выполнения или NullId(), если хэндл не связан с единицей выполнения.
00073                  */
00074                 UnitId Id() const { return impl.Pointer(); }
00075                 
00076                 /**
00077                  * Возвращает true, если хэндл связан с единицей выполнения и false - в противном случае. 
00078                  */
00079                 bool Assigned() const { return (bool)impl; }
00080                 
00081                 /**
00082                  * Возвращает флаг принудительного останова. Если хэндл не связан с единицей выполнения, то всегда возвращается false. 
00083                  */
00084                 bool Terminated() const { SpecUtils::ExecutionUnitImpl::Ptr temp = impl; return temp? temp->Terminated() : false; }
00085                         
00086                 /**
00087                  * Разорвать связь с единицей выполнения. После этого Assigned() будет возвращать false.
00088                  * 
00089                  * Не генерирует исключений. 
00090                  */
00091                 void Unassign() throw() { impl.SetNull(); }
00092                 
00093                 /**
00094                  * Установить флаг принудительного завершения. Исходное значение этого флага - false. После вызова этого метода Terminated() и Cntm::ExecutionUnit::Terminated() вернут true, а Cntm::ExecutionUnit::CheckTerminating() сгенерирует исключение (примечание: методы объекта Cntm::ExecutionUnit должны быть вызваны в контексте той исполняемой единицы, с которой связан хэндл).
00095                  * 
00096                  * Если хэндл не связан с единицей выполнения, то ни каких действий не выполняется. 
00097                  * 
00098                  * Не генерирует исключений.
00099                  */
00100                 void Terminate() throw() { SpecUtils::ExecutionUnitImpl::Ptr temp = impl; if (temp) temp->Terminate(); }
00101                 
00102         protected:
00103 
00104                 /**
00105                  * Защищенный конструктор инициализации хэндла. 
00106                  */
00107                 ExecutionUnitHandle(const SpecUtils::ExecutionUnitImpl::Ptr& Impl): impl(Impl) {}
00108                 
00109                 /**
00110                  * Ссылочный указатель на объект единицы выполнения. 
00111                  */
00112                 SpecUtils::ExecutionUnitImpl::Ptr impl;
00113         };
00114 
00115 }
00116 
00117 #endif //CNTM_EXECUTIONUNITHANDLE_H

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3