ReentrantSync.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_REENTRANTSYNC_H
00015 #define CNTM_REENTRANTSYNC_H
00016 #include <Cntm/Utils/CheckTypeCast.h>
00017 #include <Cntm/Exceptions/NullArgException.h>
00018 #include <Cntm/Synchro/SyncScopes/BasicSync.h>
00019 
00020 namespace Cntm
00021 {
00022 
00023         /**
00024          * Класс синхросекции, выполняющей вход в синхропространство в реентерабельном режиме. Синхросекции автоматизируют процесс входа и выхода из синхропространства. В конструкторе синхросекций обычно производится вход в реентерабельном режиме, а в деструкторе - выход из синхропространства в реентерабельном режиме.
00025          * 
00026          * Использование синхросекций повышает удобство (для входа/выхода требуется написать только 1 строку кода) и надежность (выход из синхропространства будет произведен в любом случае, в т.ч. и при исключении).
00027          * 
00028          * Объекты синхросекций содержат ссылочные указатели на синхрообъекты или на синхропространства (IBasicSynchro), в которые произведен вход. Если синхросекция не используется для входа, то указатель на синхропространство равен NULL.
00029          * 
00030          * Данный класс не поддерживает многопоточность.
00031          * @author Овсеевич Р.
00032          */
00033         class ReentrantSync: public BasicSync
00034         {
00035         public:
00036 
00037                 /**
00038                  * Конструктор по умолчанию. Инициализирует указатель на IBasicSynchro в NULL и не выполняет никаких действий.
00039                  */
00040                 ReentrantSync() {}
00041 
00042                 /**
00043                  * Конструктор инициализации IBasicSynchro. Производится вход в синхропространство, к которому принадлежит синхрообъект, в реентерабельном режиме.
00044                  * 
00045                  * Исключение: NullArgException если аргумент Object равен NULL.
00046                  * @param Object - синхрообъект, в синхропространство которого требуется войти в реентерабельном режиме. Он не должен равняться NULL.
00047                  */
00048                 ReentrantSync(IBasicSynchro::Ptr Object)
00049                 {
00050                         if (!Object) throw NullArgException("Cntm::ReentrantSync::ReentrantSync(IBasicSynchro::Ptr)", "Не задан синхрообъект");
00051                         Enter(Object);
00052                 }
00053 
00054                 /**
00055                  * Конструктор инициализации IBasicSynchro. Производится вход в синхропространство, к которому принадлежит синхрообъект, в реентерабельном режиме.
00056                  * 
00057                  * Исключение: NullArgException если аргумент Object равен NULL.
00058                  * @param Object - синхрообъект, в синхропространство которого требуется войти в реентерабельном режиме. Он не должен равняться NULL.
00059                  */
00060                 template <typename T>
00061                 ReentrantSync(RefPtr<T> Object)
00062                 {
00063                         CheckTypeCast<IBasicSynchro*>((T*)NULL);
00064                         if (!Object) throw NullArgException("Cntm::ReentrantSync::ReentrantSync(IBasicSynchro::Ptr)", "Не задан синхрообъект");
00065                         Enter(Object);
00066                 }
00067 
00068                 /**
00069                  * Конструктор копирования. Если Object() источника не равен NULL, то производится вход в синхропространство в реентерабельном режиме.
00070                  * @param Src - источник, из которого берется Object().
00071                  */
00072                 ReentrantSync(const BasicSync& Src) { Enter(Src.Object()); }
00073 
00074                 /**
00075                  * Конструктор копирования. Если Object() источника не равен NULL, то производится вход в синхропространство в реентерабельном режиме.
00076                  * @param Src - источник, из которого берется Object().
00077                  */
00078                 ReentrantSync(const ReentrantSync& Src) { Enter(Src.Object()); }
00079 
00080                 /**
00081                  * Деструктор. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).
00082                  */
00083                 ~ReentrantSync() { Leave(); }
00084 
00085                 /**
00086                  * Оператор присвоения IBasicSynchro. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).  Производит вход в синхропространство, к которому принадлежит синхрообъект, в реентерабельном режиме.
00087                  * 
00088                  * Исключение: NullArgException если аргумент Object равен NULL.
00089                  * @param Object - IBasicSynchro, в синхропространство которого требуется войти в реентерабельном режиме. Он не должен равняться NULL.
00090                  */
00091                 ReentrantSync& operator= (IBasicSynchro::Ptr Object)
00092                 {
00093                         if (!Object) throw NullArgException("Cntm::ReentrantSync::operator=(IBasicSynchro::Ptr)", "Не задан синхрообъект");
00094                         Set(Object);
00095                         return *this;
00096                 }
00097 
00098                 /**
00099                  * Оператор присвоения IBasicSynchro. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).  Производит вход в синхропространство, к которому принадлежит синхрообъект, в реентерабельном режиме.
00100                  * 
00101                  * Исключение: NullArgException если аргумент Object равен NULL.
00102                  * @param Object - IBasicSynchro, в синхропространство которого требуется войти в реентерабельном режиме. Он не должен равняться NULL.
00103                  */
00104                 template <typename T>
00105                 ReentrantSync& operator= (RefPtr<T> Object)
00106                 {
00107                         CheckTypeCast<IBasicSynchro*>((T*)NULL);
00108                         if (!Object) throw NullArgException("Cntm::ReentrantSync::operator=(IBasicSynchro::Ptr)", "Не задан синхрообъект");
00109                         Set(Object);
00110                         return *this;
00111                 }
00112 
00113                 /**
00114                  * Оператор копирования. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).  Если Object() источника не равен NULL, то производится вход в синхропространство в реентерабельном режиме. Object() принимает новое значение.
00115                  * 
00116                  * Если новое синхропространство совпадает со старым, то ни каких действий не выполняется.
00117                  * @param Src - источник, из которого берется Object().
00118                  */
00119                 ReentrantSync& operator= (const BasicSync& Src) { Set(Src.Object()); return *this; }
00120 
00121                 /**
00122                  * Оператор копирования. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).  Если Object() источника не равен NULL, то производится вход в синхропространство в реентерабельном режиме. Object() принимает новое значение.
00123                  * 
00124                  * Если новое синхропространство совпадает со старым, то ни каких действий не выполняется.
00125                  * @param Src - источник, из которого берется Object().
00126                  */
00127                 ReentrantSync& operator= (const ReentrantSync& Src) { Set(Src.Object()); return *this; }
00128 
00129                 /**
00130                  * Установить новое значение Object(). Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL).  Если Object() источника не равен NULL, то производится вход в синхропространство в реентерабельном режиме. Object() принимает новое значение.
00131                  * 
00132                  * Если новое синхропространство совпадает со старым, то ни каких действий не выполняется.
00133                  * @param Object - синхропространство, в которое требуется войти в реентерабельном режиме.
00134                  */
00135                 void Set(IBasicSynchro::Ptr Object)
00136                 {
00137                         if (Object == ReentrantSync::Object()) return; 
00138                         Leave();
00139                         Enter(Object);
00140                 }
00141 
00142                 /**
00143                  * Выйти из синхропространства. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). Object() принимает значение NULL.
00144                  */
00145                 void Leave()
00146                 {
00147                         if (Object()) Object()->Leave(true);
00148                         ResetObject();
00149                 }
00150                 
00151         private:
00152         
00153                 /**
00154                  * Производит вход в указанное синхропространство.
00155                  */
00156                 void Enter(const IBasicSynchro::Ptr& Object) { if (Object) Object->Enter(true); SetObject(Object); }
00157         };
00158 
00159 }
00160 
00161 #endif //CNTM_REENTRANTSYNC_H

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