• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
MultiProcessLockMac(const std::string & name)13   explicit MultiProcessLockMac(const std::string& name) : name_(name) { }
14 
~MultiProcessLockMac()15   virtual ~MultiProcessLockMac() {
16     if (port_ != NULL) {
17       Unlock();
18     }
19   }
20 
TryLock()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 
Unlock()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 
Create(const std::string & name)53 MultiProcessLock* MultiProcessLock::Create(const std::string &name) {
54   return new MultiProcessLockMac(name);
55 }
56