Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/common/multi_process_lock.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/mac/scoped_cftyperef.h"
      9 #include "base/sys_string_conversions.h"
     10 
     11 class MultiProcessLockMac : public MultiProcessLock {
     12  public:
     13   explicit MultiProcessLockMac(const std::string& name) : name_(name) { }
     14 
     15   virtual ~MultiProcessLockMac() {
     16     if (port_ != NULL) {
     17       Unlock();
     18     }
     19   }
     20 
     21   virtual bool TryLock() {
     22     if (port_ != NULL) {
     23       DLOG(ERROR) << "MultiProcessLock is already locked - " << name_;
     24       return true;
     25     }
     26 
     27     if (name_.length() > MULTI_PROCESS_LOCK_NAME_MAX_LEN) {
     28       LOG(ERROR) << "Socket name too long (" << name_.length()
     29                  << " > " << MULTI_PROCESS_LOCK_NAME_MAX_LEN << ") - " << name_;
     30       return false;
     31     }
     32 
     33     CFStringRef cf_name(base::SysUTF8ToCFStringRef(name_));
     34     base::mac::ScopedCFTypeRef<CFStringRef> scoped_cf_name(cf_name);
     35     port_.reset(CFMessagePortCreateLocal(NULL, cf_name, NULL, NULL, NULL));
     36     return port_ != NULL;
     37   }
     38 
     39   virtual void Unlock() {
     40     if (port_ == NULL) {
     41       DLOG(ERROR) << "Over-unlocked MultiProcessLock - " << name_;
     42       return;
     43     }
     44     port_.reset();
     45   }
     46 
     47  private:
     48   std::string name_;
     49   base::mac::ScopedCFTypeRef<CFMessagePortRef> port_;
     50   DISALLOW_COPY_AND_ASSIGN(MultiProcessLockMac);
     51 };
     52 
     53 MultiProcessLock* MultiProcessLock::Create(const std::string &name) {
     54   return new MultiProcessLockMac(name);
     55 }
     56