|
||||
File indexing completed on 2025-01-18 09:38:33
0001 ////////////////////////////////////////////////////////////////////////////// 0002 // 0003 // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost 0004 // Software License, Version 1.0. (See accompanying file 0005 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 0006 // 0007 // See http://www.boost.org/libs/interprocess for documentation. 0008 // 0009 ////////////////////////////////////////////////////////////////////////////// 0010 0011 #ifndef BOOST_INTERPROCESS_named_upgradable_mutex_HPP 0012 #define BOOST_INTERPROCESS_named_upgradable_mutex_HPP 0013 0014 #ifndef BOOST_CONFIG_HPP 0015 # include <boost/config.hpp> 0016 #endif 0017 # 0018 #if defined(BOOST_HAS_PRAGMA_ONCE) 0019 # pragma once 0020 #endif 0021 0022 #include <boost/interprocess/detail/config_begin.hpp> 0023 #include <boost/interprocess/detail/workaround.hpp> 0024 #include <boost/interprocess/creation_tags.hpp> 0025 #include <boost/interprocess/exceptions.hpp> 0026 #include <boost/interprocess/shared_memory_object.hpp> 0027 #include <boost/interprocess/detail/managed_open_or_create_impl.hpp> 0028 #include <boost/interprocess/sync/interprocess_upgradable_mutex.hpp> 0029 #include <boost/interprocess/sync/shm/named_creation_functor.hpp> 0030 #include <boost/interprocess/permissions.hpp> 0031 0032 //!\file 0033 //!Describes a named upgradable mutex class for inter-process synchronization 0034 0035 namespace boost { 0036 namespace interprocess { 0037 0038 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0039 namespace ipcdetail{ class interprocess_tester; } 0040 #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED 0041 0042 class named_condition; 0043 0044 //!A upgradable mutex with a global name, so it can be found from different 0045 //!processes. This mutex can't be placed in shared memory, and 0046 //!each process should have it's own named upgradable mutex. 0047 class named_upgradable_mutex 0048 { 0049 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0050 //Non-copyable 0051 named_upgradable_mutex(); 0052 named_upgradable_mutex(const named_upgradable_mutex &); 0053 named_upgradable_mutex &operator=(const named_upgradable_mutex &); 0054 friend class named_condition; 0055 #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED 0056 public: 0057 0058 //!Creates a global upgradable mutex with a name. 0059 //!If the upgradable mutex can't be created throws interprocess_exception 0060 named_upgradable_mutex(create_only_t, const char *name, const permissions &perm = permissions()); 0061 0062 //!Opens or creates a global upgradable mutex with a name. 0063 //!If the upgradable mutex is created, this call is equivalent to 0064 //!named_upgradable_mutex(create_only_t, ...) 0065 //!If the upgradable mutex is already created, this call is equivalent to 0066 //!named_upgradable_mutex(open_only_t, ... ). 0067 named_upgradable_mutex(open_or_create_t, const char *name, const permissions &perm = permissions()); 0068 0069 //!Opens a global upgradable mutex with a name if that upgradable mutex 0070 //!is previously. 0071 //!created. If it is not previously created this function throws 0072 //!interprocess_exception. 0073 named_upgradable_mutex(open_only_t, const char *name); 0074 0075 #if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0076 0077 //!Creates a global upgradable mutex with a name. 0078 //!If the upgradable mutex can't be created throws interprocess_exception 0079 //! 0080 //!Note: This function is only available on operating systems with 0081 //! native wchar_t APIs (e.g. Windows). 0082 named_upgradable_mutex(create_only_t, const wchar_t *name, const permissions &perm = permissions()); 0083 0084 //!Opens or creates a global upgradable mutex with a name. 0085 //!If the upgradable mutex is created, this call is equivalent to 0086 //!named_upgradable_mutex(create_only_t, ...) 0087 //!If the upgradable mutex is already created, this call is equivalent to 0088 //!named_upgradable_mutex(open_only_t, ... ). 0089 //! 0090 //!Note: This function is only available on operating systems with 0091 //! native wchar_t APIs (e.g. Windows). 0092 named_upgradable_mutex(open_or_create_t, const wchar_t *name, const permissions &perm = permissions()); 0093 0094 //!Opens a global upgradable mutex with a name if that upgradable mutex 0095 //!is previously. 0096 //!created. If it is not previously created this function throws 0097 //!interprocess_exception. 0098 //! 0099 //!Note: This function is only available on operating systems with 0100 //! native wchar_t APIs (e.g. Windows). 0101 named_upgradable_mutex(open_only_t, const wchar_t *name); 0102 0103 #endif //defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0104 0105 //!Destroys *this and indicates that the calling process is finished using 0106 //!the resource. The destructor function will deallocate 0107 //!any system resources allocated by the system for use by this process for 0108 //!this resource. The resource can still be opened again calling 0109 //!the open constructor overload. To erase the resource from the system 0110 //!use remove(). 0111 ~named_upgradable_mutex(); 0112 0113 //Exclusive locking 0114 0115 //!Requires: The calling thread does not own the mutex. 0116 //! 0117 //!Effects: The calling thread tries to obtain exclusive ownership of the mutex, 0118 //! and if another thread has exclusive, sharable or upgradable ownership of 0119 //! the mutex, it waits until it can obtain the ownership. 0120 //!Throws: interprocess_exception on error. 0121 //! 0122 //!Note: A program may deadlock if the thread that has ownership calls 0123 //! this function. If the implementation can detect the deadlock, 0124 //! an exception could be thrown 0125 void lock(); 0126 0127 //!Requires: The calling thread does not own the mutex. 0128 //! 0129 //!Effects: The calling thread tries to acquire exclusive ownership of the mutex 0130 //! without waiting. If no other thread has exclusive, sharable or upgradable 0131 //! ownership of the mutex this succeeds. 0132 //!Returns: If it can acquire exclusive ownership immediately returns true. 0133 //! If it has to wait, returns false. 0134 //!Throws: interprocess_exception on error. 0135 //! 0136 //!Note: A program may deadlock if the thread that has ownership calls 0137 //! this function. If the implementation can detect the deadlock, 0138 //! an exception could be thrown 0139 bool try_lock(); 0140 0141 //!Requires: The calling thread does not own the mutex. 0142 //! 0143 //!Effects: The calling thread tries to acquire exclusive ownership of the mutex 0144 //! waiting if necessary until no other thread has exclusive, sharable or 0145 //! upgradable ownership of the mutex or abs_time is reached. 0146 //!Returns: If acquires exclusive ownership, returns true. Otherwise returns false. 0147 //!Throws: interprocess_exception on error. 0148 //! 0149 //!Note: A program may deadlock if the thread that has ownership calls 0150 //! this function. If the implementation can detect the deadlock, 0151 //! an exception could be thrown 0152 template<class TimePoint> 0153 bool timed_lock(const TimePoint &abs_time); 0154 0155 //!Same as `timed_lock`, but this function is modeled after the 0156 //!standard library interface. 0157 template<class TimePoint> bool try_lock_until(const TimePoint &abs_time) 0158 { return this->timed_lock(abs_time); } 0159 0160 //!Same as `timed_lock`, but this function is modeled after the 0161 //!standard library interface. 0162 template<class Duration> bool try_lock_for(const Duration &dur) 0163 { return this->timed_lock(ipcdetail::duration_to_ustime(dur)); } 0164 0165 //!Precondition: The thread must have exclusive ownership of the mutex. 0166 //!Effects: The calling thread releases the exclusive ownership of the mutex. 0167 //!Throws: An exception derived from interprocess_exception on error. 0168 void unlock(); 0169 0170 //Sharable locking 0171 0172 //!Requires: The calling thread does not own the mutex. 0173 //! 0174 //!Effects: The calling thread tries to obtain sharable ownership of the mutex, 0175 //! and if another thread has exclusive ownership of the mutex, 0176 //! waits until it can obtain the ownership. 0177 //!Throws: interprocess_exception on error. 0178 //! 0179 //!Note: A program may deadlock if the thread that has ownership calls 0180 //! this function. If the implementation can detect the deadlock, 0181 //! an exception could be thrown 0182 void lock_sharable(); 0183 0184 //!Same as `lock_sharable` but with a std-compatible interface 0185 //! 0186 void lock_shared() 0187 { this->lock_sharable(); } 0188 0189 //!Requires: The calling thread does not own the mutex. 0190 //! 0191 //!Effects: The calling thread tries to acquire sharable ownership of the mutex 0192 //! without waiting. If no other thread has exclusive ownership 0193 //! of the mutex this succeeds. 0194 //!Returns: If it can acquire sharable ownership immediately returns true. If it 0195 //! has to wait, returns false. 0196 //!Throws: interprocess_exception on error. 0197 //! 0198 //!Note: A program may deadlock if the thread that has ownership calls 0199 //! this function. If the implementation can detect the deadlock, 0200 //! an exception could be thrown 0201 bool try_lock_sharable(); 0202 0203 //!Same as `try_lock_sharable` but with a std-compatible interface 0204 //! 0205 bool try_lock_shared() 0206 { return this->try_lock_sharable(); } 0207 0208 //!Requires: The calling thread does not own the mutex. 0209 //! 0210 //!Effects: The calling thread tries to acquire sharable ownership of the mutex 0211 //! waiting if necessary until no other thread has exclusive 0212 //! ownership of the mutex or abs_time is reached. 0213 //!Returns: If acquires sharable ownership, returns true. Otherwise returns false. 0214 //!Throws: interprocess_exception on error. 0215 //! 0216 //!Note: A program may deadlock if the thread that has ownership calls 0217 //! this function. If the implementation can detect the deadlock, 0218 //! an exception could be thrown 0219 template<class TimePoint> 0220 bool timed_lock_sharable(const TimePoint &abs_time); 0221 0222 //!Same as `timed_lock_sharable`, but this function is modeled after the 0223 //!standard library interface. 0224 template<class TimePoint> bool try_lock_shared_until(const TimePoint &abs_time) 0225 { return this->timed_lock_sharable(abs_time); } 0226 0227 //!Same as `timed_lock_sharable`, but this function is modeled after the 0228 //!standard library interface. 0229 template<class Duration> bool try_lock_shared_for(const Duration &dur) 0230 { return this->timed_lock_sharable(ipcdetail::duration_to_ustime(dur)); } 0231 0232 //!Precondition: The thread must have sharable ownership of the mutex. 0233 //!Effects: The calling thread releases the sharable ownership of the mutex. 0234 //!Throws: An exception derived from interprocess_exception on error. 0235 void unlock_sharable(); 0236 0237 //!Same as `unlock_sharable` but with a std-compatible interface 0238 //! 0239 void unlock_shared() 0240 { this->unlock_sharable(); } 0241 0242 //Upgradable locking 0243 0244 //!Requires: The calling thread does not own the mutex. 0245 //! 0246 //!Effects: The calling thread tries to obtain upgradable ownership of the mutex, 0247 //! and if another thread has exclusive or upgradable ownership of the mutex, 0248 //! waits until it can obtain the ownership. 0249 //!Throws: interprocess_exception on error. 0250 //! 0251 //!Note: A program may deadlock if the thread that has ownership calls 0252 //! this function. If the implementation can detect the deadlock, 0253 //! an exception could be thrown 0254 void lock_upgradable(); 0255 0256 //!Requires: The calling thread does not own the mutex. 0257 //! 0258 //!Effects: The calling thread tries to acquire upgradable ownership of the mutex 0259 //! without waiting. If no other thread has exclusive or upgradable ownership 0260 //! of the mutex this succeeds. 0261 //!Returns: If it can acquire upgradable ownership immediately returns true. 0262 //! If it has to wait, returns false. 0263 //!Throws: interprocess_exception on error. 0264 //! 0265 //!Note: A program may deadlock if the thread that has ownership calls 0266 //! this function. If the implementation can detect the deadlock, 0267 //! an exception could be thrown 0268 bool try_lock_upgradable(); 0269 0270 //!Requires: The calling thread does not own the mutex. 0271 //! 0272 //!Effects: The calling thread tries to acquire upgradable ownership of the mutex 0273 //! waiting if necessary until no other thread has exclusive or upgradable 0274 //! ownership of the mutex or abs_time is reached. 0275 //!Returns: If acquires upgradable ownership, returns true. Otherwise returns false. 0276 //!Throws: interprocess_exception on error. 0277 //! 0278 //!Note: A program may deadlock if the thread that has ownership calls 0279 //! this function. If the implementation can detect the deadlock, 0280 //! an exception could be thrown 0281 template<class TimePoint> 0282 bool timed_lock_upgradable(const TimePoint &abs_time); 0283 0284 //!Precondition: The thread must have upgradable ownership of the mutex. 0285 //!Effects: The calling thread releases the upgradable ownership of the mutex. 0286 //!Throws: An exception derived from interprocess_exception on error. 0287 void unlock_upgradable(); 0288 0289 //Demotions 0290 0291 //!Precondition: The thread must have exclusive ownership of the mutex. 0292 //!Effects: The thread atomically releases exclusive ownership and acquires 0293 //! upgradable ownership. This operation is non-blocking. 0294 //!Throws: An exception derived from interprocess_exception on error. 0295 void unlock_and_lock_upgradable(); 0296 0297 //!Precondition: The thread must have exclusive ownership of the mutex. 0298 //!Effects: The thread atomically releases exclusive ownership and acquires 0299 //! sharable ownership. This operation is non-blocking. 0300 //!Throws: An exception derived from interprocess_exception on error. 0301 void unlock_and_lock_sharable(); 0302 0303 //!Precondition: The thread must have upgradable ownership of the mutex. 0304 //!Effects: The thread atomically releases upgradable ownership and acquires 0305 //! sharable ownership. This operation is non-blocking. 0306 //!Throws: An exception derived from interprocess_exception on error. 0307 void unlock_upgradable_and_lock_sharable(); 0308 0309 //Promotions 0310 0311 //!Precondition: The thread must have upgradable ownership of the mutex. 0312 //!Effects: The thread atomically releases upgradable ownership and acquires 0313 //! exclusive ownership. This operation will block until all threads with 0314 //! sharable ownership release it. 0315 //!Throws: An exception derived from interprocess_exception on error. 0316 void unlock_upgradable_and_lock(); 0317 0318 //!Precondition: The thread must have upgradable ownership of the mutex. 0319 //!Effects: The thread atomically releases upgradable ownership and tries to 0320 //! acquire exclusive ownership. This operation will fail if there are threads 0321 //! with sharable ownership, but it will maintain upgradable ownership. 0322 //!Returns: If acquires exclusive ownership, returns true. Otherwise returns false. 0323 //!Throws: An exception derived from interprocess_exception on error. 0324 bool try_unlock_upgradable_and_lock(); 0325 0326 //!Precondition: The thread must have upgradable ownership of the mutex. 0327 //!Effects: The thread atomically releases upgradable ownership and tries to acquire 0328 //! exclusive ownership, waiting if necessary until abs_time. This operation will 0329 //! fail if there are threads with sharable ownership or timeout reaches, but it 0330 //! will maintain upgradable ownership. 0331 //!Returns: If acquires exclusive ownership, returns true. Otherwise returns false. 0332 //!Throws: An exception derived from interprocess_exception on error. 0333 template<class TimePoint> 0334 bool timed_unlock_upgradable_and_lock(const TimePoint &abs_time); 0335 0336 //!Precondition: The thread must have sharable ownership of the mutex. 0337 //!Effects: The thread atomically releases sharable ownership and tries to acquire 0338 //! exclusive ownership. This operation will fail if there are threads with sharable 0339 //! or upgradable ownership, but it will maintain sharable ownership. 0340 //!Returns: If acquires exclusive ownership, returns true. Otherwise returns false. 0341 //!Throws: An exception derived from interprocess_exception on error. 0342 bool try_unlock_sharable_and_lock(); 0343 0344 //!Precondition: The thread must have sharable ownership of the mutex. 0345 //!Effects: The thread atomically releases sharable ownership and tries to acquire 0346 //! upgradable ownership. This operation will fail if there are threads with sharable 0347 //! or upgradable ownership, but it will maintain sharable ownership. 0348 //!Returns: If acquires upgradable ownership, returns true. Otherwise returns false. 0349 //!Throws: An exception derived from interprocess_exception on error. 0350 bool try_unlock_sharable_and_lock_upgradable(); 0351 0352 //!Erases a named upgradable mutex from the system. 0353 //!Returns false on error. Never throws. 0354 static bool remove(const char *name); 0355 0356 #if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0357 //!Erases a named upgradable mutex from the system. 0358 //!Returns false on error. Never throws. 0359 //! 0360 //!Note: This function is only available on operating systems with 0361 //! native wchar_t APIs (e.g. Windows). 0362 static bool remove(const wchar_t *name); 0363 #endif 0364 0365 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0366 private: 0367 friend class ipcdetail::interprocess_tester; 0368 void dont_close_on_destruction(); 0369 0370 interprocess_upgradable_mutex *mutex() const 0371 { return static_cast<interprocess_upgradable_mutex*>(m_shmem.get_user_address()); } 0372 0373 typedef ipcdetail::managed_open_or_create_impl<shared_memory_object, 0, true, false> open_create_impl_t; 0374 open_create_impl_t m_shmem; 0375 typedef ipcdetail::named_creation_functor<interprocess_upgradable_mutex> construct_func_t; 0376 #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED 0377 }; 0378 0379 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0380 0381 inline named_upgradable_mutex::~named_upgradable_mutex() 0382 {} 0383 0384 inline named_upgradable_mutex::named_upgradable_mutex 0385 (create_only_t, const char *name, const permissions &perm) 0386 : m_shmem (create_only 0387 ,name 0388 ,sizeof(interprocess_upgradable_mutex) + 0389 open_create_impl_t::ManagedOpenOrCreateUserOffset 0390 ,read_write 0391 ,0 0392 ,construct_func_t(ipcdetail::DoCreate) 0393 ,perm) 0394 {} 0395 0396 inline named_upgradable_mutex::named_upgradable_mutex 0397 (open_or_create_t, const char *name, const permissions &perm) 0398 : m_shmem (open_or_create 0399 ,name 0400 ,sizeof(interprocess_upgradable_mutex) + 0401 open_create_impl_t::ManagedOpenOrCreateUserOffset 0402 ,read_write 0403 ,0 0404 ,construct_func_t(ipcdetail::DoOpenOrCreate) 0405 ,perm) 0406 {} 0407 0408 inline named_upgradable_mutex::named_upgradable_mutex 0409 (open_only_t, const char *name) 0410 : m_shmem (open_only 0411 ,name 0412 ,read_write 0413 ,0 0414 ,construct_func_t(ipcdetail::DoOpen)) 0415 {} 0416 0417 #if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0418 0419 inline named_upgradable_mutex::named_upgradable_mutex 0420 (create_only_t, const wchar_t *name, const permissions &perm) 0421 : m_shmem (create_only 0422 ,name 0423 ,sizeof(interprocess_upgradable_mutex) + 0424 open_create_impl_t::ManagedOpenOrCreateUserOffset 0425 ,read_write 0426 ,0 0427 ,construct_func_t(ipcdetail::DoCreate) 0428 ,perm) 0429 {} 0430 0431 inline named_upgradable_mutex::named_upgradable_mutex 0432 (open_or_create_t, const wchar_t *name, const permissions &perm) 0433 : m_shmem (open_or_create 0434 ,name 0435 ,sizeof(interprocess_upgradable_mutex) + 0436 open_create_impl_t::ManagedOpenOrCreateUserOffset 0437 ,read_write 0438 ,0 0439 ,construct_func_t(ipcdetail::DoOpenOrCreate) 0440 ,perm) 0441 {} 0442 0443 inline named_upgradable_mutex::named_upgradable_mutex 0444 (open_only_t, const wchar_t *name) 0445 : m_shmem (open_only 0446 ,name 0447 ,read_write 0448 ,0 0449 ,construct_func_t(ipcdetail::DoOpen)) 0450 {} 0451 0452 #endif 0453 0454 inline void named_upgradable_mutex::dont_close_on_destruction() 0455 { ipcdetail::interprocess_tester::dont_close_on_destruction(m_shmem); } 0456 0457 inline void named_upgradable_mutex::lock() 0458 { this->mutex()->lock(); } 0459 0460 inline void named_upgradable_mutex::unlock() 0461 { this->mutex()->unlock(); } 0462 0463 inline bool named_upgradable_mutex::try_lock() 0464 { return this->mutex()->try_lock(); } 0465 0466 template<class TimePoint> 0467 inline bool named_upgradable_mutex::timed_lock(const TimePoint &abs_time) 0468 { return this->mutex()->timed_lock(abs_time); } 0469 0470 inline void named_upgradable_mutex::lock_upgradable() 0471 { this->mutex()->lock_upgradable(); } 0472 0473 inline void named_upgradable_mutex::unlock_upgradable() 0474 { this->mutex()->unlock_upgradable(); } 0475 0476 inline bool named_upgradable_mutex::try_lock_upgradable() 0477 { return this->mutex()->try_lock_upgradable(); } 0478 0479 template<class TimePoint> 0480 inline bool named_upgradable_mutex::timed_lock_upgradable(const TimePoint &abs_time) 0481 { return this->mutex()->timed_lock_upgradable(abs_time); } 0482 0483 inline void named_upgradable_mutex::lock_sharable() 0484 { this->mutex()->lock_sharable(); } 0485 0486 inline void named_upgradable_mutex::unlock_sharable() 0487 { this->mutex()->unlock_sharable(); } 0488 0489 inline bool named_upgradable_mutex::try_lock_sharable() 0490 { return this->mutex()->try_lock_sharable(); } 0491 0492 template<class TimePoint> 0493 inline bool named_upgradable_mutex::timed_lock_sharable(const TimePoint &abs_time) 0494 { return this->mutex()->timed_lock_sharable(abs_time); } 0495 0496 inline void named_upgradable_mutex::unlock_and_lock_upgradable() 0497 { this->mutex()->unlock_and_lock_upgradable(); } 0498 0499 inline void named_upgradable_mutex::unlock_and_lock_sharable() 0500 { this->mutex()->unlock_and_lock_sharable(); } 0501 0502 inline void named_upgradable_mutex::unlock_upgradable_and_lock_sharable() 0503 { this->mutex()->unlock_upgradable_and_lock_sharable(); } 0504 0505 inline void named_upgradable_mutex::unlock_upgradable_and_lock() 0506 { this->mutex()->unlock_upgradable_and_lock(); } 0507 0508 inline bool named_upgradable_mutex::try_unlock_upgradable_and_lock() 0509 { return this->mutex()->try_unlock_upgradable_and_lock(); } 0510 0511 template<class TimePoint> 0512 inline bool named_upgradable_mutex::timed_unlock_upgradable_and_lock(const TimePoint &abs_time) 0513 { return this->mutex()->timed_unlock_upgradable_and_lock(abs_time); } 0514 0515 inline bool named_upgradable_mutex::try_unlock_sharable_and_lock() 0516 { return this->mutex()->try_unlock_sharable_and_lock(); } 0517 0518 inline bool named_upgradable_mutex::try_unlock_sharable_and_lock_upgradable() 0519 { return this->mutex()->try_unlock_sharable_and_lock_upgradable(); } 0520 0521 inline bool named_upgradable_mutex::remove(const char *name) 0522 { return shared_memory_object::remove(name); } 0523 0524 #if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES) || defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) 0525 0526 inline bool named_upgradable_mutex::remove(const wchar_t *name) 0527 { return shared_memory_object::remove(name); } 0528 0529 #endif 0530 0531 0532 #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED 0533 0534 } //namespace interprocess { 0535 } //namespace boost { 0536 0537 #include <boost/interprocess/detail/config_end.hpp> 0538 0539 #endif //BOOST_INTERPROCESS_named_upgradable_mutex_HPP
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |