aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/manager/ipc_driver.go
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()
}