Back to home page

EIC code displayed by LXR

 
 

    


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