36,8 → 36,8 |
*/ |
|
#include <errno.h> |
#include <futex.h> |
#include <malloc.h> |
#include <rwlock.h> |
//#include <stdio.h> |
#include <string.h> |
|
50,7 → 50,6 |
#include "packet_header.h" |
#include "packet.h" |
|
// TODO power of 2 aritmetic => div and mod speedup? |
/** Packet map page size. |
*/ |
#define PACKET_MAP_SIZE 100 |
89,9 → 88,8 |
*/ |
static struct{ |
/** Safety lock. |
* Used as a mutex. |
*/ |
futex_t lock; |
rwlock_t lock; |
/** Packet map. |
*/ |
gpm_t packet_map; |
107,11 → 105,10 |
int pm_init( void ){ |
ERROR_DECLARE; |
|
// start locked |
futex_initialize( & pm_globals.lock, 0 ); |
rwlock_initialize( & pm_globals.lock ); |
rwlock_write_lock( & pm_globals.lock ); |
ERROR_PROPAGATE( gpm_initialize( & pm_globals.packet_map )); |
// release the lock |
futex_up( & pm_globals.lock ); |
rwlock_write_unlock( & pm_globals.lock ); |
return EOK; |
} |
|
120,18 → 117,18 |
packet_t packet; |
|
if( ! packet_id ) return NULL; |
futex_down( & pm_globals.lock ); |
rwlock_read_lock( & pm_globals.lock ); |
if( packet_id > PACKET_MAP_SIZE * gpm_count( & pm_globals.packet_map )){ |
futex_up( & pm_globals.lock ); |
rwlock_read_unlock( & pm_globals.lock ); |
return NULL; |
} |
map = gpm_get_index( & pm_globals.packet_map, PACKET_MAP_PAGE( packet_id )); |
if( ! map ){ |
futex_up( & pm_globals.lock ); |
rwlock_read_unlock( & pm_globals.lock ); |
return NULL; |
} |
packet = ( * map )[ PACKET_MAP_INDEX( packet_id ) ]; |
futex_up( & pm_globals.lock ); |
rwlock_read_unlock( & pm_globals.lock ); |
return packet; |
} |
|
141,7 → 138,7 |
packet_map_ref map; |
|
if( ! packet_is_valid( packet )) return EINVAL; |
futex_down( & pm_globals.lock ); |
rwlock_write_lock( & pm_globals.lock ); |
if( PACKET_MAP_PAGE( packet->packet_id ) < gpm_count( & pm_globals.packet_map )){ |
map = gpm_get_index( & pm_globals.packet_map, PACKET_MAP_PAGE( packet->packet_id )); |
}else{ |
148,19 → 145,19 |
do{ |
map = ( packet_map_ref ) malloc( sizeof( packet_map_t )); |
if( ! map ){ |
futex_up( & pm_globals.lock ); |
rwlock_write_unlock( & pm_globals.lock ); |
return ENOMEM; |
} |
memset( map, 0, sizeof( packet_map_t )); |
if(( ERROR_CODE = gpm_add( & pm_globals.packet_map, map )) < 0 ){ |
rwlock_write_unlock( & pm_globals.lock ); |
free( map ); |
futex_up( & pm_globals.lock ); |
return ERROR_CODE; |
} |
}while( PACKET_MAP_PAGE( packet->packet_id ) >= gpm_count( & pm_globals.packet_map )); |
} |
( * map )[ PACKET_MAP_INDEX( packet->packet_id ) ] = packet; |
futex_up( & pm_globals.lock ); |
rwlock_write_unlock( & pm_globals.lock ); |
return EOK; |
} |
|
170,7 → 167,7 |
packet_map_ref map; |
packet_t packet; |
|
futex_down( & pm_globals.lock ); |
rwlock_write_lock( & pm_globals.lock ); |
count = gpm_count( & pm_globals.packet_map ); |
while( count > 0 ){ |
map = gpm_get_index( & pm_globals.packet_map, count - 1 ); |