From c9b9dd690bac14b7402283e178d4c3b00f200d41 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Wed, 27 Apr 2011 02:54:44 +0000 Subject: Create a new frame_data_sequence data type; it represents a dense sequence of frame_data structures, indexed by the frame number. Extract the relevant bits of the capture_file data structure and move them to the frame_data_sequence, and move the relevant code from cfile.c and tweak it to handle frame_data_sequence structures. Have a possibly-null pointer to a frame_data_sequence structure in the capture_file structure; if it's null, we aren't keeping a sequence of frame_data structures (we don't keep that sequence when we're doing one-pass processing in TShark). Nothing in libwireshark should care about a capture_file structure; get rid of some unnecessary includes of cfile.h. svn path=/trunk/; revision=36881 --- cfile.c | 268 +++------------------------------------------------------------- 1 file changed, 12 insertions(+), 256 deletions(-) (limited to 'cfile.c') diff --git a/cfile.c b/cfile.c index 2249c77512..3463c1d538 100644 --- a/cfile.c +++ b/cfile.c @@ -37,260 +37,16 @@ void cap_file_init(capture_file *cf) { /* Initialize the capture file struct */ - cf->ptree_root = NULL; - cf->wth = NULL; - cf->filename = NULL; - cf->source = NULL; - cf->user_saved = FALSE; - cf->is_tempfile = FALSE; - cf->rfcode = NULL; - cf->dfilter = NULL; - cf->has_snap = FALSE; - cf->snap = WTAP_MAX_PACKET_SIZE; - cf->count = 0; - cf->redissecting = FALSE; -} - -/* - * For a given frame number, calculate the indices into a level 3 - * node, a level 2 node, a level 1 node, and a leaf node. - */ -#define LEVEL_3_INDEX(framenum) \ - ((framenum) >> (3*LOG2_NODES_PER_LEVEL)) -#define LEVEL_2_INDEX(framenum) \ - (((framenum) >> (2*LOG2_NODES_PER_LEVEL)) & (NODES_PER_LEVEL - 1)) -#define LEVEL_1_INDEX(framenum) \ - (((framenum) >> (1*LOG2_NODES_PER_LEVEL)) & (NODES_PER_LEVEL - 1)) -#define LEAF_INDEX(framenum) \ - (((framenum) >> (0*LOG2_NODES_PER_LEVEL)) & (NODES_PER_LEVEL - 1)) - -/* - * Add a new frame_data structure to the capture_file's collection. - */ -frame_data * -cap_file_add_fdata(capture_file *cf, frame_data *fdata) -{ - frame_data *leaf; - frame_data **level1; - frame_data ***level2; - frame_data ****level3; - frame_data *node; - - /* - * The current value of cf->count is the index value for the new frame, - * because the index value for a frame is the frame number - 1, and - * if we currently have cf->count frames, the the frame number of - * the last frame in the collection is cf->count, so its index value - * is cf->count - 1. - */ - if (cf->count == 0) { - /* The tree is empty; allocate the first leaf node, which will be - the root node. */ - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - node = &leaf[0]; - cf->ptree_root = leaf; - } else if (cf->count < NODES_PER_LEVEL) { - /* It's a 1-level tree, and is going to stay that way for now. */ - leaf = cf->ptree_root; - node = &leaf[cf->count]; - } else if (cf->count == NODES_PER_LEVEL) { - /* It's a 1-level tree that will turn into a 2-level tree. */ - level1 = g_malloc((sizeof *level1)*NODES_PER_LEVEL); - memset(level1, 0, (sizeof *level1)*NODES_PER_LEVEL); - level1[0] = cf->ptree_root; - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[1] = leaf; - node = &leaf[0]; - cf->ptree_root = level1; - } else if (cf->count < NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 2-level tree, and is going to stay that way for now. */ - level1 = cf->ptree_root; - leaf = level1[cf->count >> LOG2_NODES_PER_LEVEL]; - if (leaf == NULL) { - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[cf->count >> LOG2_NODES_PER_LEVEL] = leaf; - } - node = &leaf[LEAF_INDEX(cf->count)]; - } else if (cf->count == NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 2-level tree that will turn into a 3-level tree */ - level2 = g_malloc((sizeof *level2)*NODES_PER_LEVEL); - memset(level2, 0, (sizeof *level2)*NODES_PER_LEVEL); - level2[0] = cf->ptree_root; - level1 = g_malloc((sizeof *level1)*NODES_PER_LEVEL); - memset(level1, 0, (sizeof *level1)*NODES_PER_LEVEL); - level2[1] = level1; - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[0] = leaf; - node = &leaf[0]; - cf->ptree_root = level2; - } else if (cf->count < NODES_PER_LEVEL*NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 3-level tree, and is going to stay that way for now. */ - level2 = cf->ptree_root; - level1 = level2[cf->count >> (LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL)]; - if (level1 == NULL) { - level1 = g_malloc((sizeof *level1)*NODES_PER_LEVEL); - memset(level1, 0, (sizeof *level1)*NODES_PER_LEVEL); - level2[cf->count >> (LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL)] = level1; - } - leaf = level1[LEVEL_1_INDEX(cf->count)]; - if (leaf == NULL) { - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[LEVEL_1_INDEX(cf->count)] = leaf; - } - node = &leaf[LEAF_INDEX(cf->count)]; - } else if (cf->count == NODES_PER_LEVEL*NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 3-level tree that will turn into a 4-level tree */ - level3 = g_malloc((sizeof *level3)*NODES_PER_LEVEL); - memset(level3, 0, (sizeof *level3)*NODES_PER_LEVEL); - level3[0] = cf->ptree_root; - level2 = g_malloc((sizeof *level2)*NODES_PER_LEVEL); - memset(level2, 0, (sizeof *level2)*NODES_PER_LEVEL); - level3[1] = level2; - level1 = g_malloc((sizeof *level1)*NODES_PER_LEVEL); - memset(level1, 0, (sizeof *level1)*NODES_PER_LEVEL); - level2[0] = level1; - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[0] = leaf; - node = &leaf[0]; - cf->ptree_root = level3; - } else { - /* cf->count is 2^32-1 at most, and NODES_PER_LEVEL^4 - 2^(LOG2_NODES_PER_LEVEL*4), and LOG2_NODES_PER_LEVEL is 10, - so cf->count is always less < NODES_PER_LEVEL^4. - - XXX - we should fail if cf->count is 2^31-1, or should - make the frame numbers 64-bit and just let users run - themselves out of address space or swap space. :-) */ - /* It's a 4-level tree, and is going to stay that way forever. */ - level3 = cf->ptree_root; - level2 = level3[LEVEL_3_INDEX(cf->count)]; - if (level2 == NULL) { - level2 = g_malloc((sizeof *level2)*NODES_PER_LEVEL); - memset(level2, 0, (sizeof *level2)*NODES_PER_LEVEL); - level3[LEVEL_3_INDEX(cf->count)] = level2; - } - level1 = level2[LEVEL_2_INDEX(cf->count)]; - if (level1 == NULL) { - level1 = g_malloc((sizeof *level1)*NODES_PER_LEVEL); - memset(level1, 0, (sizeof *level1)*NODES_PER_LEVEL); - level2[LEVEL_2_INDEX(cf->count)] = level1; - } - leaf = level1[LEVEL_1_INDEX(cf->count)]; - if (leaf == NULL) { - leaf = g_malloc((sizeof *leaf)*NODES_PER_LEVEL); - level1[LEVEL_1_INDEX(cf->count)] = leaf; - } - node = &leaf[LEAF_INDEX(cf->count)]; - } - *node = *fdata; - cf->count++; - return node; -} - -/* - * Find the frame_data for the specified frame number. - */ -frame_data * -cap_file_find_fdata(capture_file *cf, guint32 num) -{ - frame_data *leaf; - frame_data **level1; - frame_data ***level2; - frame_data ****level3; - - if (num == 0) { - /* There is no frame number 0 */ - return NULL; - } - - /* Convert it into an index number. */ - num--; - if (num >= cf->count) { - /* There aren't that many frames. */ - return NULL; - } - - if (cf->count <= NODES_PER_LEVEL) { - /* It's a 1-level tree. */ - leaf = cf->ptree_root; - return &leaf[num]; - } - if (cf->count <= NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 2-level tree. */ - level1 = cf->ptree_root; - leaf = level1[num >> LOG2_NODES_PER_LEVEL]; - return &leaf[LEAF_INDEX(num)]; - } - if (cf->count <= NODES_PER_LEVEL*NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 3-level tree. */ - level2 = cf->ptree_root; - level1 = level2[num >> (LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL)]; - leaf = level1[(num >> LOG2_NODES_PER_LEVEL) & (NODES_PER_LEVEL - 1)]; - return &leaf[LEAF_INDEX(num)]; - } - /* cf->count is 2^32-1 at most, and NODES_PER_LEVEL^4 - 2^(LOG2_NODES_PER_LEVEL*4), and LOG2_NODES_PER_LEVEL is 10, - so cf->count is always less < NODES_PER_LEVEL^4. */ - /* It's a 4-level tree, and is going to stay that way forever. */ - level3 = cf->ptree_root; - level2 = level3[num >> (LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL)]; - level1 = level2[(num >> (LOG2_NODES_PER_LEVEL+LOG2_NODES_PER_LEVEL)) & (NODES_PER_LEVEL - 1)]; - leaf = level1[(num >> LOG2_NODES_PER_LEVEL) & (NODES_PER_LEVEL - 1)]; - return &leaf[LEAF_INDEX(num)]; -} - -/* - * Free up all the frame information for a capture file. - */ -void -cap_file_free_frames(capture_file *cf) -{ - frame_data **level1; - frame_data ***level2; - frame_data ****level3; - guint i, j, k; - - if (cf->count == 0) { - /* Nothing to free. */ - return; - } - if (cf->count <= NODES_PER_LEVEL) { - /* It's a 1-level tree. */ - g_free(cf->ptree_root); - } else if (cf->count <= NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 2-level tree. */ - level1 = cf->ptree_root; - for (i = 0; i < NODES_PER_LEVEL && level1[i] != NULL; i++) - g_free(level1[i]); - g_free(level1); - } else if (cf->count <= NODES_PER_LEVEL*NODES_PER_LEVEL*NODES_PER_LEVEL) { - /* It's a 3-level tree. */ - level2 = cf->ptree_root; - for (i = 0; i < NODES_PER_LEVEL && level2[i] != NULL; i++) { - level1 = level2[i]; - for (j = 0; j < NODES_PER_LEVEL && level1[i] != NULL; j++) - g_free(level1[j]); - g_free(level1); - } - g_free(level2); - return; - } else { - /* cf->count is 2^32-1 at most, and NODES_PER_LEVEL^4 - 2^(LOG2_NODES_PER_LEVEL*4), and LOG2_NODES_PER_LEVEL is 10, - so cf->count is always less < NODES_PER_LEVEL^4. */ - /* It's a 4-level tree, and is going to stay that way forever. */ - level3 = cf->ptree_root; - for (i = 0; i < NODES_PER_LEVEL && level3[i] != NULL; i++) { - level2 = level3[i]; - for (j = 0; j < NODES_PER_LEVEL && level2[i] != NULL; j++) { - level1 = level2[j]; - for (k = 0; k < NODES_PER_LEVEL && level1[k] != NULL; k++) - g_free(level1[k]); - } - g_free(level2); - } - g_free(level3); - } - cf->ptree_root = NULL; - cf->count = 0; + cf->filename = NULL; + cf->source = NULL; + cf->is_tempfile = FALSE; + cf->user_saved = FALSE; + cf->count = 0; + cf->has_snap = FALSE; + cf->snap = WTAP_MAX_PACKET_SIZE; + cf->wth = NULL; + cf->rfcode = NULL; + cf->dfilter = NULL; + cf->redissecting = FALSE; + cf->frames = NULL; } -- cgit v1.2.3