Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / chrome / test / chromedriver / net / port_server.h
blob00e56b57385fba7dc4faa4aca9b06ea5470b3338
1 // Copyright (c) 2013 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 #ifndef CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_
6 #define CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_
8 #include <list>
9 #include <set>
10 #include <string>
12 #include "base/callback.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/synchronization/lock.h"
16 class Status;
18 class PortReservation {
19 public:
20 PortReservation(const base::Closure& on_free_func, uint16 port);
21 ~PortReservation();
23 void Leak();
25 private:
26 base::Closure on_free_func_;
27 uint16 port_;
30 // Communicates with a port reservation management server.
31 class PortServer {
32 public:
33 // Construct a port server that communicates via the unix domain socket with
34 // the given path. Must use the Linux abstract namespace.
35 explicit PortServer(const std::string& path);
36 ~PortServer();
38 Status ReservePort(uint16* port, scoped_ptr<PortReservation>* reservation);
40 private:
41 Status RequestPort(uint16* port);
42 void ReleasePort(uint16 port);
44 std::string path_;
46 base::Lock free_lock_;
47 std::list<uint16> free_;
50 // Manages reservation of a block of local ports.
51 class PortManager {
52 public:
53 PortManager(uint16 min_port, uint16 max_port);
54 ~PortManager();
56 Status ReservePort(uint16* port, scoped_ptr<PortReservation>* reservation);
57 // Since we cannot remove forwarded adb ports on older SDKs,
58 // maintain a pool of forwarded ports for reuse.
59 Status ReservePortFromPool(uint16* port,
60 scoped_ptr<PortReservation>* reservation);
62 private:
63 uint16 FindAvailablePort() const;
64 void ReleasePort(uint16 port);
65 void ReleasePortToPool(uint16 port);
67 base::Lock lock_;
68 std::set<uint16> taken_;
69 std::list<uint16> unused_forwarded_port_;
70 uint16 min_port_;
71 uint16 max_port_;
74 #endif // CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_