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., 59 Temple Place - Suite 330, 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 void processlist_set_brand(ProcessList
*process_list
,
173 HashedResourceData
*hashed_process_data
);
175 /* Set the ppid of a process */
176 void processlist_set_tgid(ProcessList
*process_list
,
178 HashedResourceData
*hashed_process_data
);
179 void processlist_set_ppid(ProcessList
*process_list
,
181 HashedResourceData
*hashed_process_data
);
184 /* Synchronize the list at the left and the drawing */
185 void update_index_to_pixmap(ProcessList
*process_list
);
187 /* Update the width of each pixmap buffer for each process */
188 void update_pixmap_size(ProcessList
*process_list
, guint width
);
191 /* Put src and/or dest to NULL to copy from/to the each PID specific pixmap */
192 void copy_pixmap_region(ProcessList
*process_list
, GdkDrawable
*dest
,
193 GdkGC
*gc
, GdkDrawable
*src
,
194 gint xsrc
, gint ysrc
,
195 gint xdest
, gint ydest
, gint width
, gint height
);
197 /* If height is -1, the height of each pixmap is used */
198 void rectangle_pixmap(ProcessList
*process_list
, GdkGC
*gc
,
199 gboolean filled
, gint x
, gint y
, gint width
, gint height
);
201 /* Renders each pixmaps into on big drawable */
202 void copy_pixmap_to_screen(ProcessList
*process_list
,
206 gint width
, gint height
);
208 static inline gint
get_cell_height(GtkTreeView
*TreeView
)
211 GtkTreeViewColumn
*column
= gtk_tree_view_get_column(TreeView
, 0);
213 gtk_tree_view_column_cell_get_size(column
, NULL
, NULL
, NULL
, NULL
, &height
);
215 gint vertical_separator
;
216 gtk_widget_style_get (GTK_WIDGET (TreeView
),
217 "vertical-separator", &vertical_separator
,
219 height
+= vertical_separator
;
224 static inline guint
processlist_get_height(ProcessList
*process_list
)
226 return process_list
->cell_height
* process_list
->number_of_process
;
230 //static inline HashedResourceData *processlist_get_process_data(
231 // ProcessList *process_list, GQuark resource_name, guint trace_num)
233 // ResourceInfo resource_info;
235 //// process_info.pid = pid;
237 //// process_info.cpu = cpu;
239 //// process_info.cpu = ANY_CPU;
240 //// process_info.birth = *birth;
241 //// process_info.trace_num = trace_num;
242 // resource_info.name = resource_name;
243 // resource_info.trace_num = trace_num;
245 // return (HashedResourceData*)g_hash_table_lookup(
246 // process_list->process_hash,
251 static inline gint
processlist_get_pixels_from_data( ProcessList
*process_list
,
252 HashedResourceData
*hashed_process_data
,
257 GtkTreePath
*tree_path
;
259 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
260 &hashed_process_data
->y_iter
);
261 path_indices
= gtk_tree_path_get_indices (tree_path
);
263 *height
= get_cell_height((GtkTreeView
*)process_list
->process_list_widget
);
264 *y
= *height
* path_indices
[0];
265 gtk_tree_path_free(tree_path
);
271 static inline guint
processlist_get_index_from_data(ProcessList
*process_list
,
272 HashedResourceData
*hashed_process_data
)
275 GtkTreePath
*tree_path
;
279 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
280 &hashed_process_data
->y_iter
);
281 path_indices
= gtk_tree_path_get_indices (tree_path
);
282 depth
= gtk_tree_path_get_depth(tree_path
);
284 // ret = path_indices[1]+path_indices[0]+1;
285 ret
= path_indices
[0];
287 ret
+= 1+path_indices
[1];
289 gtk_tree_path_free(tree_path
);
294 /* Return the hash table used to store the data of each resource of a given resource type */
296 static inline GHashTable
*resourcelist_get_resource_hash_table(ControlFlowData
*resourceview_data
, guint type
)
298 return resourceview_data
->process_list
->restypes
[type
].hash_table
;
301 HashedResourceData
*resourcelist_obtain_cpu(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
302 HashedResourceData
*resourcelist_obtain_irq(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
303 HashedResourceData
*resourcelist_obtain_soft_irq(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
304 HashedResourceData
*resourcelist_obtain_trap(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
305 HashedResourceData
*resourcelist_obtain_bdev(ControlFlowData
*resourceview_data
, guint trace_num
, guint id
);
307 #endif // _PROCESS_LIST_H