Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(239)

Side by Side Diff: src/pkg/net/sock.go

Issue 164057: code review 164057: 'close' race fixed/suggestions from rcs (Closed)
Patch Set: code review 164057: 'close' race fixed/suggestions from rcs Created 15 years, 4 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2009 The Go Authors. All rights reserved. 1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style 2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file. 3 // license that can be found in the LICENSE file.
4 4
5 // Sockets 5 // Sockets
6 6
7 package net 7 package net
8 8
9 import ( 9 import (
10 "os"; 10 "os";
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 func setsockoptInt(fd, level, opt int, value int) os.Error { 68 func setsockoptInt(fd, level, opt int, value int) os.Error {
69 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, level, opt, value)) 69 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, level, opt, value))
70 } 70 }
71 71
72 func setsockoptNsec(fd, level, opt int, nsec int64) os.Error { 72 func setsockoptNsec(fd, level, opt int, nsec int64) os.Error {
73 var tv = syscall.NsecToTimeval(nsec); 73 var tv = syscall.NsecToTimeval(nsec);
74 return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, le vel, opt, &tv)); 74 return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, le vel, opt, &tv));
75 } 75 }
76 76
77 func setReadBuffer(fd *netFD, bytes int) os.Error { 77 func setReadBuffer(fd *netFD, bytes int) os.Error {
78 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes ) 78 » fd.incref();
79 » defer fd.decref();
80 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, by tes);
79 } 81 }
80 82
81 func setWriteBuffer(fd *netFD, bytes int) os.Error { 83 func setWriteBuffer(fd *netFD, bytes int) os.Error {
82 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes ) 84 » fd.incref();
85 » defer fd.decref();
86 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, by tes);
83 } 87 }
84 88
85 func setReadTimeout(fd *netFD, nsec int64) os.Error { 89 func setReadTimeout(fd *netFD, nsec int64) os.Error {
86 fd.rdeadline_delta = nsec; 90 fd.rdeadline_delta = nsec;
87 return nil; 91 return nil;
88 } 92 }
89 93
90 func setWriteTimeout(fd *netFD, nsec int64) os.Error { 94 func setWriteTimeout(fd *netFD, nsec int64) os.Error {
91 fd.wdeadline_delta = nsec; 95 fd.wdeadline_delta = nsec;
92 return nil; 96 return nil;
93 } 97 }
94 98
95 func setTimeout(fd *netFD, nsec int64) os.Error { 99 func setTimeout(fd *netFD, nsec int64) os.Error {
96 if e := setReadTimeout(fd, nsec); e != nil { 100 if e := setReadTimeout(fd, nsec); e != nil {
97 return e 101 return e
98 } 102 }
99 return setWriteTimeout(fd, nsec); 103 return setWriteTimeout(fd, nsec);
100 } 104 }
101 105
102 func setReuseAddr(fd *netFD, reuse bool) os.Error { 106 func setReuseAddr(fd *netFD, reuse bool) os.Error {
103 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, bo olint(reuse)) 107 » fd.incref();
108 » defer fd.decref();
109 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse));
104 } 110 }
105 111
106 func bindToDevice(fd *netFD, dev string) os.Error { 112 func bindToDevice(fd *netFD, dev string) os.Error {
107 // TODO(rsc): call setsockopt with null-terminated string pointer 113 // TODO(rsc): call setsockopt with null-terminated string pointer
108 return os.EINVAL 114 return os.EINVAL
109 } 115 }
110 116
111 func setDontRoute(fd *netFD, dontroute bool) os.Error { 117 func setDontRoute(fd *netFD, dontroute bool) os.Error {
112 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, bo olint(dontroute)) 118 » fd.incref();
119 » defer fd.decref();
120 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute));
113 } 121 }
114 122
115 func setKeepAlive(fd *netFD, keepalive bool) os.Error { 123 func setKeepAlive(fd *netFD, keepalive bool) os.Error {
116 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, bo olint(keepalive)) 124 » fd.incref();
125 » defer fd.decref();
126 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive));
117 } 127 }
118 128
119 func setLinger(fd *netFD, sec int) os.Error { 129 func setLinger(fd *netFD, sec int) os.Error {
120 var l syscall.Linger; 130 var l syscall.Linger;
121 if sec >= 0 { 131 if sec >= 0 {
122 l.Onoff = 1; 132 l.Onoff = 1;
123 l.Linger = int32(sec); 133 l.Linger = int32(sec);
124 } else { 134 } else {
125 l.Onoff = 0; 135 l.Onoff = 0;
126 l.Linger = 0; 136 l.Linger = 0;
127 } 137 }
128 » e := syscall.SetsockoptLinger(fd.fd, syscall.SOL_SOCKET, syscall.SO_LING ER, &l); 138 » fd.incref();
139 » defer fd.decref();
140 » e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_L INGER, &l);
129 return os.NewSyscallError("setsockopt", e); 141 return os.NewSyscallError("setsockopt", e);
130 } 142 }
131 143
132 type UnknownSocketError struct { 144 type UnknownSocketError struct {
133 sa syscall.Sockaddr; 145 sa syscall.Sockaddr;
134 } 146 }
135 147
136 func (e *UnknownSocketError) String() string { 148 func (e *UnknownSocketError) String() string {
137 return "unknown socket address type " + reflect.Typeof(e.sa).String() 149 return "unknown socket address type " + reflect.Typeof(e.sa).String()
138 } 150 }
139 151
140 func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) { 152 func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) {
141 switch a := sa.(type) { 153 switch a := sa.(type) {
142 case *syscall.SockaddrInet4: 154 case *syscall.SockaddrInet4:
143 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil 155 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil
144 case *syscall.SockaddrInet6: 156 case *syscall.SockaddrInet6:
145 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil 157 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil
146 case *syscall.SockaddrUnix: 158 case *syscall.SockaddrUnix:
147 return a.Name, nil 159 return a.Name, nil
148 } 160 }
149 161
150 return "", &UnknownSocketError{sa}; 162 return "", &UnknownSocketError{sa};
151 } 163 }
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b