1 // Copyright (c) 2011 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.
5 #include "chrome/common/multi_process_lock.h"
7 #include "base/logging.h"
8 #include "base/mac/scoped_cftyperef.h"
9 #include "base/strings/sys_string_conversions.h"
11 #include <servers/bootstrap.h>
13 class MultiProcessLockMac
: public MultiProcessLock
{
15 explicit MultiProcessLockMac(const std::string
& name
) : name_(name
) { }
17 ~MultiProcessLockMac() override
{
23 bool TryLock() override
{
25 DLOG(ERROR
) << "MultiProcessLock is already locked - " << name_
;
29 if (name_
.length() >= BOOTSTRAP_MAX_NAME_LEN
) {
30 LOG(ERROR
) << "Socket name too long (" << name_
.length()
31 << " >= " << BOOTSTRAP_MAX_NAME_LEN
<< ") - " << name_
;
35 CFStringRef
cf_name(base::SysUTF8ToCFStringRef(name_
));
36 base::ScopedCFTypeRef
<CFStringRef
> scoped_cf_name(cf_name
);
37 port_
.reset(CFMessagePortCreateLocal(NULL
, cf_name
, NULL
, NULL
, NULL
));
41 void Unlock() override
{
43 DLOG(ERROR
) << "Over-unlocked MultiProcessLock - " << name_
;
51 base::ScopedCFTypeRef
<CFMessagePortRef
> port_
;
52 DISALLOW_COPY_AND_ASSIGN(MultiProcessLockMac
);
55 MultiProcessLock
* MultiProcessLock::Create(const std::string
&name
) {
56 return new MultiProcessLockMac(name
);