Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3989 → Rev 3990

/branches/network/uspace/srv/net/structures/packet/packet.c
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&nbsp;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 );