Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4581 → Rev 4582

/branches/network/uspace/srv/net/structures/packet/packet.c
38,7 → 38,7
#include <errno.h>
#include <malloc.h>
#include <mem.h>
#include <rwlock.h>
#include <fibril_sync.h>
//#include <stdio.h>
#include <unistd.h>
 
90,7 → 90,7
static struct{
/** Safety lock.
*/
rwlock_t lock;
fibril_rwlock_t lock;
/** Packet map.
*/
gpm_t packet_map;
106,10 → 106,10
int pm_init( void ){
ERROR_DECLARE;
 
rwlock_initialize( & pm_globals.lock );
rwlock_write_lock( & pm_globals.lock );
fibril_rwlock_initialize( & pm_globals.lock );
fibril_rwlock_write_lock( & pm_globals.lock );
ERROR_PROPAGATE( gpm_initialize( & pm_globals.packet_map ));
rwlock_write_unlock( & pm_globals.lock );
fibril_rwlock_write_unlock( & pm_globals.lock );
return EOK;
}
 
118,18 → 118,18
packet_t packet;
 
if( ! packet_id ) return NULL;
rwlock_read_lock( & pm_globals.lock );
fibril_rwlock_read_lock( & pm_globals.lock );
if( packet_id > PACKET_MAP_SIZE * gpm_count( & pm_globals.packet_map )){
rwlock_read_unlock( & pm_globals.lock );
fibril_rwlock_read_unlock( & pm_globals.lock );
return NULL;
}
map = gpm_get_index( & pm_globals.packet_map, PACKET_MAP_PAGE( packet_id ));
if( ! map ){
rwlock_read_unlock( & pm_globals.lock );
fibril_rwlock_read_unlock( & pm_globals.lock );
return NULL;
}
packet = ( * map )[ PACKET_MAP_INDEX( packet_id ) ];
rwlock_read_unlock( & pm_globals.lock );
fibril_rwlock_read_unlock( & pm_globals.lock );
return packet;
}
 
139,7 → 139,7
packet_map_ref map;
 
if( ! packet_is_valid( packet )) return EINVAL;
rwlock_write_lock( & pm_globals.lock );
fibril_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{
146,12 → 146,12
do{
map = ( packet_map_ref ) malloc( sizeof( packet_map_t ));
if( ! map ){
rwlock_write_unlock( & pm_globals.lock );
fibril_rwlock_write_unlock( & pm_globals.lock );
return ENOMEM;
}
bzero( map, sizeof( packet_map_t ));
if(( ERROR_CODE = gpm_add( & pm_globals.packet_map, map )) < 0 ){
rwlock_write_unlock( & pm_globals.lock );
fibril_rwlock_write_unlock( & pm_globals.lock );
free( map );
return ERROR_CODE;
}
158,7 → 158,7
}while( PACKET_MAP_PAGE( packet->packet_id ) >= gpm_count( & pm_globals.packet_map ));
}
( * map )[ PACKET_MAP_INDEX( packet->packet_id ) ] = packet;
rwlock_write_unlock( & pm_globals.lock );
fibril_rwlock_write_unlock( & pm_globals.lock );
return EOK;
}
 
168,7 → 168,7
packet_map_ref map;
packet_t packet;
 
rwlock_write_lock( & pm_globals.lock );
fibril_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 );
/branches/network/uspace/srv/net/structures/packet/packet_server.c
37,7 → 37,7
#include <align.h>
#include <async.h>
#include <errno.h>
#include <futex.h>
#include <fibril_sync.h>
//#include <stdio.h>
#include <unistd.h>
 
72,7 → 72,7
static struct{
/** Safety lock.
*/
futex_t lock;
fibril_mutex_t lock;
/** Free packet queues.
*/
packet_t free[ FREE_QUEUES_COUNT ];
85,7 → 85,7
*/
unsigned int count;
} ps_globals = {
{ 1 },
{ .counter = 1, .waiters = { .prev = & ps_globals.lock.waiters, .next = & ps_globals.lock.waiters, }},
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL },
{ PAGE_SIZE, PAGE_SIZE * 2, PAGE_SIZE * 4, PAGE_SIZE * 8, PAGE_SIZE * 16, PAGE_SIZE * 32, PAGE_SIZE * 64 },
0
208,9 → 208,9
 
packet = pm_find( packet_id );
if( ! packet_is_valid( packet )) return ENOENT;
futex_down( & ps_globals.lock );
fibril_mutex_lock( & ps_globals.lock );
pq_destroy( packet, packet_release );
futex_up( & ps_globals.lock );
fibril_mutex_unlock( & ps_globals.lock );
return EOK;
}
 
227,7 → 227,7
size_t length;
 
length = ALIGN_UP( sizeof( struct packet ) + 2 * addr_len + max_prefix + max_content + max_suffix, PAGE_SIZE );
futex_down( & ps_globals.lock );
fibril_mutex_lock( & ps_globals.lock );
for( index = 0; index < FREE_QUEUES_COUNT - 1; ++ index ){
if( length <= ps_globals.sizes[ index ] ){
packet = ps_globals.free[ index ];
241,13 → 241,13
pq_detach( packet );
}
packet_init( packet, addr_len, max_prefix, max_content, max_suffix );
futex_up( & ps_globals.lock );
fibril_mutex_unlock( & ps_globals.lock );
return packet;
}
}
}
packet = packet_create( length, addr_len, max_prefix, max_content, max_suffix );
futex_up( & ps_globals.lock );
fibril_mutex_unlock( & ps_globals.lock );
return packet;
}