Skip to content

Commit 9573836

Browse files
committed
Multiple optimizations
1 parent 5f8b157 commit 9573836

18 files changed

Lines changed: 432 additions & 106 deletions

LICENSE-3rdparty.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Component,Origin,License,Copyright
22
main,slf4j,mit,QOS.ch
33
main,libddwaf,apache-2.0,DataDog
4+
main,weak-lock-free,apache-2.0,Rafael Winterhalter
45
tests,junit,epl-1.0,various
56
tests,ant,apache-2.0,Apache Software Foundation
67
tests,groovy,apache-2.0,various

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ configurations {
143143
def SLF4J_VERSION = '1.7.30'
144144
dependencies {
145145
implementation group: 'org.slf4j', name: 'slf4j-api', version: SLF4J_VERSION
146+
implementation group: 'com.blogspot.mydailyjava', name: 'weak-lock-free', version: '0.17'
146147

147148
testRuntimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: SLF4J_VERSION
148149
testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: '2.2'

dl_dbgsyms

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ function extract {
3939
function main {
4040
local readonly version=$1
4141
dl_zip $version
42-
extract $version linux_64_glibc/libsqreen_jni
43-
extract $version linux_64/libddwaf
42+
extract $version linux/x86_64/glibc/libsqreen_jni
43+
extract $version linux/x86_64/libddwaf
4444
}
4545

4646
main $1

src/main/c/jni/io_sqreen_powerwaf_Additive.h

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/c/jni/io_sqreen_powerwaf_Powerwaf.h

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/c/powerwaf_jni.c

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ jclass *number_cls = &number_longValue.class_glob;
142142
static struct j_method _boolean_booleanValue;
143143
static jclass *_boolean_cls = &_boolean_booleanValue.class_glob;
144144

145+
// MapIterableWithSize
146+
static jclass _miws_cls;
147+
145148
static struct j_method _hashmap_init;
146149
static struct j_method _map_put;
147150
struct j_method map_entryset;
@@ -596,10 +599,10 @@ static jobject _run_rule_common(bool is_byte_buffer, JNIEnv *env, jclass clazz,
596599
/*
597600
* Class: io_sqreen_powerwaf_Powerwaf
598601
* Method: runRules
599-
* Signature: (Lio/sqreen/powerwaf/PowerwafHandle;Ljava/util/Map;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
602+
* Signature: (Lio/sqreen/powerwaf/PowerwafHandle;Ljava/util/Object;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
600603
*/
601604
JNIEXPORT jobject JNICALL
602-
Java_io_sqreen_powerwaf_Powerwaf_runRules__Lio_sqreen_powerwaf_PowerwafHandle_2Ljava_util_Map_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2(
605+
Java_io_sqreen_powerwaf_Powerwaf_runRules__Lio_sqreen_powerwaf_PowerwafHandle_2Ljava_lang_Object_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2(
603606
JNIEnv *env, jclass clazz, jobject handle_obj, jobject parameters,
604607
jobject limits_obj, jobject metrics_obj)
605608
{
@@ -811,10 +814,10 @@ static jobject _run_additive_common(JNIEnv *env, jobject this,
811814
* Class: io_sqreen_powerwaf_Additive
812815
* Method: runAdditive
813816
* Signature:
814-
* (Ljava/util/Map;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
817+
* (Ljava/lang/Object;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
815818
*/
816819
JNIEXPORT jobject JNICALL
817-
Java_io_sqreen_powerwaf_Additive_runAdditive__Ljava_util_Map_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2(
820+
Java_io_sqreen_powerwaf_Additive_runAdditive__Ljava_lang_Object_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2(
818821
JNIEnv *env, jobject this, jobject parameters, jobject limits_obj,
819822
jobject metrics_obj)
820823
{
@@ -1128,17 +1131,18 @@ static bool _cache_single_class_weak(JNIEnv *env,
11281131

11291132
static bool _cache_classes(JNIEnv *env)
11301133
{
1131-
return _cache_single_class_weak(env, "java/lang/RuntimeException",
1132-
&jcls_rte) &&
1133-
_cache_single_class_weak(env, "java/lang/IllegalArgumentException",
1134-
&jcls_iae) &&
1135-
_cache_single_class_weak(env, "java/lang/CharSequence",
1136-
&charSequence_cls) &&
1137-
_cache_single_class_weak(env, "java/nio/Buffer",
1138-
&buffer_cls) &&
1139-
_cache_single_class_weak(env, "java/nio/CharBuffer",
1140-
&charBuffer_cls) &&
1141-
_cache_single_class_weak(env, "java/lang/String", &string_cls);
1134+
return _cache_single_class_weak(env, "java/lang/RuntimeException",
1135+
&jcls_rte) &&
1136+
_cache_single_class_weak(env, "java/lang/IllegalArgumentException",
1137+
&jcls_iae) &&
1138+
_cache_single_class_weak(env, "java/lang/CharSequence",
1139+
&charSequence_cls) &&
1140+
_cache_single_class_weak(env, "java/nio/Buffer", &buffer_cls) &&
1141+
_cache_single_class_weak(env, "java/nio/CharBuffer",
1142+
&charBuffer_cls) &&
1143+
_cache_single_class_weak(env, "java/lang/String", &string_cls) &&
1144+
_cache_single_class_weak(
1145+
env, "io/sqreen/powerwaf/MapIterableWithSize", &_miws_cls);
11421146
}
11431147

11441148
static void _dispose_of_weak_classes(JNIEnv *env)
@@ -1154,6 +1158,7 @@ static void _dispose_of_weak_classes(JNIEnv *env)
11541158
DESTROY_CLASS_REF(charSequence_cls)
11551159
DESTROY_CLASS_REF(buffer_cls)
11561160
DESTROY_CLASS_REF(charBuffer_cls)
1161+
DESTROY_CLASS_REF(_miws_cls)
11571162
// leave jcls_rte for last in OnUnload; we might still need it
11581163
}
11591164

@@ -1487,6 +1492,10 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
14871492
JNI(DeleteLocalRef, clazz);
14881493
}
14891494

1495+
// shared between two branches
1496+
jobject entry_set = NULL;
1497+
jobject entry_set_it;
1498+
14901499
if (JNI(IsSameObject, obj, NULL)) {
14911500
// replace NULLs with empty maps.
14921501
// DDWAF_OBJ_NULL is actually invalid; it can't be added to containers
@@ -1526,6 +1535,18 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15261535
goto error;
15271536
}
15281537
}
1538+
} else if (JNI(IsInstanceOf, obj, _miws_cls)) {
1539+
ddwaf_object_map(&result);
1540+
if (rec_level >= lims->max_depth) {
1541+
JAVA_LOG(DDWAF_LOG_DEBUG,
1542+
"Leaving map empty because max depth of %d "
1543+
"has been reached",
1544+
lims->max_depth);
1545+
goto early_return;
1546+
}
1547+
JAVA_CALL(entry_set_it, iterable_iterator, obj);
1548+
goto iterator_map_entry;
1549+
15291550
} else if (JNI(IsInstanceOf, obj, *map_cls)) {
15301551
ddwaf_object_map(&result); // can't fail
15311552
if (rec_level >= lims->max_depth) {
@@ -1536,10 +1557,10 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15361557
goto early_return;
15371558
}
15381559

1539-
jobject entry_set, entry_set_it;
15401560
JAVA_CALL(entry_set, map_entryset, obj);
15411561
JAVA_CALL(entry_set_it, iterable_iterator, entry_set);
15421562

1563+
iterator_map_entry:
15431564
while (JNI(CallBooleanMethod, entry_set_it, iterator_hasNext.meth_id)) {
15441565
if (JNI(ExceptionCheck)) {
15451566
goto error;
@@ -1592,7 +1613,9 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15921613
}
15931614

15941615
JNI(DeleteLocalRef, entry_set_it);
1595-
JNI(DeleteLocalRef, entry_set);
1616+
if (entry_set) {
1617+
JNI(DeleteLocalRef, entry_set);
1618+
}
15961619

15971620
} else if (JNI(IsInstanceOf, obj, *iterable_cls)) {
15981621
ddwaf_object_array(&result);

src/main/java/io/sqreen/powerwaf/Additive.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final class Additive implements Closeable {
4848
private static native long initAdditive(PowerwafHandle handle);
4949

5050
private native Powerwaf.ResultWithData runAdditive(
51-
Map<String, Object> parameters, Powerwaf.Limits limits, PowerwafMetrics metrics) throws AbstractPowerwafException;
51+
Object parameters, Powerwaf.Limits limits, PowerwafMetrics metrics) throws AbstractPowerwafException;
5252

5353
private native Powerwaf.ResultWithData runAdditive(
5454
ByteBuffer firstPWArgsBuffer, Powerwaf.Limits limits, PowerwafMetrics metrics) throws AbstractPowerwafException;
@@ -70,9 +70,30 @@ private native Powerwaf.ResultWithData runAdditive(
7070
* @return execution results
7171
* @throws AbstractPowerwafException rethrow from native code, timeout or param serialization failure
7272
*/
73-
public Powerwaf.ResultWithData run(Map<String, Object> parameters,
73+
public Powerwaf.ResultWithData run(Map<?, Object> parameters,
7474
Powerwaf.Limits limits,
7575
PowerwafMetrics metrics) throws AbstractPowerwafException {
76+
return run((Object) parameters, limits, metrics);
77+
}
78+
79+
/**
80+
* Push params to PowerWAF with given limits
81+
*
82+
* @param parameters data to push to PowerWAF
83+
* @param limits request execution limits
84+
* @param metrics a metrics collector, or null
85+
* @return execution results
86+
* @throws AbstractPowerwafException rethrow from native code, timeout or param serialization failure
87+
*/
88+
public Powerwaf.ResultWithData run(MapIterableWithSize<?> parameters,
89+
Powerwaf.Limits limits,
90+
PowerwafMetrics metrics) throws AbstractPowerwafException {
91+
return run((Object) parameters, limits, metrics);
92+
}
93+
94+
private Powerwaf.ResultWithData run(Object parameters,
95+
Powerwaf.Limits limits,
96+
PowerwafMetrics metrics) throws AbstractPowerwafException {
7697
if (limits == null) {
7798
throw new IllegalArgumentException("limits must be provided");
7899
}

0 commit comments

Comments
 (0)