zhangmeng
2019-08-26 3bd1f29975c0eaa6af8c99776b099faafbbfc250
提交 | 用户 | age
3bd1f2 1 // Copyright 2016 Tom Thorogood. All rights reserved.
Z 2 // Use of this source code is governed by a
3 // Modified BSD License license that can be found in
4 // the LICENSE file.
5
6 package net
7
8 import (
9     "errors"
10     "net"
11     "sync"
12
13     "github.com/tmthrgd/shm-go"
14 )
15
16 type Dialer struct {
17     rw   *shm.ReadWriteCloser
18     name string
19
20     mut sync.Mutex
21 }
22
23 func Dial(name string) (net.Conn, error) {
24     rw, err := shm.OpenDuplex(name)
25     if err != nil {
26         return nil, err
27     }
28
29     return (&Dialer{
30         rw:   rw,
31         name: name,
32     }).Dial("shm", name)
33 }
34
35 func NewDialer(rw *shm.ReadWriteCloser, name string) *Dialer {
36     return &Dialer{
37         rw:   rw,
38         name: name,
39     }
40 }
41
42 func (d *Dialer) Dial(network, address string) (net.Conn, error) {
43     if network != "shm" {
44         return nil, errors.New("unrecognised network")
45     }
46
47     if address != d.name {
48         return nil, errors.New("invalid address")
49     }
50
51     d.mut.Lock()
52     return &Conn{d.rw, d.name, &d.mut}, nil
53 }