Skip to content

Commit cec9653

Browse files
committed
Guard all native code execution behind the shared lock ...
... in the ZstdCompressionCtx and ZstdDecompressionCtx.
1 parent 9b08f1d commit cec9653

File tree

2 files changed

+58
-25
lines changed

2 files changed

+58
-25
lines changed

src/main/java/com/github/luben/zstd/ZstdCompressCtx.java

+35-15
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,12 @@ public ZstdCompressCtx loadDict(byte[] dict) {
437437
*/
438438
public ZstdFrameProgression getFrameProgression() {
439439
ensureOpen();
440-
return getFrameProgression0(nativePtr);
440+
acquireSharedLock();
441+
try {
442+
return getFrameProgression0(nativePtr);
443+
} finally {
444+
releaseSharedLock();
445+
}
441446
}
442447
private static native ZstdFrameProgression getFrameProgression0(long ptr);
443448

@@ -447,10 +452,16 @@ public ZstdFrameProgression getFrameProgression() {
447452
*/
448453
public void reset() {
449454
ensureOpen();
450-
long result = reset0(nativePtr);
451-
if (Zstd.isError(result)) {
452-
throw new ZstdException(result);
455+
acquireSharedLock();
456+
try {
457+
long result = reset0(nativePtr);
458+
if (Zstd.isError(result)) {
459+
throw new ZstdException(result);
460+
}
461+
} finally {
462+
releaseSharedLock();
453463
}
464+
454465
}
455466
private static native long reset0(long ptr);
456467

@@ -464,9 +475,14 @@ public void reset() {
464475
*/
465476
public void setPledgedSrcSize(long srcSize) {
466477
ensureOpen();
467-
long result = setPledgedSrcSize0(nativePtr, srcSize);
468-
if (Zstd.isError(result)) {
469-
throw new ZstdException(result);
478+
acquireSharedLock();
479+
try {
480+
long result = setPledgedSrcSize0(nativePtr, srcSize);
481+
if (Zstd.isError(result)) {
482+
throw new ZstdException(result);
483+
}
484+
} finally {
485+
releaseSharedLock();
470486
}
471487
}
472488
private static native long setPledgedSrcSize0(long ptr, long srcSize);
@@ -482,14 +498,19 @@ public void setPledgedSrcSize(long srcSize) {
482498
*/
483499
public boolean compressDirectByteBufferStream(ByteBuffer dst, ByteBuffer src, EndDirective endOp) {
484500
ensureOpen();
485-
long result = compressDirectByteBufferStream0(nativePtr, dst, dst.position(), dst.limit(), src, src.position(), src.limit(), endOp.value());
486-
if ((result & 0x80000000L) != 0) {
487-
long code = result & 0xFF;
488-
throw new ZstdException(code, Zstd.getErrorName(code));
501+
acquireSharedLock();
502+
try {
503+
long result = compressDirectByteBufferStream0(nativePtr, dst, dst.position(), dst.limit(), src, src.position(), src.limit(), endOp.value());
504+
if ((result & 0x80000000L) != 0) {
505+
long code = result & 0xFF;
506+
throw new ZstdException(code, Zstd.getErrorName(code));
507+
}
508+
src.position((int)(result & 0x7FFFFFFF));
509+
dst.position((int)(result >>> 32) & 0x7FFFFFFF);
510+
return (result >>> 63) == 1;
511+
} finally {
512+
releaseSharedLock();
489513
}
490-
src.position((int)(result & 0x7FFFFFFF));
491-
dst.position((int)(result >>> 32) & 0x7FFFFFFF);
492-
return (result >>> 63) == 1;
493514
}
494515

495516
/**
@@ -604,7 +625,6 @@ public int compressByteArray(byte[] dstBuff, int dstOffset, int dstSize, byte[]
604625
* @return the size of the compressed data
605626
*/
606627
public int compress(ByteBuffer dstBuf, ByteBuffer srcBuf) {
607-
608628
int size = compressDirectByteBuffer(dstBuf, // compress into dstBuf
609629
dstBuf.position(), // write compressed data starting at offset position()
610630
dstBuf.limit() - dstBuf.position(), // write no more than limit() - position() bytes

src/main/java/com/github/luben/zstd/ZstdDecompressCtx.java

+23-10
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,18 @@ public ZstdDecompressCtx loadDict(byte[] dict) {
101101
*/
102102
public void reset() {
103103
ensureOpen();
104-
reset0(nativePtr);
104+
acquireSharedLock();
105+
try {
106+
long result = reset0(nativePtr);
107+
if (Zstd.isError(result)) {
108+
throw new ZstdException(result);
109+
}
110+
} finally {
111+
releaseSharedLock();
112+
}
113+
105114
}
106-
private static native void reset0(long nativePtr);
115+
private static native long reset0(long nativePtr);
107116

108117
private void ensureOpen() {
109118
if (nativePtr == 0) {
@@ -121,14 +130,19 @@ private void ensureOpen() {
121130
*/
122131
public boolean decompressDirectByteBufferStream(ByteBuffer dst, ByteBuffer src) {
123132
ensureOpen();
124-
long result = decompressDirectByteBufferStream0(nativePtr, dst, dst.position(), dst.limit(), src, src.position(), src.limit());
125-
if ((result & 0x80000000L) != 0) {
126-
long code = result & 0xFF;
127-
throw new ZstdException(code, Zstd.getErrorName(code));
133+
acquireSharedLock();
134+
try {
135+
long result = decompressDirectByteBufferStream0(nativePtr, dst, dst.position(), dst.limit(), src, src.position(), src.limit());
136+
if ((result & 0x80000000L) != 0) {
137+
long code = result & 0xFF;
138+
throw new ZstdException(code, Zstd.getErrorName(code));
139+
}
140+
src.position((int)(result & 0x7FFFFFFF));
141+
dst.position((int)(result >>> 32) & 0x7FFFFFFF);
142+
return (result >>> 63) == 1;
143+
} finally {
144+
releaseSharedLock();
128145
}
129-
src.position((int)(result & 0x7FFFFFFF));
130-
dst.position((int)(result >>> 32) & 0x7FFFFFFF);
131-
return (result >>> 63) == 1;
132146
}
133147

134148
/**
@@ -242,7 +256,6 @@ public int decompressByteArray(byte[] dstBuff, int dstOffset, int dstSize, byte[
242256
* @return the size of the decompressed data.
243257
*/
244258
public int decompress(ByteBuffer dstBuf, ByteBuffer srcBuf) throws ZstdException {
245-
246259
int size = decompressDirectByteBuffer(dstBuf, // decompress into dstBuf
247260
dstBuf.position(), // write decompressed data at offset position()
248261
dstBuf.limit() - dstBuf.position(), // write no more than limit() - position()

0 commit comments

Comments
 (0)