1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Mathieu Desnoyers
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 #ifndef _PROCESS_LIST_H
20 #define _PROCESS_LIST_H
24 #include <lttv/state.h>
32 * Create a process list
33 * contains the data for the process list
34 * tells the height of the process list widget
35 * provides methods to add/remove process from the list
36 * note : the sync with drawing is left to the caller.
37 * provides helper function to convert a process unique identifier to
42 /* Unique identifiers for resource types */
43 #define RV_RESOURCE_MACHINE 0
44 #define RV_RESOURCE_CPU 1
45 #define RV_RESOURCE_IRQ 2
46 #define RV_RESOURCE_SOFT_IRQ 3
47 #define RV_RESOURCE_TRAP 4
48 #define RV_RESOURCE_BDEV 5
49 #define RV_RESOURCE_COUNT 6
51 /* Enumeration of the columns */
60 typedef struct _ResourceInfo {
68 struct _ResourceType
{
69 /* a hashtable containing the data of each resource of this type */
70 GHashTable
*hash_table
;
72 typedef struct _ResourceType ResourceType
;
74 typedef struct _ResourceUnique
{
79 typedef struct _ResourceUniqueNumeric
{
83 } ResourceUniqueNumeric
;
85 typedef struct _HashedResourceData
{
88 GdkPixmap
*pixmap
; // Pixmap slice containing drawing buffer for the PID
89 gint height
; // height of the pixmap
90 GtkTreeIter y_iter
; // Access quickly to y pos.
91 // DrawContext *draw_context;
92 /* Information on current drawing */
95 gboolean over_used
; /* inform the user that information is incomplete */
96 gboolean over_marked
; /* inform the user that information is incomplete */
98 gboolean middle_used
; /* inform the user that information is incomplete */
99 gboolean middle_marked
;/* inform the user that information is incomplete */
101 gboolean under_used
; /* inform the user that information is incomplete */
102 gboolean under_marked
; /* inform the user that information is incomplete */
103 } x
; /* last x position saved by after state update */
105 LttTime next_good_time
; /* precalculate the next time where the next
109 } HashedResourceData
;
111 struct _ProcessList
{
113 GtkWidget
*process_list_widget
;
114 GtkTreeStore
*list_store
;
115 GtkWidget
*button
; /* one button of the tree view */
116 GtkCellRenderer
*renderer
;
118 /* A hash table by PID to speed up process position find in the list */
119 // GHashTable *process_hash;
121 guint number_of_process
;
124 /* Current process pointer, one per cpu, one per trace */
125 HashedResourceData
***current_hash_data
;
127 /* Array containing index -> pixmap correspondance. Must be updated
128 * every time the process list is reordered, process added or removed */
129 GPtrArray
* index_to_pixmap
;
131 ResourceType restypes
[RV_RESOURCE_COUNT
];
134 typedef struct _UpdateIndexPixmapArg
{
135 ProcessList
*process_list
;
137 } UpdateIndexPixmapArg
;
139 #ifndef TYPE_PROCESSLIST_DEFINED
140 #define TYPE_PROCESSLIST_DEFINED
141 typedef struct _ProcessList ProcessList
;
142 #endif //TYPE_PROCESSLIST_DEFINED
145 #ifndef TYPE_DRAWING_T_DEFINED
146 #define TYPE_DRAWING_T_DEFINED
147 typedef struct _Drawing_t Drawing_t
;
148 #endif //TYPE_DRAWING_T_DEFINED
150 ProcessList
*processlist_construct(void);
151 void processlist_destroy(ProcessList
*process_list
);
152 GtkWidget
*processlist_get_widget(ProcessList
*process_list
);
154 void processlist_clear(ProcessList
*process_list
);
156 // out : success (0) and height
157 /* CPU num is only used for PID 0 */
158 //int resourcelist_add( ProcessList *process_list, Drawing_t *drawing, guint trace_num,
159 // GQuark name, guint type, guint id, guint *height, ResourceInfo **pm_resource_info,
160 // HashedResourceData **pm_hashed_resource_data, GQuark parent);
162 // out : success (0) and height
163 int processlist_remove(ProcessList
*process_list
, guint pid
, guint cpu
,
164 LttTime
*birth
, guint trace_num
);
166 /* Set the name of a process */
167 void processlist_set_name(ProcessList
*process_list
,
169 HashedResourceData
*hashed_process_data
);
171 /* Set the ppid of a process */
172 void processlist_set_tgid(ProcessList
*process_list
,
174 HashedResourceData
*hashed_process_data
);
175 void processlist_set_ppid(ProcessList
*process_list
,
177 HashedResourceData
*hashed_process_data
);
180 /* Synchronize the list at the left and the drawing */
181 void update_index_to_pixmap(ProcessList
*process_list
);
183 /* Update the width of each pixmap buffer for each process */
184 void update_pixmap_size(ProcessList
*process_list
, guint width
);
187 /* Put src and/or dest to NULL to copy from/to the each PID specific pixmap */
188 void copy_pixmap_region(ProcessList
*process_list
, GdkDrawable
*dest
,
189 GdkGC
*gc
, GdkDrawable
*src
,
190 gint xsrc
, gint ysrc
,
191 gint xdest
, gint ydest
, gint width
, gint height
);
193 /* If height is -1, the height of each pixmap is used */
194 void rectangle_pixmap(ProcessList
*process_list
, GdkGC
*gc
,
195 gboolean filled
, gint x
, gint y
, gint width
, gint height
);
197 /* Renders each pixmaps into on big drawable */
198 void copy_pixmap_to_screen(ProcessList
*process_list
,
202 gint width
, gint height
);
204 static inline gint
get_cell_height(GtkTreeView
*TreeView
)
207 GtkTreeViewColumn
*column
= gtk_tree_view_get_column(TreeView
, 0);
209 gtk_tree_view_column_cell_get_size(column
, NULL
, NULL
, NULL
, NULL
, &height
);
211 gint vertical_separator
;
212 gtk_widget_style_get (GTK_WIDGET (TreeView
),
213 "vertical-separator", &vertical_separator
,
215 height
+= vertical_separator
;
220 static inline guint
processlist_get_height(ProcessList
*process_list
)
222 return process_list
->cell_height
* process_list
->number_of_process
;
226 //static inline HashedResourceData *processlist_get_process_data(
227 // ProcessList *process_list, GQuark resource_name, guint trace_num)
229 // ResourceInfo resource_info;
231 //// process_info.pid = pid;
233 //// process_info.cpu = cpu;
235 //// process_info.cpu = ANY_CPU;
236 //// process_info.birth = *birth;
237 //// process_info.trace_num = trace_num;
238 // resource_info.name = resource_name;
239 // resource_info.trace_num = trace_num;
241 // return (HashedResourceData*)g_hash_table_lookup(
242 // process_list->process_hash,
247 static inline gint
processlist_get_pixels_from_data( ProcessList
*process_list
,
248 HashedResourceData
*hashed_process_data
,
253 GtkTreePath
*tree_path
;
255 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
256 &hashed_process_data
->y_iter
);
257 path_indices
= gtk_tree_path_get_indices (tree_path
);
259 *height
= get_cell_height((GtkTreeView
*)process_list
->process_list_widget
);
260 *y
= *height
* path_indices
[0];
261 gtk_tree_path_free(tree_path
);
267 static inline guint
processlist_get_index_from_data(ProcessList
*process_list
,
268 HashedResourceData
*hashed_process_data
)
271 GtkTreePath
*tree_path
;
275 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
276 &hashed_process_data
->y_iter
);
277 path_indices
= gtk_tree_path_get_indices (tree_path
);
278 depth
= gtk_tree_path_get_depth(tree_path
);
280 // ret = path_indices[1]+path_indices[0]+1;
281 ret
= path_indices
[0];
283 ret
+= 1+path_indices
[1];
285 gtk_tree_path_free(tree_path
);
290 /* Return the hash table used to store the data of each resource of a given resource type */
292 static inline GHashTable
*resourcelist_get_resource_hash_table(ControlFlowData
*resourceview_data
, guint type
)
294 return resourceview_data
->process_list
->restypes
[type
].hash_table
;
297 HashedResourceData
*resourcelist_obtain_cpu(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
298 HashedResourceData
*resourcelist_obtain_irq(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
299 HashedResourceData
*resourcelist_obtain_soft_irq(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
300 HashedResourceData
*resourcelist_obtain_trap(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
301 HashedResourceData
*resourcelist_obtain_bdev(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
303 #endif // _PROCESS_LIST_H