Home | History | Annotate | Download | only in net
      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.
      4 
      5 #ifndef CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_
      6 #define CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_
      7 
      8 #include <list>
      9 #include <set>
     10 #include <string>
     11 
     12 #include "base/callback.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/synchronization/lock.h"
     15 
     16 class Status;
     17 
     18 class PortReservation {
     19  public:
     20   PortReservation(const base::Closure& on_free_func, int port);
     21   ~PortReservation();
     22 
     23   void Leak();
     24 
     25  private:
     26   base::Closure on_free_func_;
     27   int port_;
     28 };
     29 
     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();
     37 
     38   Status ReservePort(int* port, scoped_ptr<PortReservation>* reservation);
     39 
     40  private:
     41   Status RequestPort(int* port);
     42   void ReleasePort(int port);
     43 
     44   std::string path_;
     45 
     46   base::Lock free_lock_;
     47   std::list<int> free_;
     48 };
     49 
     50 // Manages reservation of a block of local ports.
     51 class PortManager {
     52  public:
     53   PortManager(int min_port, int max_port);
     54   ~PortManager();
     55 
     56   Status ReservePort(int* 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(int* port,
     60                              scoped_ptr<PortReservation>* reservation);
     61 
     62  private:
     63   int FindAvailablePort() const;
     64   void ReleasePort(int port);
     65   void ReleasePortToPool(int port);
     66 
     67   base::Lock lock_;
     68   std::set<int> taken_;
     69   std::list<int> unused_forwarded_port_;
     70   int min_port_;
     71   int max_port_;
     72 };
     73 
     74 #endif  // CHROME_TEST_CHROMEDRIVER_NET_PORT_SERVER_H_
     75