History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/nio/ch/MembershipKeyImpl.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/nio/ch/MembershipKeyImpl.java+220−0
@@ -0,0 +1,220 @@
1/*
2 * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.nio.ch;
27
28import java.nio.channels.*;
29import java.net.InetAddress;
30import java.net.NetworkInterface;
31import java.io.IOException;
32import java.util.HashSet;
33
34/**
35 * MembershipKey implementation.
36 */
37
38class MembershipKeyImpl
39 extends MembershipKey
40{
41 private final MulticastChannel ch;
42 private final InetAddress group;
43 private final NetworkInterface interf;
44 private final InetAddress source;
45
46 // true when key is valid
47 private volatile boolean valid = true;
48
49 // lock used when creating or accessing blockedSet
50 private Object stateLock = new Object();
51
52 // set of source addresses that are blocked
53 private HashSet<InetAddress> blockedSet;
54
55 private MembershipKeyImpl(MulticastChannel ch,
56 InetAddress group,
57 NetworkInterface interf,
58 InetAddress source)
59 {
60 this.ch = ch;
61 this.group = group;
62 this.interf = interf;
63 this.source = source;
64 }
65
66 /**
67 * MembershipKey will additional context for IPv4 membership
68 */
69 static class Type4 extends MembershipKeyImpl {
70 private final int groupAddress;
71 private final int interfAddress;
72 private final int sourceAddress;
73
74 Type4(MulticastChannel ch,
75 InetAddress group,
76 NetworkInterface interf,
77 InetAddress source,
78 int groupAddress,
79 int interfAddress,
80 int sourceAddress)
81 {
82 super(ch, group, interf, source);
83 this.groupAddress = groupAddress;
84 this.interfAddress = interfAddress;
85 this.sourceAddress = sourceAddress;
86 }
87
88 int groupAddress() {
89 return groupAddress;
90 }
91
92 int interfaceAddress() {
93 return interfAddress;
94 }
95
96 int source() {
97 return sourceAddress;
98 }
99 }
100
101 /**
102 * MembershipKey will additional context for IPv6 membership
103 */
104 static class Type6 extends MembershipKeyImpl {
105 private final byte[] groupAddress;
106 private final int index;
107 private final byte[] sourceAddress;
108
109 Type6(MulticastChannel ch,
110 InetAddress group,
111 NetworkInterface interf,
112 InetAddress source,
113 byte[] groupAddress,
114 int index,
115 byte[] sourceAddress)
116 {
117 super(ch, group, interf, source);
118 this.groupAddress = groupAddress;
119 this.index = index;
120 this.sourceAddress = sourceAddress;
121 }
122
123 byte[] groupAddress() {
124 return groupAddress;
125 }
126
127 int index() {
128 return index;
129 }
130
131 byte[] source() {
132 return sourceAddress;
133 }
134 }
135
136 public boolean isValid() {
137 return valid;
138 }
139
140 // package-private
141 void invalidate() {
142 valid = false;
143 }
144
145 public void drop() {
146 // delegate to channel
147 ((DatagramChannelImpl)ch).drop(this);
148 }
149
150 @Override
151 public MulticastChannel channel() {
152 return ch;
153 }
154
155 @Override
156 public InetAddress group() {
157 return group;
158 }
159
160 @Override
161 public NetworkInterface networkInterface() {
162 return interf;
163 }
164
165 @Override
166 public InetAddress sourceAddress() {
167 return source;
168 }
169
170 @Override
171 public MembershipKey block(InetAddress toBlock)
172 throws IOException
173 {
174 if (source != null)
175 throw new IllegalStateException("key is source-specific");
176
177 synchronized (stateLock) {
178 if ((blockedSet != null) && blockedSet.contains(toBlock)) {
179 // already blocked, nothing to do
180 return this;
181 }
182
183 ((DatagramChannelImpl)ch).block(this, toBlock);
184
185 // created blocked set if required and add source address
186 if (blockedSet == null)
187 blockedSet = new HashSet<InetAddress>();
188 blockedSet.add(toBlock);
189 }
190 return this;
191 }
192
193 @Override
194 public MembershipKey unblock(InetAddress toUnblock) {
195 synchronized (stateLock) {
196 if ((blockedSet == null) || !blockedSet.contains(toUnblock))
197 throw new IllegalStateException("not blocked");
198
199 ((DatagramChannelImpl)ch).unblock(this, toUnblock);
200
201 blockedSet.remove(toUnblock);
202 }
203 return this;
204 }
205
206 @Override
207 public String toString() {
208 StringBuilder sb = new StringBuilder(64);
209 sb.append('<');
210 sb.append(group.getHostAddress());
211 sb.append(',');
212 sb.append(interf.getName());
213 if (source != null) {
214 sb.append(',');
215 sb.append(source.getHostAddress());
216 }
217 sb.append('>');
218 return sb.toString();
219 }
220}