36,6 → 36,7 |
*/ |
|
#include <errno.h> |
#include <futex.h> |
#include <malloc.h> |
//#include <stdio.h> |
#include <string.h> |
87,7 → 88,10 |
/** Packet map global data. |
*/ |
static struct{ |
// TODO lock |
/** Safety lock. |
* Used as a mutex. |
*/ |
futex_t lock; |
/** Packet map. |
*/ |
gpm_t packet_map; |
101,18 → 105,35 |
} |
|
int pm_init( void ){ |
return gpm_initialize( & pm_globals.packet_map ); |
ERROR_DECLARE; |
|
// start locked |
futex_initialize( & pm_globals.lock, 0 ); |
ERROR_PROPAGATE( gpm_initialize( & pm_globals.packet_map )); |
// release the lock |
futex_up( & pm_globals.lock ); |
return EOK; |
} |
|
packet_t pm_find( packet_id_t packet_id ){ |
packet_map_ref map; |
packet_t packet; |
|
if( ! packet_id ) return NULL; |
if( packet_id > PACKET_MAP_SIZE * gpm_count( & pm_globals.packet_map )) return NULL; |
futex_down( & pm_globals.lock ); |
if( packet_id > PACKET_MAP_SIZE * gpm_count( & pm_globals.packet_map )){ |
futex_up( & pm_globals.lock ); |
return NULL; |
} |
map = gpm_get_index( & pm_globals.packet_map, PACKET_MAP_PAGE( packet_id )); |
if( ! map ) return NULL; |
return ( * map )[ PACKET_MAP_INDEX( packet_id ) ]; |
if( ! map ){ |
futex_up( & pm_globals.lock ); |
return NULL; |
} |
packet = ( * map )[ PACKET_MAP_INDEX( packet_id ) ]; |
futex_up( & pm_globals.lock ); |
return packet; |
} |
|
int pm_add( packet_t packet ){ |
ERROR_DECLARE; |
119,21 → 140,27 |
|
packet_map_ref map; |
|
if(( ! packet_is_valid( packet )) || ( gpm_count( & pm_globals.packet_map ) < 0 )) return EINVAL; |
if( ! packet_is_valid( packet )) return EINVAL; |
futex_down( & 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{ |
do{ |
map = ( packet_map_ref ) malloc( sizeof( packet_map_t )); |
if( ! map ) return ENOMEM; |
if( ! map ){ |
futex_up( & pm_globals.lock ); |
return ENOMEM; |
} |
memset( map, 0, sizeof( packet_map_t )); |
if(( ERROR_CODE = gpm_add( & pm_globals.packet_map, map )) < 0 ){ |
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 ); |
return EOK; |
} |
|
143,6 → 170,7 |
packet_map_ref map; |
packet_t packet; |
|
futex_down( & pm_globals.lock ); |
count = gpm_count( & pm_globals.packet_map ); |
while( count > 0 ){ |
map = gpm_get_index( & pm_globals.packet_map, count - 1 ); |
154,6 → 182,7 |
} |
} |
gpm_destroy( & pm_globals.packet_map ); |
// leave locked |
} |
|
packet_t pq_add( packet_t first, packet_t packet, int order, size_t metric ){ |