Use GSlice API instead of GMemChunk API for some memory allocation.

svn path=/trunk/; revision=40547
This commit is contained in:
Bill Meier 2012-01-16 19:05:32 +00:00
parent 49eff359e1
commit 48ca3d4742
4 changed files with 47 additions and 97 deletions

View File

@ -32,11 +32,6 @@
# include "config.h"
#endif
/* The mate dissector is using deprecated GMemChunk. Do not error out
* when encountering it.
*/
#undef G_DISABLE_DEPRECATED
#ifndef ENABLE_STATIC
#include "moduleinfo.h"
#include <gmodule.h>
@ -274,7 +269,6 @@ typedef struct _mate_config_frame {
typedef struct _mate_runtime_data {
guint current_items; /* a count of items */
GMemChunk* mate_items;
float now;
guint highest_analyzed_frame;

View File

@ -61,7 +61,7 @@ static FILE* dbg_facility = NULL;
static gboolean destroy_mate_pdus(gpointer k _U_, gpointer v, gpointer p _U_) {
mate_pdu* pdu = (mate_pdu*) v;
if (pdu->avpl) delete_avpl(pdu->avpl,TRUE);
g_mem_chunk_free(rd->mate_items,pdu);
g_slice_free(mate_max_size, (mate_max_size *)pdu);
return TRUE;
}
@ -78,7 +78,7 @@ static gboolean destroy_mate_gops(gpointer k _U_, gpointer v, gpointer p _U_) {
g_free(gop->gop_key);
}
g_mem_chunk_free(rd->mate_items,gop);
g_slice_free(mate_max_size,(mate_max_size*)gop);
return TRUE;
}
@ -96,7 +96,7 @@ static gboolean destroy_mate_gogs(gpointer k _U_, gpointer v, gpointer p _U_) {
g_ptr_array_free(gog->gog_keys,FALSE);
}
g_mem_chunk_free(rd->mate_items,gog);
g_slice_free(mate_max_size,(mate_max_size*)gog);
return TRUE;
}
@ -140,7 +140,6 @@ extern void initialize_mate_runtime(void) {
if (( mc = mate_cfg() )) {
if (rd == NULL ) {
rd = g_malloc(sizeof(mate_runtime_data));
rd->mate_items = g_mem_chunk_new("mate_items",sizeof(mate_max_size),1024,G_ALLOC_AND_FREE);
} else {
g_hash_table_foreach(mc->pducfgs,destroy_pdus_in_cfg,NULL);
g_hash_table_foreach(mc->gopcfgs,destroy_gops_in_cfg,NULL);
@ -173,7 +172,7 @@ extern void initialize_mate_runtime(void) {
static mate_gop* new_gop(mate_cfg_gop* cfg, mate_pdu* pdu, gchar* key) {
mate_gop* gop = g_mem_chunk_alloc(rd->mate_items);
mate_gop* gop = (mate_gop*)g_slice_new(mate_max_size);
gop->id = ++(cfg->last_id);
gop->cfg = cfg;
@ -237,8 +236,7 @@ static void adopt_gop(mate_gog* gog, mate_gop* gop) {
}
static mate_gog* new_gog(mate_cfg_gog* cfg, mate_gop* gop) {
mate_gog* gog = g_mem_chunk_alloc(rd->mate_items);
mate_gog* gog = (mate_gog*)g_slice_new(mate_max_size);
gog->id = ++(cfg->last_id);
gog->cfg = cfg;
@ -709,7 +707,7 @@ static void get_pdu_fields(gpointer k, gpointer v, gpointer p) {
}
static mate_pdu* new_pdu(mate_cfg_pdu* cfg, guint32 framenum, field_info* proto, proto_tree* tree) {
mate_pdu* pdu = g_mem_chunk_alloc(rd->mate_items);
mate_pdu* pdu = (mate_pdu*)g_slice_new(mate_max_size);
field_info* cfi;
GPtrArray* ptrs;
mate_range* range;
@ -880,7 +878,7 @@ extern void mate_analyze_frame(packet_info *pinfo, proto_tree* tree) {
|| ( ! criterium_match && cfg->criterium_accept_mode == ACCEPT_MODE )) {
delete_avpl(pdu->avpl,TRUE);
g_mem_chunk_free(rd->mate_items,pdu);
g_slice_free(mate_max_size,(mate_max_size*)pdu);
pdu = NULL;
continue;
@ -891,7 +889,7 @@ extern void mate_analyze_frame(packet_info *pinfo, proto_tree* tree) {
if ( ! pdu->gop && cfg->drop_unassigned) {
delete_avpl(pdu->avpl,TRUE);
g_mem_chunk_free(rd->mate_items,pdu);
g_slice_free(mate_max_size,(mate_max_size*)pdu);
pdu = NULL;
continue;
}

View File

@ -82,50 +82,30 @@ void dbg_print(const gint* which, gint how, FILE* where, const gchar* fmt, ... )
/**
* scs_init:
* @collection: the scs hash
*
* Initializes the scs hash.
**/
/* Don't call variables "small" or "huge". They are keywords for the MSVC compiler. Rename them to "mate_small" and "mate_huge"*/
struct _scs_collection {
GHashTable* hash; /* key: a string value: guint number of subscribers */
GMemChunk* ctrs;
GMemChunk* mate_small;
GMemChunk* mate_medium;
GMemChunk* mate_large;
GMemChunk* mate_huge;
};
extern void destroy_scs_collection(SCS_collection* c) {
if ( c->ctrs ) g_mem_chunk_destroy(c->ctrs);
if ( c->mate_small ) g_mem_chunk_destroy(c->mate_small);
if ( c->mate_medium ) g_mem_chunk_destroy(c->mate_medium);
if ( c->mate_large ) g_mem_chunk_destroy(c->mate_large);
if ( c->mate_huge ) g_mem_chunk_destroy(c->mate_huge);
if (c->hash) g_hash_table_destroy(c->hash);
/* ToDo? free any string,ctr entries pointed to by the hash table ??
* XXX: AFAIKT destroy_scs_collection() might be called only when reading a
* mate config file. Since reading a new config file can apparently currently
* only be done once after starting Wireshark, in theory this fcn
* currently should never be called since there will never be an existing
* scs_collection to be destroyed.
*/
static void destroy_scs_collection(SCS_collection* c) {
if (c->hash) g_hash_table_destroy(c->hash);
}
extern SCS_collection* scs_init(void) {
static SCS_collection* scs_init(void) {
SCS_collection* c = g_malloc(sizeof(SCS_collection));
c->hash = g_hash_table_new(g_str_hash,g_str_equal);
c->ctrs = g_mem_chunk_new("ints_scs_chunk", sizeof(guint),
sizeof(guint) * SCS_SMALL_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->mate_small = g_mem_chunk_new("small_scs_chunk", SCS_SMALL_SIZE,
SCS_SMALL_SIZE * SCS_SMALL_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->mate_medium = g_mem_chunk_new("medium_scs_chunk", SCS_MEDIUM_SIZE,
SCS_MEDIUM_SIZE * SCS_MEDIUM_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->mate_large = g_mem_chunk_new("large_scs_chunk", SCS_LARGE_SIZE,
SCS_LARGE_SIZE * SCS_LARGE_CHUNK_SIZE, G_ALLOC_AND_FREE);
c->mate_huge = g_mem_chunk_new("huge_scs_chunk", SCS_HUGE_SIZE,
SCS_HUGE_SIZE * SCS_HUGE_CHUNK_SIZE, G_ALLOC_AND_FREE);
return c;
}
@ -146,37 +126,31 @@ gchar* scs_subscribe(SCS_collection* c, const gchar* s) {
gchar* orig = NULL;
guint* ip = NULL;
size_t len = 0;
GMemChunk* chunk = NULL;
g_hash_table_lookup_extended(c->hash,(gconstpointer)s,(gpointer)&orig,(gpointer)&ip);
if (ip) {
(*ip)++;
} else {
ip = g_mem_chunk_alloc(c->ctrs);
ip = g_slice_new(guint);
*ip = 0;
len = strlen(s) + 1;
if (len <= SCS_SMALL_SIZE) {
chunk = c->mate_small;
len = SCS_SMALL_SIZE;
} else if (len <= SCS_MEDIUM_SIZE) {
chunk = c->mate_medium;
len = SCS_MEDIUM_SIZE;
} else if (len <= SCS_LARGE_SIZE) {
chunk = c->mate_large;
len = SCS_LARGE_SIZE;
} else if (len < SCS_HUGE_SIZE) {
chunk = c->mate_huge;
len = SCS_HUGE_SIZE;
} else {
chunk = c->mate_huge;
len = SCS_HUGE_SIZE;
g_warning("mate SCS: string truncated due to huge size");
}
orig = g_mem_chunk_alloc(chunk);
orig = g_slice_alloc(len);
g_strlcpy(orig,s,len);
g_hash_table_insert(c->hash,orig,ip);
@ -197,7 +171,6 @@ void scs_unsubscribe(SCS_collection* c, gchar* s) {
gchar* orig = NULL;
guint* ip = NULL;
size_t len = 0xffff;
GMemChunk* chunk = NULL;
g_hash_table_lookup_extended(c->hash,(gconstpointer)s,(gpointer)&orig,(gpointer)&ip);
@ -208,17 +181,17 @@ void scs_unsubscribe(SCS_collection* c, gchar* s) {
len = strlen(orig);
if (len < SCS_SMALL_SIZE) {
chunk = c->mate_small;
len = SCS_SMALL_SIZE;
} else if (len < SCS_MEDIUM_SIZE) {
chunk = c->mate_medium;
len = SCS_MEDIUM_SIZE;
} else if (len < SCS_LARGE_SIZE) {
chunk = c->mate_large;
len = SCS_LARGE_SIZE;
} else {
chunk = c->mate_huge;
len = SCS_HUGE_SIZE;
}
g_mem_chunk_free(chunk,orig);
g_mem_chunk_free(c->ctrs,ip);
g_slice_free1(len, orig);
g_slice_free(guint,ip);
}
else {
(*ip)--;
@ -252,7 +225,7 @@ gchar* scs_subscribe_printf(SCS_collection* c, gchar* fmt, ...) {
* AVPs & Co.
***************************************************************************
* The Thing operates mainly on avps, avpls and loals
* - attribute value pairs (two strings: the name and the value and an opeartor)
* - attribute value pairs (two strings: the name and the value and an operator)
* - avp lists a somehow sorted list of avps
* - loal (list of avp lists) an arbitrarily sorted list of avpls
*
@ -269,7 +242,6 @@ typedef union _any_avp_type {
} any_avp_type;
static GMemChunk* avp_chunk = NULL;
static SCS_collection* avp_strings = NULL;
#ifdef _AVP_DEBUGGING
@ -299,7 +271,7 @@ static int* dbg_avpl_op = &dbg_avpl_op_level;
* @avpl: a pointer to the level of debugging of facility "avpl"
* @avpl_op: a pointer to the level of debugging of facility "avpl_op"
*
* If enabled set's up the debug facilities for the avp library.
* If enabled sets up the debug facilities for the avp library.
*
**/
extern void setup_avp_debug(FILE* fp, int* general, int* avp, int* avp_op, int* avpl, int* avpl_op) {
@ -315,7 +287,6 @@ extern void setup_avp_debug(FILE* fp, int* general, int* avp, int* avp_op, int*
/**
* avp_init:
* @chunk_size: the initial chunk's size.
*
* (Re)Initializes the avp library.
*
@ -325,13 +296,8 @@ extern void avp_init(void) {
if (avp_strings) destroy_scs_collection(avp_strings);
avp_strings = scs_init();
if ( avp_chunk ) g_mem_chunk_destroy(avp_chunk);
avp_chunk = g_mem_chunk_new("avp_chunk", sizeof(any_avp_type),
AVP_CHUNK_SIZE, G_ALLOC_AND_FREE);
}
/**
* new_avp_from_finfo:
* @name: the name the avp will have.
@ -343,7 +309,7 @@ extern void avp_init(void) {
*
**/
extern AVP* new_avp_from_finfo(const gchar* name, field_info* finfo) {
AVP* new = g_mem_chunk_alloc(avp_chunk);
AVP* new = (AVP*)g_slice_new(any_avp_type);
gchar* value;
new->n = scs_subscribe(avp_strings, name);
@ -384,7 +350,7 @@ extern AVP* new_avp_from_finfo(const gchar* name, field_info* finfo) {
*
**/
extern AVP* new_avp(const gchar* name, const gchar* value, gchar o) {
AVP* new = g_mem_chunk_alloc(avp_chunk);
AVP* new = (AVP*)g_slice_new(any_avp_type);
new->n = scs_subscribe(avp_strings, name);
new->v = scs_subscribe(avp_strings, value);
@ -411,7 +377,7 @@ extern void delete_avp(AVP* avp) {
scs_unsubscribe(avp_strings, avp->n);
scs_unsubscribe(avp_strings, avp->v);
g_mem_chunk_free(avp_chunk,avp);
g_slice_free(any_avp_type,(any_avp_type*)avp);
}
@ -419,13 +385,13 @@ extern void delete_avp(AVP* avp) {
* avp_copy:
* @from: the avp to be copied.
*
* Creates an avp whose name op and value are copyes of the given one.
* Creates an avp whose name op and value are copies of the given one.
*
* Return value: a pointer to the newly created avp.
*
**/
extern AVP* avp_copy(AVP* from) {
AVP* new = g_mem_chunk_alloc(avp_chunk);
AVP* new = (AVP*)g_slice_new(any_avp_type);
new->n = scs_subscribe(avp_strings, from->n);
new->v = scs_subscribe(avp_strings, from->v);
@ -448,7 +414,7 @@ extern AVP* avp_copy(AVP* from) {
*
**/
extern AVPL* new_avpl(const gchar* name) {
AVPL* new_avpl_p = g_mem_chunk_alloc(avp_chunk);
AVPL* new_avpl_p = (AVPL*)g_slice_new(any_avp_type);
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,7,dbg_fp,"new_avpl_p: %X name=%s",new_avpl_p,name);
@ -482,7 +448,7 @@ extern void rename_avpl(AVPL* avpl, gchar* name) {
* it is not inserted.
**/
extern gboolean insert_avp(AVPL* avpl, AVP* avp) {
AVPN* new = g_mem_chunk_alloc(avp_chunk);
AVPN* new = (AVPN*)g_slice_new(any_avp_type);
AVPN* c;
new->avp = avp;
@ -506,7 +472,7 @@ extern gboolean insert_avp(AVPL* avpl, AVP* avp) {
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,7,dbg_fp,"delete_avpn: %X",new);
#endif
g_mem_chunk_free(avp_chunk,new);
g_slice_free(any_avp_type,(any_avp_type*)new);
return FALSE;
}
}
@ -611,7 +577,7 @@ extern AVP* extract_avp_by_name(AVPL* avpl, gchar* name) {
avp = curr->avp;
g_mem_chunk_free(avp_chunk,curr);
g_slice_free(any_avp_type,(any_avp_type*)curr);
(avpl->len)--;
@ -652,7 +618,7 @@ extern AVP* extract_first_avp(AVPL* avpl) {
avp = node->avp;
if (avp) {
g_mem_chunk_free(avp_chunk,node);
g_slice_free(any_avp_type,(any_avp_type*)node);
(avpl->len)--;
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl,4,dbg_fp,"avpl: %X new len: %i",avpl,avpl->len);
@ -689,7 +655,7 @@ extern AVP* extract_last_avp(AVPL* avpl) {
avp = node->avp;
if (avp) {
g_mem_chunk_free(avp_chunk,node);
g_slice_free(any_avp_type,(any_avp_type*)node);
(avpl->len)--;
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl,4,dbg_fp,"avpl: %X new len: %i",avpl,avpl->len);
@ -727,7 +693,7 @@ extern void delete_avpl(AVPL* avpl, gboolean avps_too) {
}
scs_unsubscribe(avp_strings,avpl->name);
g_mem_chunk_free(avp_chunk,avpl);
g_slice_free(any_avp_type,(any_avp_type*)avpl);
}
@ -1357,7 +1323,7 @@ extern void avpl_transform(AVPL* src, AVPL_Transf* op) {
cs->prev->next = cs->next;
cs->next->prev = cs->prev;
g_mem_chunk_free(avp_chunk,cs);
g_slice_free(any_avp_type,(any_avp_type*)cs);
cs = n;
cm = cm->next;
@ -1384,7 +1350,7 @@ extern void avpl_transform(AVPL* src, AVPL_Transf* op) {
* Return value: a pointer to the newly created loal.
**/
extern LoAL* new_loal(const gchar* name) {
LoAL* new_loal_p = g_mem_chunk_alloc(avp_chunk);
LoAL* new_loal_p = (LoAL*)g_slice_new(any_avp_type);
if (! name) {
name = "anonymous";
@ -1411,7 +1377,7 @@ extern LoAL* new_loal(const gchar* name) {
*
**/
extern void loal_append(LoAL* loal, AVPL* avpl) {
LoALnode* node = g_mem_chunk_alloc(avp_chunk);
LoALnode* node = (LoALnode*)g_slice_new(any_avp_type);
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,3,dbg_fp,"new_loal_node: %X",node);
@ -1454,7 +1420,7 @@ extern AVPL* extract_first_avpl(LoAL* loal) {
avpl = node->avpl;
if ( avpl ) {
g_mem_chunk_free(avp_chunk,node);
g_slice_free(any_avp_type,(any_avp_type*)node);
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,3,dbg_fp,"extract_first_avpl: got %s",avpl->name);
@ -1488,7 +1454,7 @@ extern AVPL* extract_last_avpl(LoAL* loal){
avpl = node->avpl;
if ( avpl ) {
g_mem_chunk_free(avp_chunk,node);
g_slice_free(any_avp_type,(any_avp_type*)node);
#ifdef _AVP_DEBUGGING
dbg_print(dbg_avpl_op,3,dbg_fp,"delete_loal_node: %X",node);
#endif
@ -1549,7 +1515,7 @@ extern void delete_loal(LoAL* loal, gboolean avpls_too, gboolean avps_too) {
}
scs_unsubscribe(avp_strings,loal->name);
g_mem_chunk_free(avp_chunk,loal);
g_slice_free(any_avp_type,(any_avp_type*)loal);
}

View File

@ -49,25 +49,17 @@ typedef struct _scs_collection SCS_collection;
#define SCS_LARGE_SIZE 4096
#define SCS_HUGE_SIZE 65536
#define SCS_SMALL_CHUNK_SIZE 4096
#define SCS_MEDIUM_CHUNK_SIZE 1024
#define SCS_LARGE_CHUNK_SIZE 256
#define SCS_HUGE_CHUNK_SIZE 128
extern void destroy_scs_collection(SCS_collection* c);
extern SCS_collection* scs_init(void);
extern gchar* scs_subscribe(SCS_collection* collection, const gchar* s);
extern void scs_unsubscribe(SCS_collection* collection, gchar* s);
extern gchar* scs_subscribe_printf(SCS_collection* collection, gchar* fmt, ...);
/******* AVPs & Co. *********/
#define AVP_CHUNK_SIZE 4096
/* these are the defined oreators of avps */
#define AVP_OP_EQUAL '='
#define AVP_OP_NOTEQUAL '!'
#define AVP_OP_STARTS '^'
#define AVP_OP_ENDS '$'
#define AVP_OP_ENDS '$'
#define AVP_OP_CONTAINS '~'
#define AVP_OP_LOWER '<'
#define AVP_OP_HIGHER '>'