mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "NetIdManager.h"
|
|
|
|
NetIdManager::NetIdManager()
|
|
: mNextNetId(MIN_NET_ID)
|
|
{
|
|
}
|
|
|
|
int NetIdManager::getNextNetId()
|
|
{
|
|
// Modified from
|
|
// http://androidxref.com/5.0.0_r2/xref/frameworks/base/services/
|
|
// core/java/com/android/server/ConnectivityService.java#764
|
|
|
|
int netId = mNextNetId;
|
|
if (++mNextNetId > MAX_NET_ID) {
|
|
mNextNetId = MIN_NET_ID;
|
|
}
|
|
|
|
return netId;
|
|
}
|
|
|
|
void NetIdManager::acquire(const nsString& aInterfaceName,
|
|
NetIdInfo* aNetIdInfo)
|
|
{
|
|
// Lookup or create one.
|
|
if (!mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo)) {
|
|
aNetIdInfo->mNetId = getNextNetId();
|
|
aNetIdInfo->mRefCnt = 1;
|
|
} else {
|
|
aNetIdInfo->mRefCnt++;
|
|
}
|
|
|
|
// Update hash and return.
|
|
mInterfaceToNetIdHash.Put(aInterfaceName, *aNetIdInfo);
|
|
|
|
return;
|
|
}
|
|
|
|
bool NetIdManager::lookup(const nsString& aInterfaceName,
|
|
NetIdInfo* aNetIdInfo)
|
|
{
|
|
return mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo);
|
|
}
|
|
|
|
bool NetIdManager::release(const nsString& aInterfaceName,
|
|
NetIdInfo* aNetIdInfo)
|
|
{
|
|
if (!mInterfaceToNetIdHash.Get(aInterfaceName, aNetIdInfo)) {
|
|
return false; // No such key.
|
|
}
|
|
|
|
aNetIdInfo->mRefCnt--;
|
|
|
|
// Update the hash if still be referenced.
|
|
if (aNetIdInfo->mRefCnt > 0) {
|
|
mInterfaceToNetIdHash.Put(aInterfaceName, *aNetIdInfo);
|
|
return true;
|
|
}
|
|
|
|
// No longer be referenced. Remove the entry.
|
|
mInterfaceToNetIdHash.Remove(aInterfaceName);
|
|
|
|
return true;
|
|
} |