1 #include "sharedmemory.h"
\r
3 void Sharedmemory_init(void)
\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
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
13 Log_info("SHM_KEY: 0x%x", key );
\r
15 if( ( shmptr = ( shm_t *) shmat( shmid, 0, 0 ) ) == (shm_t *) (-1) )
\r
18 exit(1); //MJP BUG should report error and just not use shm dont exit
\r
20 memset( shmptr, 0, shmptr_size );
\r
21 shmptr->umurmurd_pid = getpid();
\r
22 shmptr->server_max_clients = server_max_clients;
\r
25 void Sharedmemory_update(void)
\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
33 unsigned int cc = 0;
\r
34 client_t *client_itr = NULL;
\r
36 memset( &shmptr->client[0], 0, sizeof( shmclient_t ) * shmptr->server_max_clients );
\r
37 shmptr->clientcount = Client_count();
\r
41 while( Client_iterate(&client_itr) != NULL ) {
\r
45 if( client_itr->authenticated )
\r
48 channel_t *channel = client_itr->channel;
\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
66 void Sharedmemory_deinit(void)
\r
68 shmctl( shmid, IPC_RMID, 0 ); //Mark shmid for removal.
\r