blob: dae213de73f33cde337f3d9521c813bf3d7bf611 (
plain) (
blame)
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
|
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
*/
package manager
import (
"sync"
"golang.zx2c4.com/wireguard/windows/driver"
)
type lockedDriverAdapter struct {
*driver.Adapter
sync.Mutex
}
var driverAdapters = make(map[string]*lockedDriverAdapter)
var driverAdaptersLock sync.RWMutex
func findDriverAdapter(tunnelName string) (*lockedDriverAdapter, error) {
driverAdaptersLock.RLock()
driverAdapter, ok := driverAdapters[tunnelName]
if ok {
driverAdapter.Lock()
driverAdaptersLock.RUnlock()
return driverAdapter, nil
}
driverAdaptersLock.RUnlock()
driverAdaptersLock.Lock()
defer driverAdaptersLock.Unlock()
driverAdapter, ok = driverAdapters[tunnelName]
if ok {
driverAdapter.Lock()
return driverAdapter, nil
}
driverAdapter = &lockedDriverAdapter{}
var err error
driverAdapter.Adapter, err = driver.DefaultPool.OpenAdapter(tunnelName)
if err != nil {
return nil, err
}
driverAdapters[tunnelName] = driverAdapter
driverAdapter.Lock()
return driverAdapter, nil
}
func releaseDriverAdapter(tunnelName string) {
driverAdaptersLock.Lock()
defer driverAdaptersLock.Unlock()
driverAdapter, ok := driverAdapters[tunnelName]
if !ok {
return
}
driverAdapter.Lock()
delete(driverAdapters, tunnelName)
driverAdapter.Unlock()
}
|