]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Various fixes
authorVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 29 Nov 2024 11:52:32 +0000 (11:52 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 29 Nov 2024 11:52:32 +0000 (11:52 +0000)
src/libutil/cxx/rspamd-simdutf.cxx
src/libutil/rspamd_simdutf.h
src/rspamd.c

index 67b5858120f4d64676f53d6b56ade4f34a691242..81140388455b2c1554e396d134f453e7917873b4 100644 (file)
 
 extern "C" {
 
+const simdutf::implementation *impl{nullptr};
+const simdutf::implementation *ref_impl{nullptr};
+
 void rspamd_fast_utf8_library_init(unsigned flags)
 {
-       // This library requires no initialisation
+       impl = simdutf::get_active_implementation();
+       auto all_impls = simdutf::get_available_implementations();
+
+       for (auto &i: all_impls) {
+               if (i->name() == "fallback") {
+                       ref_impl = i;
+                       break;
+               }
+       }
 }
 
 off_t rspamd_fast_utf8_validate(const unsigned char *data, size_t len)
 {
-       auto res = simdutf::validate_utf8_with_errors((const char *) data, len);
+       auto res = impl->validate_utf8_with_errors((const char *) data, len);
+
+       if (res.error == simdutf::error_code::SUCCESS) {
+               return 0;
+       }
+
+       return res.count + 1;// We need to return offset for the first invalid character
+}
+
+off_t rspamd_fast_utf8_validate_ref(const unsigned char *data, size_t len)
+{
+       auto res = ref_impl->validate_utf8_with_errors((const char *) data, len);
 
        if (res.error == simdutf::error_code::SUCCESS) {
                return 0;
@@ -38,4 +60,15 @@ off_t rspamd_fast_utf8_validate(const unsigned char *data, size_t len)
 
        return res.count + 1;// We need to return offset for the first invalid character
 }
+
+const char *rspamd_fast_utf8_library_impl_name(void)
+{
+       static auto impl_name = std::string{};
+
+       if (impl_name.empty()) {
+               impl_name = impl->name() + "(" + impl->description() + ")";
+       }
+
+       return impl_name.c_str();
+}
 }
\ No newline at end of file
index c1fa07892289f2e8aa7bf1dd0bc0a450f66a70c2..23384de4cd003b1ffb83476686bc3a76b89077df 100644 (file)
@@ -25,7 +25,9 @@ extern "C" {
 #endif
 
 void rspamd_fast_utf8_library_init(unsigned flags);
+const char *rspamd_fast_utf8_library_impl_name(void);
 off_t rspamd_fast_utf8_validate(const unsigned char *data, size_t len);
+off_t rspamd_fast_utf8_validate_ref(const unsigned char *data, size_t len);
 
 #ifdef __cplusplus
 }
index 6c204e266a53af3a2bad7b4eeb411bc864087e5d..088bfba49c275aa41862158795350a1b2e1b2775 100644 (file)
@@ -56,6 +56,7 @@
 
 #ifdef WITH_HYPERSCAN
 #include "libserver/hyperscan_tools.h"
+#include "rspamd_simdutf.h"
 #endif
 
 /* 2 seconds to fork new process in place of dead one */
@@ -1551,6 +1552,7 @@ int main(int argc, char **argv, char **env)
                                  rspamd_main->cfg->libs_ctx->crypto_ctx->chacha20_impl,
                                  rspamd_main->cfg->libs_ctx->crypto_ctx->base64_impl);
        msg_info_main("libottery prf: %s", ottery_get_impl_name());
+       msg_info_main("simdutf implementation: %s", rspamd_fast_utf8_library_impl_name());
 
        /* Daemonize */
        if (!no_fork) {