Initial sharedmemory API release
[umurmur.git] / src / sharedmemory.c
1 #include "sharedmemory.h"\r
2 \r
3 void Sharedmemory_init(void) \r
4 {\r
5 \r
6   key_t key = 0x53021d79;\r
7   int server_max_clients = getIntConf(MAX_CLIENTS);  \r
8   int shmptr_size =  sizeof( shm_t  ) + (sizeof( shmclient_t ) * server_max_clients);\r
9   \r
10   //key =  ftok( ".", 'S' );  //MJP BUG this needs fixing.. also how to handle multi copys of umurmur bound to diff ports or IPs  option to pass key on cmdline?  \r
11   shmid = shmget( key, shmptr_size, IPC_CREAT | 0666 );    \r
12 \r
13   Log_info("SHM_KEY: 0x%x", key );\r
14 \r
15         if( ( shmptr = ( shm_t *) shmat( shmid, 0, 0 ) ) == (shm_t *) (-1) )\r
16         {\r
17                 perror("shmat");\r
18                 exit(1); //MJP BUG should report error and just not use shm dont exit\r
19         }\r
20         memset( shmptr, 0, shmptr_size );                                     \r
21   shmptr->umurmurd_pid = getpid();\r
22   shmptr->server_max_clients = server_max_clients;  \r
23 }\r
24 \r
25 void Sharedmemory_update(void) \r
26 {\r
27 \r
28   static size_t bt_end = sizeof(  bool_t  ) * 8,   //compute once\r
29                 et_end = sizeof( etimer_t ) * 3,\r
30                 pa_end = sizeof(  float   ) * 4,\r
31                 pc_end = sizeof( uint32_t ) * 2;\r
32                 \r
33  unsigned int cc = 0;\r
34  client_t *client_itr = NULL;\r
35  \r
36  memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients );\r
37  shmptr->clientcount = Client_count();\r
38  \r
39  \r
40  \r
41  while( Client_iterate(&client_itr) != NULL ) {\r
42  \r
43 \r
44                                                                                               \r
45       if( client_itr->authenticated )\r
46       {\r
47         \r
48         channel_t *channel = client_itr->channel;\r
49                                                                                                                                   \r
50         strncpy( shmptr->client[cc].username, client_itr->username, 120 );\r
51         strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ) , 45 );\r
52         shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );\r
53         shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );\r
54         strncpy( shmptr->client[cc].channel, channel->name, 120 );\r
55         memcpy( &shmptr->client[cc].bUDP, &client_itr->bUDP, bt_end );\r
56         memcpy( &shmptr->client[cc].lastActivity, &client_itr->lastActivity, et_end );\r
57         memcpy( &shmptr->client[cc].UDPPingAvg, &client_itr->UDPPingAvg, pa_end );\r
58         memcpy( &shmptr->client[cc].UDPPackets, &client_itr->UDPPackets, pc_end );\r
59       }  \r
60       cc++;\r
61       \r
62  }\r
63  \r
64 }\r
65 \r
66 void Sharedmemory_deinit(void) \r
67 {\r
68   shmctl( shmid, IPC_RMID, 0 );   //Mark shmid for removal.\r
69   shmdt( shmptr );\r
70 }