• 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/utf_string_conversions.h"
9 #include "base/win/scoped_handle.h"
10 
11 class MultiProcessLockWin : public MultiProcessLock {
12  public:
MultiProcessLockWin(const std::string & name)13   explicit MultiProcessLockWin(const std::string& name) : name_(name) { }
14 
~MultiProcessLockWin()15   virtual ~MultiProcessLockWin() {
16     if (event_.Get() != NULL) {
17       Unlock();
18     }
19   }
20 
TryLock()21   virtual bool TryLock() {
22     if (event_.Get() != 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     string16 wname = 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;
40     }
41   }
42 
Unlock()43   virtual void Unlock() {
44     if (event_.Get() == NULL) {
45       DLOG(ERROR) << "Over-unlocked MultiProcessLock - " << name_;
46       return;
47     }
48     event_.Set(NULL);
49   }
50 
51  private:
52   std::string name_;
53   base::win::ScopedHandle event_;
54   DISALLOW_COPY_AND_ASSIGN(MultiProcessLockWin);
55 };
56 
Create(const std::string & name)57 MultiProcessLock* MultiProcessLock::Create(const std::string &name) {
58   return new MultiProcessLockWin(name);
59 }
60