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 <mico...@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 <mico...@gmail.com>
>> Committer: Daniel-Constantin Mierla <mico...@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-le...@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
_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to