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

-- 
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Kamailio World Conference, April 16-17, 2013, Berlin
 - http://conference.kamailio.com -