Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / chrome / common / multi_process_lock_win.cc
blob74c7b3eaca98606ed0ac047b9d74ecb47a594a22
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/strings/utf_string_conversions.h"
9 #include "base/win/scoped_handle.h"
11 class MultiProcessLockWin : public MultiProcessLock {
12 public:
13 explicit MultiProcessLockWin(const std::string& name) : name_(name) { }
15 ~MultiProcessLockWin() override {
16 if (event_.Get() != NULL) {
17 Unlock();
21 bool TryLock() override {
22 if (event_.Get() != NULL) {
23 DLOG(ERROR) << "MultiProcessLock is already locked - " << name_;
24 return true;
27 if (name_.length() >= MAX_PATH) {
28 LOG(ERROR) << "Socket name too long (" << name_.length()
29 << " >= " << MAX_PATH << ") - " << name_;
30 return false;
33 base::string16 wname = base::UTF8ToUTF16(name_);
34 event_.Set(CreateEvent(NULL, FALSE, FALSE, wname.c_str()));
35 if (event_.Get() && GetLastError() != ERROR_ALREADY_EXISTS) {
36 return true;
37 } else {
38 event_.Set(NULL);
39 return false;
43 void Unlock() override {
44 if (event_.Get() == NULL) {
45 DLOG(ERROR) << "Over-unlocked MultiProcessLock - " << name_;
46 return;
48 event_.Set(NULL);
51 private:
52 std::string name_;
53 base::win::ScopedHandle event_;
54 DISALLOW_COPY_AND_ASSIGN(MultiProcessLockWin);
57 MultiProcessLock* MultiProcessLock::Create(const std::string &name) {
58 return new MultiProcessLockWin(name);