File: tcp_port_pool.h

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (89 lines) | stat: -rw-r--r-- 2,691 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
  Copyright (c) 2018, 2025, Oracle and/or its affiliates.

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 2.0,
  as published by the Free Software Foundation.

  This program is designed to work with certain software (including
  but not limited to OpenSSL) that is licensed under separate terms,
  as designated in a particular file or component or in included license
  documentation.  The authors of MySQL hereby grant you an additional
  permission to link the program and your derivative works with the
  separately licensed software that they have either included with
  the program or referenced in the documentation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef _TCP_PORT_POOL_H_
#define _TCP_PORT_POOL_H_

#include <chrono>
#include <cstdint>
#include <string>
#include <vector>

/** @class UniqueID
 *
 * Helper class allowing mechanism to retrieve system-level unique identifier.
 * Compatible with mysql-test MTR, see mysql-test/lib/mtr_unique.pm for details
 *
 **/
class UniqueId {
 public:
  UniqueId(unsigned start_from, unsigned range);
  UniqueId(UniqueId &&other);
  ~UniqueId();

  UniqueId(const UniqueId &) = delete;
  UniqueId &operator=(const UniqueId &) = delete;

  unsigned get() const { return id_; }

 private:
  bool lock_file(const std::string &file_name);
  std::string get_lock_file_dir() const;

  uint16_t id_;
#ifndef _WIN32
  int lock_file_fd_;
#else
  HANDLE lock_file_fd_;
#endif
  std::string lock_file_name_;
};

/** @class TcpPortPool
 *
 * Helper class allowing mechanism to retrieve pool of the system-level unique
 *TCP port numbers. Compatible with mysql-test MTR, see
 *mysql-test/lib/mtr_unique.pm for details.
 *
 **/
class TcpPortPool {
 public:
  TcpPortPool() = default;

  TcpPortPool(const TcpPortPool &) = delete;
  TcpPortPool &operator=(const TcpPortPool &) = delete;
  TcpPortPool(TcpPortPool &&other) = default;

  uint16_t get_next_available();

 private:
  std::vector<UniqueId> unique_ids_;
  unsigned number_of_ids_used_{0};
  static const constexpr unsigned kPortsPerFile{10};
  static const constexpr unsigned kPortsStartFrom{100};
  static const constexpr unsigned kPortsRange{500};
};

#endif  // _TCP_PORT_POOL_H_