Author: rinrab
Date: Tue Feb 24 19:00:33 2026
New Revision: 1932028

Log:
Add atomic initializatoin function which doesn't return error and doesn't use
pools svn_atomic__init_once_void().

This is never yet used but is a groundwork to add xdigest checksum backend
which does require initialization. This initilization will be performed in
errorless context (inside of svn_checksum__sha1_ctx_create for example).

* include/private/svn_atomic.h
  (svn_atomic__void_init_func_t): New callback declaration.
  (svn_atomic__init_once_void): New function.

* libsvn_subr/atomic.c
  (init_baton_t): Add void_init_func field.
  (void_init_func_wrapper): Add function to wrap initilization in case of
   init_once_void.
  (svn_atomic__init_once_void): Implement function.

Modified:
   subversion/trunk/subversion/include/private/svn_atomic.h
   subversion/trunk/subversion/libsvn_subr/atomic.c

Modified: subversion/trunk/subversion/include/private/svn_atomic.h
==============================================================================
--- subversion/trunk/subversion/include/private/svn_atomic.h    Tue Feb 24 
18:46:32 2026        (r1932027)
+++ subversion/trunk/subversion/include/private/svn_atomic.h    Tue Feb 24 
19:00:33 2026        (r1932028)
@@ -96,6 +96,12 @@ typedef svn_error_t *(*svn_atomic__err_i
 typedef const char *(*svn_atomic__str_init_func_t)(void *baton);
 
 /**
+ * Callback for svn_atomic__init_once_void().
+ * @since New in 1.16
+ */
+typedef void (*svn_atomic__void_init_func_t)(void *baton);
+
+/**
  * Call an initialization function in a thread-safe manner.
  *
  * @a global_status must be a pointer to a global, zero-initialized
@@ -136,6 +142,23 @@ svn_atomic__init_once_no_error(volatile
 
 
 /**
+ * Call an initialization function in a thread-safe manner.
+ *
+ * Unlike svn_atomic__init_once(), this function does not need pool and doesn't
+ * do any error handling at all.
+ *
+ * @a global_status must be a pointer to a global, zero-initialized
+ * #svn_atomic_t. @a init_func is a pointer to the function that performs the
+ * actual initialization. @a baton is passed on to @a init_func for its use.
+ *
+ * @since New in 1.16.
+ */
+void
+svn_atomic__init_once_void(volatile svn_atomic_t *global_status,
+                           svn_atomic__void_init_func_t init_func,
+                           void *baton);
+
+/**
  * Query and increment the global counter and set @a value to the new
  * counter value.
  *

Modified: subversion/trunk/subversion/libsvn_subr/atomic.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/atomic.c    Tue Feb 24 18:46:32 
2026        (r1932027)
+++ subversion/trunk/subversion/libsvn_subr/atomic.c    Tue Feb 24 19:00:33 
2026        (r1932028)
@@ -118,6 +118,9 @@ struct init_baton_t
   svn_atomic__str_init_func_t str_init_func;
   const char *errstr;
 
+  /* Used only by svn_atomic__init_once_void() */
+  svn_atomic__void_init_func_t void_init_func;
+
   /* Used by both pairs of functions */
   void *baton;
 };
@@ -178,6 +181,29 @@ svn_atomic__init_once_no_error(volatile
     return init_baton.errstr;
 }
 
+/* Wrapper for the svn_atomic__init_once_void() init function. */
+static svn_boolean_t void_init_func_wrapper(init_baton_t *init_baton)
+{
+  init_baton->void_init_func(init_baton->baton);
+  return TRUE;
+}
+
+void
+svn_atomic__init_once_void(volatile svn_atomic_t *global_status,
+                           svn_atomic__void_init_func_t init_func,
+                           void *baton)
+{
+  svn_boolean_t result;
+  init_baton_t init_baton = { 0 };
+  init_baton.void_init_func = init_func;
+  init_baton.baton = baton;
+
+  result = init_once(global_status, void_init_func_wrapper, &init_baton);
+
+  /* void_init_func_wrapper() always returns success */
+  SVN_ERR_ASSERT_NO_RETURN(result);
+}
+
 /* The process-global counter that we use to produce process-wide unique
  * values.  Since APR has no 64 bit atomics, all access to this will be
  * serialized through COUNTER_MUTEX. */

Reply via email to