Skip to content

Commit 003792b

Browse files
fix memory leaks
1 parent fa92366 commit 003792b

20 files changed

+194
-172
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group 'io.tiledb'
12-
version '0.19.1-SNAPSHOT'
12+
version '0.19.2-SNAPSHOT'
1313

1414
repositories {
1515
jcenter()

src/main/java/io/tiledb/java/api/Array.java

Lines changed: 103 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -171,32 +171,23 @@ private synchronized void openArray(
171171

172172
if (timestamp_start != null) {
173173
Util.checkBigIntegerRange(timestamp_start);
174-
try {
175-
ctx.handleError(
176-
tiledb.tiledb_array_set_open_timestamp_start(ctx.getCtxp(), _arrayp, timestamp_start));
177-
} catch (TileDBError err) {
178-
throw err;
179-
}
174+
ctx.handleError(
175+
tiledb.tiledb_array_set_open_timestamp_start(ctx.getCtxp(), _arrayp, timestamp_start));
180176
}
181177

182178
if (timestamp_end != null) {
183179
Util.checkBigIntegerRange(timestamp_end);
184-
try {
185-
ctx.handleError(
186-
tiledb.tiledb_array_set_open_timestamp_end(ctx.getCtxp(), _arrayp, timestamp_end));
187-
} catch (TileDBError err) {
188-
throw err;
189-
}
180+
ctx.handleError(
181+
tiledb.tiledb_array_set_open_timestamp_end(ctx.getCtxp(), _arrayp, timestamp_end));
190182
}
191183

192-
ArraySchema _schema;
193184
try {
194185
ctx.handleError(tiledb.tiledb_array_open(ctx.getCtxp(), _arrayp, query_type.toSwigEnum()));
195186
} catch (TileDBError err) {
196187
tiledb.delete_tiledb_array_tpp(_arraypp);
197188
throw err;
198189
}
199-
_schema = new ArraySchema(ctx, uri);
190+
ArraySchema _schema = new ArraySchema(ctx, uri);
200191

201192
this.ctx = ctx;
202193
this.uri = uri;
@@ -514,12 +505,17 @@ public Pair<BigInteger, BigInteger> getNonEmptyDomainVarSizeFromIndex(long index
514505
SWIGTYPE_p_int emptyp = tiledb.new_intp();
515506
SWIGTYPE_p_unsigned_long_long startSize = tiledb.new_ullp();
516507
SWIGTYPE_p_unsigned_long_long endSize = tiledb.new_ullp();
508+
try {
509+
ctx.handleError(
510+
tiledb.tiledb_array_get_non_empty_domain_var_size_from_index(
511+
ctx.getCtxp(), arrayp, index, startSize, endSize, emptyp));
517512

518-
ctx.handleError(
519-
tiledb.tiledb_array_get_non_empty_domain_var_size_from_index(
520-
ctx.getCtxp(), arrayp, index, startSize, endSize, emptyp));
521-
522-
return new Pair(tiledb.ullp_value(startSize), tiledb.ullp_value(endSize));
513+
return new Pair(tiledb.ullp_value(startSize), tiledb.ullp_value(endSize));
514+
} finally {
515+
tiledb.delete_ullp(startSize);
516+
tiledb.delete_ullp(endSize);
517+
tiledb.delete_intp(emptyp);
518+
}
523519
}
524520

525521
/**
@@ -558,11 +554,17 @@ public Pair<BigInteger, BigInteger> getNonEmptyDomainVarSizeFromName(String name
558554
SWIGTYPE_p_unsigned_long_long startSize = tiledb.new_ullp();
559555
SWIGTYPE_p_unsigned_long_long endSize = tiledb.new_ullp();
560556

561-
ctx.handleError(
562-
tiledb.tiledb_array_get_non_empty_domain_var_size_from_name(
563-
ctx.getCtxp(), arrayp, name, startSize, endSize, emptyp));
557+
try {
558+
ctx.handleError(
559+
tiledb.tiledb_array_get_non_empty_domain_var_size_from_name(
560+
ctx.getCtxp(), arrayp, name, startSize, endSize, emptyp));
564561

565-
return new Pair(tiledb.ullp_value(startSize), tiledb.ullp_value(endSize));
562+
return new Pair(tiledb.ullp_value(startSize), tiledb.ullp_value(endSize));
563+
} finally {
564+
tiledb.delete_ullp(startSize);
565+
tiledb.delete_ullp(endSize);
566+
tiledb.delete_intp(emptyp);
567+
}
566568
}
567569

568570
/**
@@ -576,23 +578,23 @@ public Pair<BigInteger, BigInteger> getNonEmptyDomainVarSizeFromName(String name
576578
*/
577579
public Pair<String, String> getNonEmptyDomainVarFromIndex(long index) throws TileDBError {
578580
SWIGTYPE_p_int emptyp = tiledb.new_intp();
579-
580581
Dimension dim = this.schema.getDomain().getDimension(index);
581582
Pair<BigInteger, BigInteger> size = this.getNonEmptyDomainVarSizeFromIndex(index);
582583

583584
Datatype dimType = dim.getType();
584585
int startSize = size.getFirst().intValue();
585586
int endSize = size.getSecond().intValue();
587+
try (NativeArray start = new NativeArray(ctx, startSize, dimType);
588+
NativeArray end = new NativeArray(ctx, endSize, dimType)) {
589+
ctx.handleError(
590+
tiledb.tiledb_array_get_non_empty_domain_var_from_index(
591+
ctx.getCtxp(), arrayp, index, start.toVoidPointer(), end.toVoidPointer(), emptyp));
586592

587-
NativeArray start = new NativeArray(ctx, startSize, dimType);
588-
NativeArray end = new NativeArray(ctx, endSize, dimType);
589-
590-
ctx.handleError(
591-
tiledb.tiledb_array_get_non_empty_domain_var_from_index(
592-
ctx.getCtxp(), arrayp, index, start.toVoidPointer(), end.toVoidPointer(), emptyp));
593-
594-
return new Pair(
595-
new String((byte[]) start.toJavaArray()), new String((byte[]) end.toJavaArray()));
593+
return new Pair(
594+
new String((byte[]) start.toJavaArray()), new String((byte[]) end.toJavaArray()));
595+
} finally {
596+
tiledb.delete_intp(emptyp);
597+
}
596598
}
597599

598600
/**
@@ -615,15 +617,17 @@ public Pair<String, String> getNonEmptyDomainVarFromName(String name) throws Til
615617
int startSize = size.getFirst().intValue();
616618
int endSize = size.getSecond().intValue();
617619

618-
NativeArray start = new NativeArray(ctx, startSize, dimType);
619-
NativeArray end = new NativeArray(ctx, endSize, dimType);
620-
621-
ctx.handleError(
622-
tiledb.tiledb_array_get_non_empty_domain_var_from_name(
623-
ctx.getCtxp(), arrayp, name, start.toVoidPointer(), end.toVoidPointer(), emptyp));
620+
try (NativeArray start = new NativeArray(ctx, startSize, dimType);
621+
NativeArray end = new NativeArray(ctx, endSize, dimType); ) {
622+
ctx.handleError(
623+
tiledb.tiledb_array_get_non_empty_domain_var_from_name(
624+
ctx.getCtxp(), arrayp, name, start.toVoidPointer(), end.toVoidPointer(), emptyp));
624625

625-
return new Pair(
626-
new String((byte[]) start.toJavaArray()), new String((byte[]) end.toJavaArray()));
626+
return new Pair(
627+
new String((byte[]) start.toJavaArray()), new String((byte[]) end.toJavaArray()));
628+
} finally {
629+
tiledb.delete_intp(emptyp);
630+
}
627631
}
628632

629633
/**
@@ -657,19 +661,22 @@ public NativeArray getMetadata(String key, Datatype nativeType) throws TileDBErr
657661
? tiledb.new_tiledb_datatype_tp()
658662
: tiledb.copy_tiledb_datatype_tp(nativeType.toSwigEnum());
659663

660-
ctx.handleError(
661-
tiledb.tiledb_array_get_metadata(
662-
ctx.getCtxp(), arrayp, key, value_type, value_num, resultArrpp));
663-
664-
Datatype derivedNativeType = Datatype.fromSwigEnum(tiledb.tiledb_datatype_tp_value(value_type));
665-
666-
long value = tiledb.uintp_value(value_num);
667-
NativeArray result = new NativeArray(ctx, derivedNativeType, resultArrpp, (int) value);
664+
try {
665+
ctx.handleError(
666+
tiledb.tiledb_array_get_metadata(
667+
ctx.getCtxp(), arrayp, key, value_type, value_num, resultArrpp));
668668

669-
tiledb.delete_uintp(value_num);
670-
tiledb.delete_tiledb_datatype_tp(value_type);
669+
Datatype derivedNativeType =
670+
Datatype.fromSwigEnum(tiledb.tiledb_datatype_tp_value(value_type));
671671

672-
return result;
672+
long value = tiledb.uintp_value(value_num);
673+
NativeArray result = new NativeArray(ctx, derivedNativeType, resultArrpp, (int) value);
674+
return result;
675+
} finally {
676+
tiledb.delete_uintp(value_num);
677+
tiledb.delete_tiledb_datatype_tp(value_type);
678+
tiledb.delete_voidpArray(resultArrpp);
679+
}
673680
}
674681

675682
/**
@@ -697,13 +704,13 @@ public BigInteger getMetadataNum() throws TileDBError {
697704

698705
SWIGTYPE_p_unsigned_long_long value_num = tiledb.new_ullp();
699706

700-
ctx.handleError(tiledb.tiledb_array_get_metadata_num(ctx.getCtxp(), arrayp, value_num));
701-
702-
BigInteger value = tiledb.ullp_value(value_num);
703-
704-
tiledb.delete_ullp(value_num);
705-
706-
return value;
707+
try {
708+
ctx.handleError(tiledb.tiledb_array_get_metadata_num(ctx.getCtxp(), arrayp, value_num));
709+
BigInteger value = tiledb.ullp_value(value_num);
710+
return value;
711+
} finally {
712+
tiledb.delete_ullp(value_num);
713+
}
707714
}
708715

709716
/**
@@ -735,22 +742,25 @@ public Pair<String, NativeArray> getMetadataFromIndex(BigInteger index) throws T
735742
SWIGTYPE_p_unsigned_int value_num = tiledb.new_uintp();
736743
SWIGTYPE_p_p_void value = tiledb.new_voidpArray(0);
737744

738-
ctx.handleError(
739-
tiledb.tiledb_array_get_metadata_from_index(
740-
ctx.getCtxp(), arrayp, index, key, key_len, value_type, value_num, value));
741-
742-
String keyString = tiledb.charpp_value(key);
743-
long valueLength = tiledb.uintp_value(value_num);
744-
Datatype nativeType = Datatype.fromSwigEnum(tiledb.tiledb_datatype_tp_value(value_type));
745+
try {
746+
ctx.handleError(
747+
tiledb.tiledb_array_get_metadata_from_index(
748+
ctx.getCtxp(), arrayp, index, key, key_len, value_type, value_num, value));
745749

746-
NativeArray result = new NativeArray(ctx, nativeType, value, (int) valueLength);
750+
String keyString = tiledb.charpp_value(key);
751+
long valueLength = tiledb.uintp_value(value_num);
752+
Datatype nativeType = Datatype.fromSwigEnum(tiledb.tiledb_datatype_tp_value(value_type));
747753

748-
tiledb.delete_uintp(value_num);
749-
tiledb.delete_uintp(key_len);
750-
tiledb.delete_charpp(key);
751-
tiledb.delete_tiledb_datatype_tp(value_type);
754+
NativeArray result = new NativeArray(ctx, nativeType, value, (int) valueLength);
755+
return new Pair<String, NativeArray>(keyString, result);
752756

753-
return new Pair<String, NativeArray>(keyString, result);
757+
} finally {
758+
tiledb.delete_uintp(value_num);
759+
tiledb.delete_uintp(key_len);
760+
tiledb.delete_charpp(key);
761+
tiledb.delete_tiledb_datatype_tp(value_type);
762+
tiledb.delete_voidpArray(value);
763+
}
754764
}
755765

756766
/**
@@ -765,13 +775,9 @@ public void deleteFragments(BigInteger timestampStart, BigInteger timestampEnd)
765775
throws TileDBError {
766776
Util.checkBigIntegerRange(timestampStart);
767777
Util.checkBigIntegerRange(timestampEnd);
768-
try {
769-
ctx.handleError(
770-
tiledb.tiledb_array_delete_fragments(
771-
ctx.getCtxp(), getArrayp(), uri, timestampStart, timestampEnd));
772-
} catch (TileDBError err) {
773-
throw err;
774-
}
778+
ctx.handleError(
779+
tiledb.tiledb_array_delete_fragments(
780+
ctx.getCtxp(), getArrayp(), uri, timestampStart, timestampEnd));
775781
}
776782

777783
/**
@@ -808,15 +814,16 @@ public Boolean hasMetadataKey(String key) throws TileDBError {
808814
SWIGTYPE_p_tiledb_datatype_t value_type = tiledb.new_tiledb_datatype_tp();
809815
SWIGTYPE_p_int has_key = tiledb.new_intp();
810816

811-
ctx.handleError(
812-
tiledb.tiledb_array_has_metadata_key(ctx.getCtxp(), arrayp, key, value_type, has_key));
813-
814-
Boolean result = tiledb.intp_value(has_key) > 0;
815-
816-
tiledb.delete_intp(has_key);
817-
tiledb.delete_tiledb_datatype_tp(value_type);
817+
try {
818+
ctx.handleError(
819+
tiledb.tiledb_array_has_metadata_key(ctx.getCtxp(), arrayp, key, value_type, has_key));
818820

819-
return result;
821+
Boolean result = tiledb.intp_value(has_key) > 0;
822+
return result;
823+
} finally {
824+
tiledb.delete_intp(has_key);
825+
tiledb.delete_tiledb_datatype_tp(value_type);
826+
}
820827
}
821828

822829
/**
@@ -887,11 +894,10 @@ public long getOpenTimestampStart() throws TileDBError {
887894
try {
888895
ctx.handleError(
889896
tiledb.tiledb_array_get_open_timestamp_start(ctx.getCtxp(), getArrayp(), start_t));
890-
} catch (TileDBError err) {
897+
return tiledb.ullp_value(start_t).longValue();
898+
} finally {
891899
tiledb.delete_ullp(start_t);
892-
throw err;
893900
}
894-
return tiledb.ullp_value(start_t).longValue();
895901
}
896902

897903
/**
@@ -904,21 +910,16 @@ public long getOpenTimestampEnd() throws TileDBError {
904910
try {
905911
ctx.handleError(
906912
tiledb.tiledb_array_get_open_timestamp_end(ctx.getCtxp(), getArrayp(), end_t));
907-
} catch (TileDBError err) {
913+
return tiledb.ullp_value(end_t).longValue();
914+
} finally {
908915
tiledb.delete_ullp(end_t);
909-
throw err;
910916
}
911-
return tiledb.ullp_value(end_t).longValue();
912917
}
913918

914919
/** Sets the array config. */
915920
public void setConfig(Config config) throws TileDBError {
916-
try {
917-
ctx.handleError(
918-
tiledb.tiledb_array_set_config(ctx.getCtxp(), getArrayp(), config.getConfigp()));
919-
} catch (TileDBError err) {
920-
throw err;
921-
}
921+
ctx.handleError(
922+
tiledb.tiledb_array_set_config(ctx.getCtxp(), getArrayp(), config.getConfigp()));
922923
}
923924

924925
/**
@@ -963,14 +964,14 @@ protected SWIGTYPE_p_tiledb_array_t getArrayp() {
963964

964965
/** Free's the native objects and closes the Array. */
965966
public synchronized void close() {
967+
if (schema != null) {
968+
schema.close();
969+
}
966970
if (arrayp != null && arraypp != null) {
967971
tiledb.tiledb_array_close(ctx.getCtxp(), arrayp);
968972
tiledb.tiledb_array_free(arraypp);
969973
arrayp = null;
970974
arraypp = null;
971-
if (schema != null) {
972-
schema.close();
973-
}
974975
}
975976
}
976977
}

0 commit comments

Comments
 (0)