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 pa_end = sizeof( float ) * 4,
\r
30 pc_end = sizeof( uint32_t ) * 2;
\r
32 unsigned int cc = 0;
\r
33 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
39 if( shmptr->clientcount )
\r
42 while( Client_iterate(&client_itr) != NULL ) {
\r
44 if( client_itr->authenticated )
\r
46 channel_t *channel = client_itr->channel;
\r
48 strncpy( shmptr->client[cc].username, client_itr->username, 120 );
\r
49 strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), 45 );
\r
50 shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr );
\r
51 shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr );
\r
52 strncpy( shmptr->client[cc].channel, channel->name, 120 );
\r
54 shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL;
\r
55 shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL;
\r
57 memcpy( &shmptr->client[cc].bUDP, &client_itr->bUDP, bt_end );
\r
58 memcpy( &shmptr->client[cc].UDPPingAvg, &client_itr->UDPPingAvg, pa_end );
\r
59 memcpy( &shmptr->client[cc].UDPPackets, &client_itr->UDPPackets, pc_end );
\r
67 void Sharedmemory_deinit(void)
\r
69 shmctl( shmid, IPC_RMID, 0 ); //Mark shmid for removal.
\r