diff options
| author | Jonathan <hermanjl@hermanjl-Aspire-5553G.(none)> | 2012-03-05 18:00:39 -0500 |
|---|---|---|
| committer | Jonathan <hermanjl@hermanjl-Aspire-5553G.(none)> | 2012-03-05 18:00:39 -0500 |
| commit | 61266395ff4f371933c104cff6671aae7f43c3fd (patch) | |
| tree | 4e0c1bf15015a80a57db728c5857005234481f4b /Documentation | |
| parent | 8bcd73ddae5d74fb9b2b8aaedd3aa6a39ef3f75d (diff) | |
rt-graph: real-time tasks can be added / removed from the graph
Currently they copy the functionality of regular task.
Diffstat (limited to 'Documentation')
| -rw-r--r-- | Documentation/structure.txt | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/Documentation/structure.txt b/Documentation/structure.txt new file mode 100644 index 0000000..adee54d --- /dev/null +++ b/Documentation/structure.txt | |||
| @@ -0,0 +1,225 @@ | |||
| 1 | |||
| 2 | Can't do this until cpus set up! | ||
| 3 | |||
| 4 | 0. Load all events w/ proper stuff | ||
| 5 | |||
| 6 | 1. Create list of rt_tasks | ||
| 7 | 2. Create seperate dailog for rt tasks w/ a callback. | ||
| 8 | 3. Allow dialog to be filtered. | ||
| 9 | 4. Create dummy task thing that just says hi. | ||
| 10 | 5. Make it print out when it reads stuff. | ||
| 11 | 6. Draw shit | ||
| 12 | 7. Draw new shit. | ||
| 13 | |||
| 14 | |||
| 15 | struct trace-graph.h { | ||
| 16 | /* - header file for generic graphers */ | ||
| 17 | |||
| 18 | /* - What is returned for drawing */ | ||
| 19 | /* struct plot_info; */ | ||
| 20 | |||
| 21 | /* - what you can customize */ | ||
| 22 | /* struct plot_callbacks; */ | ||
| 23 | /* - customized in trace-*-plot.c */ | ||
| 24 | |||
| 25 | /* - one of these per trace-*-plot instantiation */ | ||
| 26 | /* struct graph_plot; */ | ||
| 27 | /* void* private is per trace-*-plot */ | ||
| 28 | /* *cb (callbacks) is the callbacks */ | ||
| 29 | |||
| 30 | |||
| 31 | /* struct graph_callbacks; */ | ||
| 32 | /* struct plot_list; */ | ||
| 33 | /* struct plot_hash; */ | ||
| 34 | |||
| 35 | /* /\* Current state of the displayed graph AS A WHOLE *\/ */ | ||
| 36 | struct graph_info { | ||
| 37 | handle; /* input handle */ | ||
| 38 | }; | ||
| 39 | |||
| 40 | /* - create with trace_graph_plot_insert */ | ||
| 41 | |||
| 42 | }; | ||
| 43 | |||
| 44 | struct parse-events.h { | ||
| 45 | /* Can write shit into it person by person */ | ||
| 46 | struct trace_seq; | ||
| 47 | }; | ||
| 48 | |||
| 49 | struct unknown { | ||
| 50 | |||
| 51 | }; | ||
| 52 | |||
| 53 | struct trace-graph.c { | ||
| 54 | |||
| 55 | }; | ||
| 56 | |||
| 57 | /* trace-graph.c */ | ||
| 58 | |||
| 59 | |||
| 60 | |||
| 61 | struct trace-plot-task.c { | ||
| 62 | |||
| 63 | /*** PRIVATE DATA ***/ | ||
| 64 | |||
| 65 | /* Private to each task plot */ | ||
| 66 | struct task_plot_info { | ||
| 67 | pid /* per task */ | ||
| 68 | /* Other current things, lotta last whatevs */ | ||
| 69 | } | ||
| 70 | |||
| 71 | /*** PRIVATE METHODS ****/ | ||
| 72 | |||
| 73 | /* Return true if the record (which is for this task) is a sched_switch | ||
| 74 | * and the data held is the previous state?? */ | ||
| 75 | is_running(ginfo, record); | ||
| 76 | |||
| 77 | /* Return true if the record is: | ||
| 78 | * a sched_switch to our pid or from our pid, is_sched = TRUE | ||
| 79 | * a wakeup, if we are waking up, wakeup = TRUE | ||
| 80 | * from our pid, all fALSE | ||
| 81 | */ | ||
| 82 | record_matches_pid(ginfo, record, match_pid, &pid, &sched_pid, &is_sched, &wakeup); | ||
| 83 | |||
| 84 | |||
| 85 | /* Sets cpu to given time. Read till that time is passed, freeing everytning | ||
| 86 | * on the way. | ||
| 87 | * If we reach a record at or past our time, set cursor to that time. | ||
| 88 | */ | ||
| 89 | set_cpu_to_time(cpu, ginfo, time); | ||
| 90 | |||
| 91 | /* Call above on all cpus */ | ||
| 92 | set_cpus_to_time(ginfo, time); | ||
| 93 | |||
| 94 | /* Return struct w/ array holding current record offset at each cpu */ | ||
| 95 | save_offsets(ginfo); | ||
| 96 | |||
| 97 | /* Set cursor to each offset, if present. Otherwise, put at end */ | ||
| 98 | restore_offsets(ginfo, offsets); | ||
| 99 | |||
| 100 | /* Return first record after time which is from our pid */ | ||
| 101 | find_record(ginfo, pid, time); | ||
| 102 | |||
| 103 | /* Updates last_whatevers in task info */ | ||
| 104 | update_last_record(ginfo, task_plot_info, record); | ||
| 105 | |||
| 106 | /* Reads backwards until it finds a matching record */ | ||
| 107 | find_previous_record(ginfo, start_record, pid, cpu); | ||
| 108 | |||
| 109 | get_display_record(ginfo, pid, time); | ||
| 110 | |||
| 111 | /**** PUBLIC METHODS *****/ | ||
| 112 | |||
| 113 | /* Basically reset as though you just started reading */ | ||
| 114 | task_plot_start(ginfo, plot, time); | ||
| 115 | |||
| 116 | /* Load the next record for me at or after that time */ | ||
| 117 | task_plot_match_time(ginfo, plot, time); | ||
| 118 | |||
| 119 | /* Get record at time, print info */ | ||
| 120 | task_plot_display_last_event(info, plot, trace_seq s, time); | ||
| 121 | |||
| 122 | /* Always draws a line of the color of the pid. Always. | ||
| 123 | * Then update_last_record. | ||
| 124 | * If record is null, times up, just finish our shit and return. | ||
| 125 | * If was running, and now wakeup, that means another task woke up | ||
| 126 | * We need to end our gd box. If it was us waking up,no box. | ||
| 127 | * return. | ||
| 128 | * If a match | ||
| 129 | * If a new cpu, see if we switched cpu. if so, create a box w/ | ||
| 130 | * proper color for LAST cpu, end it here. | ||
| 131 | * If scheduled, but we weren't currently running, we are now. | ||
| 132 | * Update the last bullshit. If we had a wake time, that means | ||
| 133 | * our wakeup turned into a run. Draw an empty box where we were | ||
| 134 | * awake but not running. Otherwise, reset wake time. | ||
| 135 | * Else if we haven't created a new box, (ie switched cpus), we got | ||
| 136 | * switched out. Create a goddamn box. | ||
| 137 | * Return | ||
| 138 | * If no previous last_records on this cpu, put this record there. | ||
| 139 | * If there was a last cpu, but no match, somehow we aren't running. | ||
| 140 | * Finish the box. | ||
| 141 | */ | ||
| 142 | task_plot_event(ginfo, plot,r ecord, info); | ||
| 143 | |||
| 144 | /* Just frontend for find_record */ | ||
| 145 | task_plot_find_record(ginfo, plot, time); | ||
| 146 | |||
| 147 | /* Print out event info if in current resolution */ | ||
| 148 | task_plot_display_info(ginfo, plot, sequence s, time); | ||
| 149 | |||
| 150 | /* Free private info */ | ||
| 151 | task_plot_destroy(info, plot); | ||
| 152 | |||
| 153 | |||
| 154 | /*** STATIC METHODS ***/ | ||
| 155 | |||
| 156 | /* Return what tasks are plotted */ | ||
| 157 | void graph_plot_task_plotted(ginfo, **plotted); | ||
| 158 | |||
| 159 | /* Called when task is clicked or removed */ | ||
| 160 | graph_plot_task_update_callback(accept, selected, non_selct, data); | ||
| 161 | |||
| 162 | /* Create a plot for a single task, insert into plot */ | ||
| 163 | graph_plot_task(ginfo, pid, pos); | ||
| 164 | |||
| 165 | }; | ||
| 166 | |||
| 167 | struct trace-plot-cpu.c{ | ||
| 168 | /*** DATA ***/ | ||
| 169 | struct cpu_plot_info { | ||
| 170 | cpu, last_time, last_pid, *last_record; | ||
| 171 | }; | ||
| 172 | |||
| 173 | /*** PRIVATE ***/ | ||
| 174 | /* Hashes for pid value, but if idle (aka 0), returns black) */ | ||
| 175 | hash_pid(val); | ||
| 176 | |||
| 177 | /* Sets cpu near time, reads until time is passed, returns last record */ | ||
| 178 | get_record_from_time(ginfo, cpu, time); | ||
| 179 | |||
| 180 | /* Return 1 if the record should be skipped */ | ||
| 181 | filter_record(ginfo, record, &orig_pid, &sched_pid, &sched_switch); | ||
| 182 | |||
| 183 | /* Update last_pid, last_record, and last_time */ | ||
| 184 | update_last_record(ginfo, cpu_info, record); | ||
| 185 | |||
| 186 | /* Uh eh hrm? */ | ||
| 187 | find_record_on_cpu(ginfo, cpu, time); | ||
| 188 | |||
| 189 | |||
| 190 | /*** PUBLIC ***/ | ||
| 191 | /* Gets record around time. Return 1 if exact match */ | ||
| 192 | cpu_plot_match_time(ginfo, plot, time); | ||
| 193 | |||
| 194 | /* Find first non-filtered event after time, write out info into s */ | ||
| 195 | cpu_plot_display_last_event(ginfo, plot, sequence s, time); | ||
| 196 | |||
| 197 | /* Prepare for liftoff ! */ | ||
| 198 | cpu_plot_start(ginfo, plot, time); | ||
| 199 | |||
| 200 | /* Generate stuff as needed */ | ||
| 201 | cpu_plot_event(ginfo, plot, record, info); | ||
| 202 | |||
| 203 | /* Call find record to get a record in this time */ | ||
| 204 | cpu_plot_find_record(ginfo, plot, time); | ||
| 205 | |||
| 206 | /* Write out info for record at or before time */ | ||
| 207 | cpu_plot_display_info(gino, plot, s, time); | ||
| 208 | |||
| 209 | /* You get it */ | ||
| 210 | cpu_plot_destroy(ginfo, plot); | ||
| 211 | |||
| 212 | /*** STATIC ***/ | ||
| 213 | /* Create cpu plot, add to trace graph */ | ||
| 214 | add_cpu_plot(ginfo, cpu); | ||
| 215 | |||
| 216 | /* Return cpus plotted in cpu_mask */ | ||
| 217 | graph_plot_cpus_plotted(ginfo, *all_cpus, **cpu_mask); | ||
| 218 | |||
| 219 | /* Remove unselected plots, add selected plots */ | ||
| 220 | graph_plot_cpus_update_callback(accept, all_cpus, selected_cpu_mast, data); | ||
| 221 | |||
| 222 | /* Automatigically add all cpus */ | ||
| 223 | graph_plot_init_cpus(); | ||
| 224 | |||
| 225 | } | ||
