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
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