| /* |
| *------------------------------------------------------------------ |
| * Copyright (c) 2009-2016 Cisco and/or its affiliates. |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <netinet/in.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <sys/fcntl.h> |
| #include <sys/mman.h> |
| #include <unistd.h> |
| #include <ctype.h> |
| #include <vppinfra/clib.h> |
| #include <vppinfra/vec.h> |
| #include <vppinfra/hash.h> |
| #include <vppinfra/elog.h> |
| #include <pwd.h> |
| #include <stdarg.h> |
| #include <time.h> |
| #include "cpel.h" |
| #include "g2.h" |
| |
| extern int widest_track_format; |
| |
| typedef struct bound_track_ { |
| u32 track; |
| u8 *track_str; |
| } bound_track_t; |
| |
| extern bound_track_t *bound_tracks; |
| |
| extern uword *the_evtdef_hash; /* (event-id, event-definition) hash */ |
| extern uword *the_trackdef_hash; /* (track-id, track-definition) hash */ |
| |
| extern elog_main_t elog_main; |
| |
| void *get_clib_event (unsigned int datum) |
| { |
| elog_event_t *ep = vec_elt_at_index (elog_main.events, datum); |
| return (void *)ep; |
| } |
| |
| /* |
| * read_clib_file |
| */ |
| int read_clib_file(char *clib_file) |
| { |
| static FILE *ofp; |
| clib_error_t *error = 0; |
| int i; |
| elog_main_t *em = &elog_main; |
| double starttime, delta; |
| |
| vec_free(em->events); |
| vec_free(em->event_types); |
| if (the_trackdef_hash) |
| hash_free(the_trackdef_hash); |
| |
| the_trackdef_hash = hash_create (0, sizeof (uword)); |
| |
| error = elog_read_file (&elog_main, clib_file); |
| |
| if (error) { |
| fformat(stderr, "%U", format_clib_error, error); |
| return (1); |
| } |
| |
| if (ofp == NULL) { |
| ofp = fdopen(2, "w"); |
| if (ofp == NULL) { |
| fprintf(stderr, "Couldn't fdopen(2)?\n"); |
| exit(1); |
| } |
| } |
| |
| em = &elog_main; |
| |
| for (i = 0; i < vec_len (em->tracks); i++) { |
| u32 track_code; |
| bound_track_t * btp; |
| elog_track_t * t; |
| uword * p; |
| int track_strlen; |
| |
| t = &em->tracks[i]; |
| track_code = i; |
| p = hash_get(the_trackdef_hash, track_code); |
| if (p) { |
| fprintf(ofp, "track %d redefined, retain first definition\n", |
| track_code); |
| continue; |
| } |
| vec_add2(bound_tracks, btp, 1); |
| btp->track = track_code; |
| btp->track_str = (u8 *) t->name; |
| hash_set(the_trackdef_hash, track_code, btp - bound_tracks); |
| |
| track_strlen = strlen((char *)btp->track_str); |
| if (track_strlen > widest_track_format) |
| widest_track_format = track_strlen; |
| } |
| |
| initialize_events(); |
| |
| for (i = 0; i < vec_len (em->event_types); i++) { |
| elog_event_type_t *ep; |
| u8 *tmp; |
| |
| ep = vec_elt_at_index(em->event_types, i); |
| tmp = (u8 *) vec_dup(ep->format); |
| vec_add1(tmp,0); |
| add_event_from_clib_file (ep->type_index_plus_one, (char *) tmp, i); |
| vec_free(tmp); |
| } |
| |
| finalize_events(); |
| |
| cpel_event_init(vec_len(em->events)); |
| |
| starttime = em->events[0].time; |
| |
| for (i = 0; i < vec_len (em->events); i++) { |
| elog_event_t *ep; |
| |
| ep = vec_elt_at_index(em->events, i); |
| |
| delta = ep->time - starttime; |
| |
| add_clib_event (delta, ep->track, ep->event_type + 1, i); |
| } |
| |
| cpel_event_finalize(); |
| |
| set_pid_ax_width(8*widest_track_format); |
| |
| return(0); |
| } |
| |
| unsigned int vl(void *a) |
| { |
| return vec_len (a); |
| } |