The misctest function(s) purpose is to test if internal locks are safe to use across many threads, added them to be able to test easier on different CPUs . Not sure if that's what you look for, you can add more if you need something else.

Cheers,
Daniel

On 17.07.25 09:46, Henning Westerholt wrote:
Thanks for adding this. I was thinking of adding a timer-based approach for concurrent locking stress (similar as the memory tests), but this is probably more suitable. We will test it as well today.

Cheers,

Henning

-----Original Message-----
From: Daniel-Constantin Mierla via sr-dev <sr-dev@lists.kamailio.org>
Sent: Donnerstag, 17. Juli 2025 09:26
To: sr-dev@lists.kamailio.org
Cc: Daniel-Constantin Mierla <miconda@gmail.com>
Subject: [sr-dev] git:master:4e474036: misctest: modparam and function to
test internal locks with pthreads

Module: kamailio
Branch: master
Commit: 4e474036be1d862e63536ad94cc284c52e04a8a6
URL:
https://github.com/kamailio/kamailio/commit/4e474036be1d862e63536ad
94cc284c52e04a8a6

Author: Daniel-Constantin Mierla <miconda@gmail.com>
Committer: Daniel-Constantin Mierla <miconda@gmail.com>
Date: 2025-07-17T08:48:54+02:00

misctest: modparam and function to test internal locks with pthreads

---

Modified: src/modules/misctest/misctest_mod.c

---

Diff:
https://github.com/kamailio/kamailio/commit/4e474036be1d862e63536ad
94cc284c52e04a8a6.diff
Patch:
https://github.com/kamailio/kamailio/commit/4e474036be1d862e63536ad
94cc284c52e04a8a6.patch

---

diff --git a/src/modules/misctest/misctest_mod.c
b/src/modules/misctest/misctest_mod.c
index 50863ea1554..519d68ab81a 100644
--- a/src/modules/misctest/misctest_mod.c
+++ b/src/modules/misctest/misctest_mod.c
@@ -59,6 +59,7 @@ static int mt_mem_alloc_f(struct sip_msg *, char *, char
*);  static int mt_mem_free_f(struct sip_msg *, char *, char *);  static int
mt_tcp_thread_exec_f(sip_msg_t *, char *, char *);  static int
mt_lock_test_f(struct sip_msg *, char *, char *);
+static int mt_lock_threads_f(sip_msg_t *, char *, char *);
 static int mod_init(void);
 static void mod_destroy(void);

@@ -71,12 +72,17 @@ static int misctest_message = 0;  static str
misctest_message_data = STR_NULL;  static str misctest_message_file =
STR_NULL;

+static int misctest_lock_threads_mode = 0; gen_lock_t
+*_misctest_lock_threads = NULL;
+
 /* clang-format off */
 static cmd_export_t cmds[]={
 	{"mt_mem_alloc", mt_mem_alloc_f, 1, fixup_var_int_1, 0,
ANY_ROUTE},
 	{"mt_mem_free", mt_mem_free_f, 1, fixup_var_int_1, 0,
ANY_ROUTE},
 	{"mt_tcp_thread_exec", mt_tcp_thread_exec_f, 1, fixup_spve_null, 0,
ANY_ROUTE},
 	{"mt_lock_test", mt_lock_test_f, 1, fixup_var_int_1, 0, ANY_ROUTE},
+	{"mt_lock_threads", mt_lock_threads_f, 1, fixup_igp_null,
+		fixup_free_igp_null, ANY_ROUTE},
 	{0, 0, 0, 0, 0}
 };
 /* clang-format on */
@@ -125,6 +131,7 @@ static param_export_t params[]={
 	{"message_data", PARAM_STR, &misctest_message_data},
 	{"message_file", PARAM_STR, &misctest_message_file},
 	{"mem_check_content", PARAM_INT,
&default_mt_cfg.mem_check_content},
+	{"lock_threads_mode", PARAM_INT, &misctest_lock_threads_mode},
 	{0,0,0}
 };
 /* clang-format on */
@@ -285,6 +292,15 @@ static int mod_init(void)
 		return -1;
 	}

+	if(misctest_lock_threads_mode != 0) {
+		_misctest_lock_threads = lock_alloc();
+		if(_misctest_lock_threads == NULL) {
+			LM_ERR("failed to alloc lock\n");
+			goto error;
+		}
+		lock_init(_misctest_lock_threads);
+	}
+
 	return 0;
 error:
 	return -1;
@@ -1021,6 +1037,48 @@ static int mt_lock_test_f(struct sip_msg *msg,
char *sz, char *foo)
 	return lock_test(size) >= 0 ? 1 : -1;
 }

+static void *mt_lock_threads_exec(void *param) {
+	int pidx = 0;
+
+	pidx = (int)(long)param;
+
+	while(1) {
+		LM_INFO("==== before acquiring the lock (idx: %d)\n", pidx);
+		lock_get(_misctest_lock_threads);
+		LM_INFO("==== after acquiring the lock (idx: %d)\n", pidx);
+	}
+	return NULL;
+}
+
+static int mt_lock_threads_f(sip_msg_t *msg, char *pn, char *p2) {
+	int i;
+	int n;
+	pthread_t tid;
+
+	if(fixup_get_ivalue(msg, (gparam_t *)pn, &n) < 0) {
+		LM_ERR("invalid parameter\n");
+		return -1;
+	}
+
+	if(_misctest_lock_threads == NULL) {
+		LM_ERR("the lock is not initialized\n");
+		goto error;
+	}
+
+	for(i = 0; i < n; i++) {
+		if(pthread_create(&tid, NULL, mt_lock_threads_exec, (void
*)(long)i)) {
+			LM_ERR("failed to start all worker threads\n");
+			goto error;
+		}
+	}
+
+	return 1;
+
+error:
+	return -1;
+}

 /* RPC exports: */


_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org To
unsubscribe send an email to sr-dev-leave@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the
sender!
-- 
Daniel-Constantin Mierla (@ asipto.com)
twitter.com/miconda -- linkedin.com/in/miconda
Kamailio Consultancy, Training and Development Services -- asipto.com