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