Chromium Code Reviews| Index: runtime/vm/port.cc |
| =================================================================== |
| --- runtime/vm/port.cc (revision 34525) |
| +++ runtime/vm/port.cc (working copy) |
| @@ -20,7 +20,7 @@ |
| intptr_t PortMap::capacity_ = 0; |
| intptr_t PortMap::used_ = 0; |
| intptr_t PortMap::deleted_ = 0; |
| -Dart_Port PortMap::next_port_ = 7111; |
| +Random* PortMap::prng_ = NULL; |
| intptr_t PortMap::FindPort(Dart_Port port) { |
| @@ -63,15 +63,17 @@ |
| Dart_Port PortMap::AllocatePort() { |
| - Dart_Port result = next_port_; |
| + const Dart_Port kMASK = 0x3fffffff; |
| + Dart_Port result = prng_->NextUInt32() & kMASK; |
| - do { |
| - // TODO(iposva): Use an approved hashing function to have less predictable |
| - // port ids, or make them not accessible from Dart code or both. |
| - next_port_++; |
| - } while (FindPort(next_port_) >= 0); |
| + // Keep getting new values while we have an illegal port number or the port |
| + // number is already in use. |
| + while ((result == 0) || (FindPort(result) >= 0)) { |
|
hausner
2014/03/28 23:27:30
You could turn this into a do { } while() loop.
Ivan Posva
2014/03/28 23:39:26
I tried to write it as an repeat-until, but that s
|
| + result = prng_->NextUInt32() & kMASK; |
| + } |
| ASSERT(result != 0); |
| + ASSERT(FindPort(result) < 0); |
| return result; |
| } |
| @@ -258,6 +260,7 @@ |
| void PortMap::InitOnce() { |
| mutex_ = new Mutex(); |
| + prng_ = new Random(); |
| static const intptr_t kInitialCapacity = 8; |
| // TODO(iposva): Verify whether we want to keep exponentially growing. |