he array values that we are modifying and the function that we call periodically are from our module . to exemplify i have put the code below .our requirement is that we want to delete the expired contacts without relying on usrloc module as "we have not used any DB for contact storage" but developed our own module for storing them in a file.even we had installed the SIGALRM handler in our module for decrementing the contacts but the values of array (that stores the expires) elements were zero. we thought of workaround to store the expires values to file and decrement them periodically. but frequent I/O is very consuming. whats the solution for deleting the expired contacts .
#define DB_PATH "/usr/local/etc/kamailio/dbtext/syntel" #define DB_PATH1 "/usr/local/etc/kamailio/dbtext/temp" #define MAX_BUFFER 128 #define MAX_USERS 128 typedef struct { int max_bindings; int syntel_index; int expires[8]; char ip_addr[8][16]; } Syntel_users;
Syntel_users syntel_database[16]={{0}};
//this is function used for storing the contacts
int write_to_file (char *uri, char *user, int locator,int expires) { int Retval = 0; int fd; int bytes; char ip[13]; strncpy (ip, &uri[9], 12); ip[12] = '\0'; fd = open (DB_PATH, O_CREAT | O_RDWR | O_APPEND, 0777); if (syntel_database[locator].max_bindings < 8) { strcpy (syntel_database[locator].ip_addr[syntel_database[locator].max_bindings], uri);
syntel_database[locator].expires[syntel_database[locator].max_bindings]=expires;
syntel_database[locator].max_bindings++; bytes = write (fd, uri, strlen (uri)); Retval = 1; } return Retval; }
//AND THIS IS FUNCTION WE CALL FROM kamailio.conf WITH RTIMER MODULE AFTER INTERVAL OF 1 SECOND.
int syntel_delete (void) { int counter; int j; for (counter = 0; counter < 16; counter++) { for (j = 0; j < syntel_database[counter].max_bindings; j++) {
if(syntel_database[counter].expires[j]<=0) {
memset(syntel_database[counter].ip_addr[j],0,strlen(syntel_database[counter].ip_addr[j]));
syntel_database[counter].max_bindings--; } else syntel_database[counter].expires[j]--; }
} return 0; }
BUT WHAT THIS FUNCTION GETS IS ZERO VALUES FOR EXPIRES AND NOT MODIFIED IN SYNTEL_WRITE_TO_FILE
HOW TO DECREMENT THESE VALUES PERIODICALLY THEN ??
The problem is that you declare the array in the private space of each process.
Kamailio is a multi process application, a running instance starting several processes. Because you want to work on the same array from different processes, you must allocate that array in shared memory:
When your module is initialized, you have to use shm_malloc()... to allocate the array. Some details about memory manager functions in kamailio at: - http://www.asipto.com/pub/kamailio-devel-guide/#c04memory
Also, you have to use locks to access the array, because many processes can try to read/write from same location, due to parallel processing.
Cheers, Daniel
On 2/7/13 6:05 AM, kiran bhosale wrote:
he array values that we are modifying and the function that we call periodically are from our module . to exemplify i have put the code below .our requirement is that we want to delete the expired contacts without relying on usrloc module as "we have not used any DB for contact storage" but developed our own module for storing them in a file.even we had installed the SIGALRM handler in our module for decrementing the contacts but the values of array (that stores the expires) elements were zero. we thought of workaround to store the expires values to file and decrement them periodically. but frequent I/O is very consuming. whats the solution for deleting the expired contacts .
#define DB_PATH "/usr/local/etc/kamailio/dbtext/syntel" #define DB_PATH1 "/usr/local/etc/kamailio/dbtext/temp" #define MAX_BUFFER 128 #define MAX_USERS 128 typedef struct { int max_bindings; int syntel_index; int expires[8]; char ip_addr[8][16]; } Syntel_users;
Syntel_users syntel_database[16]={{0}};
//this is function used for storing the contacts
int write_to_file (char *uri, char *user, int locator,int expires) { int Retval = 0; int fd; int bytes; char ip[13]; strncpy (ip, &uri[9], 12); ip[12] = '\0'; fd = open (DB_PATH, O_CREAT | O_RDWR | O_APPEND, 0777); if (syntel_database[locator].max_bindings < 8) { strcpy (syntel_database[locator].ip_addr[syntel_database[locator].max_bindings], uri); syntel_database[locator].expires[syntel_database[locator].max_bindings]=expires;
syntel_database[locator].max_bindings++; bytes = write (fd, uri, strlen (uri)); Retval = 1;
} return Retval; }
//AND THIS IS FUNCTION WE CALL FROM kamailio.conf WITH RTIMER MODULE AFTER INTERVAL OF 1 SECOND.
int syntel_delete (void) { int counter; int j; for (counter = 0; counter < 16; counter++) { for (j = 0; j < syntel_database[counter].max_bindings; j++) {
if(syntel_database[counter].expires[j]<=0) {
memset(syntel_database[counter].ip_addr[j],0,strlen(syntel_database[counter].ip_addr[j]));
syntel_database[counter].max_bindings--; } else syntel_database[counter].expires[j]--; }
} return 0; }
BUT WHAT THIS FUNCTION GETS IS ZERO VALUES FOR EXPIRES AND NOT MODIFIED IN SYNTEL_WRITE_TO_FILE
HOW TO DECREMENT THESE VALUES PERIODICALLY THEN ??
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
kiran bhosale wrote:
he array values that we are modifying and the function that we call periodically are from our module . to exemplify i have put the code below .our requirement is that we want to delete the expired contacts without relying on usrloc module as "we have not used any DB for contact storage" but developed our own module for storing them in a file.even we had installed the SIGALRM handler in our module for decrementing the contacts but the values of array (that stores the expires) elements were zero. we thought of workaround to store the expires values to file and decrement them periodically. but frequent I/O is very consuming. whats the solution for deleting the expired contacts .
#define DB_PATH "/usr/local/etc/kamailio/dbtext/syntel" #define DB_PATH1 "/usr/local/etc/kamailio/dbtext/temp" #define MAX_BUFFER 128 #define MAX_USERS 128 typedef struct { int max_bindings; int syntel_index; int expires[8]; char ip_addr[8][16]; } Syntel_users;
Syntel_users syntel_database[16]={{0}};
//this is function used for storing the contacts
int write_to_file (char *uri, char *user, int locator,int expires) { int Retval = 0; int fd; int bytes; char ip[13]; strncpy (ip, &uri[9], 12); ip[12] = '\0'; fd = open (DB_PATH, O_CREAT | O_RDWR | O_APPEND, 0777); if (syntel_database[locator].max_bindings < 8) { strcpy (syntel_database[locator].ip_addr[syntel_database[locator].max_bindings], uri);
syntel_database[locator].expires[syntel_database[locator].max_bindings]=expires;
syntel_database[locator].max_bindings++; bytes = write (fd, uri, strlen (uri)); Retval = 1;
} return Retval; }
//AND THIS IS FUNCTION WE CALL FROM kamailio.conf WITH RTIMER MODULE AFTER INTERVAL OF 1 SECOND.
int syntel_delete (void) { int counter; int j; for (counter = 0; counter < 16; counter++) { for (j = 0; j < syntel_database[counter].max_bindings; j++) {
if(syntel_database[counter].expires[j]<=0) {
memset(syntel_database[counter].ip_addr[j],0,strlen(syntel_database[counter].ip_addr[j]));
syntel_database[counter].max_bindings--; } else syntel_database[counter].expires[j]--; }
} return 0; }
BUT WHAT THIS FUNCTION GETS IS ZERO VALUES FOR EXPIRES AND NOT MODIFIED IN SYNTEL_WRITE_TO_FILE
HOW TO DECREMENT THESE VALUES PERIODICALLY THEN ??
Subject: Re: [SR-Users] Deleting the expired contacts using the Rtimer module From: kiran bhosale kbhosale@synteltelecom.com Date: Thu, 07 Feb 2013 10:30:39 +0530 To: miconda@gmail.com
To: miconda@gmail.com
Daniel-Constantin Mierla wrote:
Hello,
the static array is stored on the private memory per process, thus cannot be updated by the timer.
You should allocate the array in shared memory at startup, then it should work to update it from different application processes. Be sure you synchronize (with locks/mutexes) the operations over the shared memory.
Cheers, Daniel
On 2/6/13 7:53 AM, kiran bhosale wrote:
Hi
we have developed the custom module which stores the registered users in a file.now we are trying to remove the expired contacts using the rtimer module.while saving the registered users to the file we also store the expires values in static array.but when we try to decrement the these values in a function called with the help of rtimer module. the values used by this periodic function are not modified ones but the initial which are zero. is it that we cant pass the modified values of the global variables to the timed functions. to get around this problem, we also registered the timer in our module but got same results !!!!!!!
Please Help.
Thanks and regards .
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
the array values that we are modifying and the function that we call periodically are from our module . to exemplify i have put the code below .our requirement is that we want to delete the expired contacts without relying on usrloc module as "we have not used any DB for contact storage" but developed our own module for storing them in a file.even we had installed the SIGALRM handler in our module for decrementing the contacts but the values of array (that stores the expires) elements were zero. we thought of workaround to store the expires values to file and decrement them periodically. but frequent I/O is very consuming. whats the solution for deleting the expired contacts .
#define DB_PATH "/usr/local/etc/kamailio/dbtext/syntel" #define DB_PATH1 "/usr/local/etc/kamailio/dbtext/temp" #define MAX_BUFFER 128 #define MAX_USERS 128 typedef struct { int max_bindings; int syntel_index; int expires[8]; char ip_addr[8][16]; } Syntel_users;
Syntel_users syntel_database[16]={{0}};
//this is function used for storing the contacts
int write_to_file (char *uri, char *user, int locator,int expires) { int Retval = 0; int fd; int bytes; char ip[13]; strncpy (ip, &uri[9], 12); ip[12] = '\0'; fd = open (DB_PATH, O_CREAT | O_RDWR | O_APPEND, 0777); if (syntel_database[locator].max_bindings < 8) { strcpy (syntel_database[locator].ip_addr[syntel_database[locator].max_bindings], uri);
syntel_database[locator].expires[syntel_database[locator].max_bindings]=expires;
syntel_database[locator].max_bindings++; bytes = write (fd, uri, strlen (uri)); Retval = 1;
} return Retval; }
//AND THIS IS FUNCTION WE CALL FROM kamailio.conf WITH RTIMER MODULE AFTER INTERVAL OF 1 SECOND.
int syntel_delete (void) { int counter; int j; for (counter = 0; counter < 16; counter++) { for (j = 0; j < syntel_database[counter].max_bindings; j++) {
if(syntel_database[counter].expires[j]<=0) {
memset(syntel_database[counter].ip_addr[j],0,strlen(syntel_database[counter].ip_addr[j]));
syntel_database[counter].max_bindings--; } else syntel_database[counter].expires[j]--; }
} return 0; }
BUT WHAT THIS FUNCTION GETS IS ZERO VALUES FOR EXPIRES AND NOT MODIFIED IN SYNTEL_WRITE_TO_FILE
HOW TO DECREMENT THESE VALUES PERIODICALLY THEN ??
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
thank you , we managed all the data-structures in a shared memory as u recommended and the problem got solved. thanks a lot again
On 2/13/13 5:54 AM, kiran bhosale wrote:
[...] thank you , we managed all the data-structures in a shared memory as u recommended and the problem got solved. thanks a lot again
welcome!
Daniel