90 static void releaseNativeBuffer(NativeBuffer buffer) { 91 // create cache if it doesn't exist 92 NativeBuffer[] buffers = threadLocal.get(); 93 if (buffers == null) { 94 buffers = new NativeBuffer[TEMP_BUF_POOL_SIZE]; 95 buffers[0] = buffer; 96 threadLocal.set(buffers); 97 return; 98 } 99 // Put it in an empty slot if such exists 100 for (int i=0; i<TEMP_BUF_POOL_SIZE; i++) { 101 if (buffers[i] == null) { 102 buffers[i] = buffer; 103 return; 104 } 105 } 106 // Otherwise replace a smaller one in the cache if such exists 107 for (int i=0; i<TEMP_BUF_POOL_SIZE; i++) { 108 NativeBuffer existing = buffers[i]; 109 if (existing.size() < buffer.size()) { 110 existing.cleaner().clean(); 111 buffers[i] = buffer; 112 return; 113 } 114 } 115 116 // free it 117 buffer.cleaner().clean(); 118 } 119 120 /** 121 * Copies a byte array and zero terminator into a given native buffer. 122 */ 123 static void copyCStringToNativeBuffer(byte[] cstr, NativeBuffer buffer) { 124 long offset = Unsafe.ARRAY_BYTE_BASE_OFFSET; 125 long len = cstr.length; 126 assert buffer.size() >= (len + 1); 127 unsafe.copyMemory(cstr, offset, null, buffer.address(), len); 128 unsafe.putByte(buffer.address() + len, (byte)0); 129 } 130 131 /** 132 * Copies a byte array and zero terminator into a native buffer, returning 133 * the buffer. 134 */ 135 static NativeBuffer asNativeBuffer(byte[] cstr) { 136 NativeBuffer buffer = getNativeBuffer(cstr.length+1); 137 copyCStringToNativeBuffer(cstr, buffer); | 90 static void releaseNativeBuffer(NativeBuffer buffer) { 91 // create cache if it doesn't exist 92 NativeBuffer[] buffers = threadLocal.get(); 93 if (buffers == null) { 94 buffers = new NativeBuffer[TEMP_BUF_POOL_SIZE]; 95 buffers[0] = buffer; 96 threadLocal.set(buffers); 97 return; 98 } 99 // Put it in an empty slot if such exists 100 for (int i=0; i<TEMP_BUF_POOL_SIZE; i++) { 101 if (buffers[i] == null) { 102 buffers[i] = buffer; 103 return; 104 } 105 } 106 // Otherwise replace a smaller one in the cache if such exists 107 for (int i=0; i<TEMP_BUF_POOL_SIZE; i++) { 108 NativeBuffer existing = buffers[i]; 109 if (existing.size() < buffer.size()) { 110 existing.free(); 111 buffers[i] = buffer; 112 return; 113 } 114 } 115 116 // free it 117 buffer.free(); 118 } 119 120 /** 121 * Copies a byte array and zero terminator into a given native buffer. 122 */ 123 static void copyCStringToNativeBuffer(byte[] cstr, NativeBuffer buffer) { 124 long offset = Unsafe.ARRAY_BYTE_BASE_OFFSET; 125 long len = cstr.length; 126 assert buffer.size() >= (len + 1); 127 unsafe.copyMemory(cstr, offset, null, buffer.address(), len); 128 unsafe.putByte(buffer.address() + len, (byte)0); 129 } 130 131 /** 132 * Copies a byte array and zero terminator into a native buffer, returning 133 * the buffer. 134 */ 135 static NativeBuffer asNativeBuffer(byte[] cstr) { 136 NativeBuffer buffer = getNativeBuffer(cstr.length+1); 137 copyCStringToNativeBuffer(cstr, buffer); |