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_SYNC_H 00015 #define CNTM_SYNC_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 Sync: public BasicSync 00034 { 00035 public: 00036 00037 /** 00038 * Конструктор по умолчанию. Инициализирует указатель на IBasicSynchro в NULL и не выполняет никаких действий. 00039 */ 00040 Sync() {} 00041 00042 /** 00043 * Конструктор инициализации IBasicSynchro. Производится вход в синхропространство, к которому принадлежит синхрообъект, в нереентерабельном режиме. 00044 * 00045 * Исключение: NullArgException если аргумент Object равен NULL. 00046 * @param Object - IBasicSynchro, в синхропространство которого требуется войти в нереентерабельном режиме. Он не должен равняться NULL. 00047 */ 00048 Sync(IBasicSynchro::Ptr Object) 00049 { 00050 if (!Object) throw NullArgException("Cntm::Sync::Sync(IBasicSynchro::Ptr)", "Не задан синхрообъект"); 00051 Enter(Object); 00052 } 00053 00054 /** 00055 * Конструктор инициализации IBasicSynchro. Производится вход в синхропространство, к которому принадлежит синхрообъект, в нереентерабельном режиме. 00056 * 00057 * Исключение: NullArgException если аргумент Object равен NULL. 00058 * @param Object - IBasicSynchro, в синхропространство которого требуется войти в нереентерабельном режиме. Он не должен равняться NULL. 00059 */ 00060 template <typename T> 00061 Sync(RefPtr<T> Object) 00062 { 00063 CheckTypeCast<IBasicSynchro*>((T*)NULL); 00064 if (!Object) throw NullArgException("Cntm::Sync::Sync(IBasicSynchro::Ptr)", "Не задан синхрообъект"); 00065 Enter(Object); 00066 } 00067 00068 /** 00069 * Конструктор копирования. Если Object() источника не равен NULL, то производится вход в синхропространство в нереентерабельном режиме. 00070 * @param Src - источник, из которого берется Object(). 00071 */ 00072 Sync(const BasicSync& Src) { Enter(Src.Object()); } 00073 00074 /** 00075 * Конструктор копирования. Если Object() источника не равен NULL, то производится вход в синхропространство в нереентерабельном режиме. 00076 * @param Src - источник, из которого берется Object(). 00077 */ 00078 Sync(const Sync& Src) { Enter(Src.Object()); } 00079 00080 /** 00081 * Деструктор. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). 00082 */ 00083 ~Sync() { Leave(); } 00084 00085 /** 00086 * Оператор присвоения синхрообъекта. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). Производит вход в синхропространство, к которому принадлежит синхрообъект, в нереентерабельном режиме. 00087 * 00088 * Исключение: NullArgException если аргумент Object равен NULL. 00089 * @param Object - IBasicSynchro, в синхропространство которого требуется войти в нереентерабельном режиме. Он не должен равняться NULL. 00090 */ 00091 Sync& operator= (IBasicSynchro::Ptr Object) 00092 { 00093 if (!Object) throw NullArgException("Cntm::Sync::operator=(IBasicSynchro::Ptr)", "Не задан синхрообъект"); 00094 Set(Object); 00095 return *this; 00096 } 00097 00098 /** 00099 * Оператор присвоения синхрообъекта. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). Производит вход в синхропространство, к которому принадлежит синхрообъект, в нереентерабельном режиме. 00100 * 00101 * Исключение: NullArgException если аргумент Object равен NULL. 00102 * @param Object - IBasicSynchro, в синхропространство которого требуется войти в нереентерабельном режиме. Он не должен равняться NULL. 00103 */ 00104 template <typename T> 00105 Sync& operator= (RefPtr<T> Object) 00106 { 00107 CheckTypeCast<IBasicSynchro*>((T*)NULL); 00108 if (!Object) throw NullArgException("Cntm::Sync::operator=(IBasicSynchro::Ptr)", "Не задан синхрообъект"); 00109 Set(Object); 00110 return *this; 00111 } 00112 00113 /** 00114 * Оператор копирования. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). Если Object() источника не равен NULL, то производится вход в синхропространство в нереентерабельном режиме. Object() принимает новое значение. 00115 * 00116 * Если новое синхропространство Src.Object() совпадает со старым, то ни каких действий не выполняется. 00117 * @param Src - источник, из которого берется Object(). 00118 */ 00119 Sync& operator= (const BasicSync& Src) { Set(Src.Object()); return *this; } 00120 00121 /** 00122 * Оператор копирования. Производит выход из синхропространства, если в него был произведен вход (Object() не равен NULL). Если Object() источника не равен NULL, то производится вход в синхропространство в нереентерабельном режиме. Object() принимает новое значение. 00123 * 00124 * Если новое синхропространство Src.Object() совпадает со старым, то ни каких действий не выполняется. 00125 * @param Src - источник, из которого берется Object(). 00126 */ 00127 Sync& operator= (const Sync& 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 == Sync::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(); 00148 ResetObject(); 00149 } 00150 00151 private: 00152 00153 /** 00154 * Производит вход в указанное синхропространство. 00155 */ 00156 void Enter(const IBasicSynchro::Ptr& Object) { if (Object) Object->Enter(); SetObject(Object); } 00157 }; 00158 00159 } 00160 00161 #endif //CNTM_SYNC_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |