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
26 package sun.nio.ch;
27
28 import java.nio.ByteBuffer;
29 import jdk.internal.ref.Cleaner;
30
31
32 /**
33 * Manipulates a native array of iovec structs on Solaris:
34 *
35 * typedef struct iovec {
36 * caddr_t iov_base;
37 int iov_len;
38 * } iovec_t;
39 *
40 * @author Mike McCloskey
41 * @since 1.4
42 */
43
44 class IOVecWrapper {
45
46 // Miscellaneous constants
47 private static final int BASE_OFFSET = 0;
48 private static final int LEN_OFFSET;
49 private static final int SIZE_IOVEC;
84
85 private IOVecWrapper(int size) {
86 this.size = size;
87 this.buf = new ByteBuffer[size];
88 this.position = new int[size];
89 this.remaining = new int[size];
90 this.shadow = new ByteBuffer[size];
91 this.vecArray = new AllocatedNativeObject(size * SIZE_IOVEC, false);
92 this.address = vecArray.address();
93 }
94
95 static IOVecWrapper get(int size) {
96 IOVecWrapper wrapper = cached.get();
97 if (wrapper != null && wrapper.size < size) {
98 // not big enough; eagerly release memory
99 wrapper.vecArray.free();
100 wrapper = null;
101 }
102 if (wrapper == null) {
103 wrapper = new IOVecWrapper(size);
104 Cleaner.create(wrapper, new Deallocator(wrapper.vecArray));
105 cached.set(wrapper);
106 }
107 return wrapper;
108 }
109
110 void setBuffer(int i, ByteBuffer buf, int pos, int rem) {
111 this.buf[i] = buf;
112 this.position[i] = pos;
113 this.remaining[i] = rem;
114 }
115
116 void setShadow(int i, ByteBuffer buf) {
117 shadow[i] = buf;
118 }
119
120 ByteBuffer getBuffer(int i) {
121 return buf[i];
122 }
123
124 int getPosition(int i) {
|
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
26 package sun.nio.ch;
27
28 import java.nio.ByteBuffer;
29 import jdk.internal.ref.CleanerFactory;
30
31
32 /**
33 * Manipulates a native array of iovec structs on Solaris:
34 *
35 * typedef struct iovec {
36 * caddr_t iov_base;
37 int iov_len;
38 * } iovec_t;
39 *
40 * @author Mike McCloskey
41 * @since 1.4
42 */
43
44 class IOVecWrapper {
45
46 // Miscellaneous constants
47 private static final int BASE_OFFSET = 0;
48 private static final int LEN_OFFSET;
49 private static final int SIZE_IOVEC;
84
85 private IOVecWrapper(int size) {
86 this.size = size;
87 this.buf = new ByteBuffer[size];
88 this.position = new int[size];
89 this.remaining = new int[size];
90 this.shadow = new ByteBuffer[size];
91 this.vecArray = new AllocatedNativeObject(size * SIZE_IOVEC, false);
92 this.address = vecArray.address();
93 }
94
95 static IOVecWrapper get(int size) {
96 IOVecWrapper wrapper = cached.get();
97 if (wrapper != null && wrapper.size < size) {
98 // not big enough; eagerly release memory
99 wrapper.vecArray.free();
100 wrapper = null;
101 }
102 if (wrapper == null) {
103 wrapper = new IOVecWrapper(size);
104 CleanerFactory.cleaner().register(wrapper, new Deallocator(wrapper.vecArray));
105 cached.set(wrapper);
106 }
107 return wrapper;
108 }
109
110 void setBuffer(int i, ByteBuffer buf, int pos, int rem) {
111 this.buf[i] = buf;
112 this.position[i] = pos;
113 this.remaining[i] = rem;
114 }
115
116 void setShadow(int i, ByteBuffer buf) {
117 shadow[i] = buf;
118 }
119
120 ByteBuffer getBuffer(int i) {
121 return buf[i];
122 }
123
124 int getPosition(int i) {
|