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>
33 * Create a process list
34 * contains the data for the process list
35 * tells the height of the process list widget
36 * provides methods to add/remove process from the list
37 * note : the sync with drawing is left to the caller.
38 * provides helper function to convert a process unique identifier to
43 /* Unique identifiers for resource types */
44 #define RV_RESOURCE_MACHINE 0
45 #define RV_RESOURCE_CPU 1
46 #define RV_RESOURCE_IRQ 2
47 #define RV_RESOURCE_SOFT_IRQ 3
48 #define RV_RESOURCE_TRAP 4
49 #define RV_RESOURCE_BDEV 5
50 #define RV_RESOURCE_COUNT 6
52 /* Enumeration of the columns */
61 typedef struct _ResourceInfo {
69 typedef struct _ResourceUniqueNumeric
{
72 } ResourceUniqueNumeric
;
74 typedef struct _HashedResourceData
{
77 GdkPixmap
*pixmap
; // Pixmap slice containing drawing buffer for the PID
78 gint height
; // height of the pixmap
79 GtkTreeIter y_iter
; // Access quickly to y pos.
80 // DrawContext *draw_context;
81 /* Information on current drawing */
84 gboolean over_used
; /* inform the user that information is incomplete */
85 gboolean over_marked
; /* inform the user that information is incomplete */
87 gboolean middle_used
; /* inform the user that information is incomplete */
88 gboolean middle_marked
;/* inform the user that information is incomplete */
90 gboolean under_used
; /* inform the user that information is incomplete */
91 gboolean under_marked
; /* inform the user that information is incomplete */
92 } x
; /* last x position saved by after state update */
94 LttTime next_good_time
; /* precalculate the next time where the next
99 struct _ResourceType
{
100 /* functions for the hash table below */
101 guint (*hashfunc
)(gconstpointer
);
102 gboolean (*hashequalfunc
)(gconstpointer
,gconstpointer
);
103 /* a hashtable containing the data of each resource of this type */
104 GHashTable
*hash_table
;
106 typedef struct _ResourceType ResourceType
;
108 struct _ProcessList
{
110 GtkWidget
*process_list_widget
;
111 GtkTreeStore
*list_store
;
112 GtkWidget
*button
; /* one button of the tree view */
113 GtkCellRenderer
*renderer
;
115 /* A hash table by PID to speed up process position find in the list */
116 // GHashTable *process_hash;
118 guint number_of_process
;
121 /* Current process pointer, one per cpu, one per trace */
122 HashedResourceData
***current_hash_data
;
124 /* Array containing index -> pixmap correspondance. Must be updated
125 * every time the process list is reordered, process added or removed */
126 GPtrArray
* index_to_pixmap
;
128 ResourceType restypes
[RV_RESOURCE_COUNT
];
131 typedef struct _UpdateIndexPixmapArg
{
132 ProcessList
*process_list
;
134 } UpdateIndexPixmapArg
;
136 #ifndef TYPE_PROCESSLIST_DEFINED
137 #define TYPE_PROCESSLIST_DEFINED
138 typedef struct _ProcessList ProcessList
;
139 #endif //TYPE_PROCESSLIST_DEFINED
142 #ifndef TYPE_DRAWING_T_DEFINED
143 #define TYPE_DRAWING_T_DEFINED
144 typedef struct _Drawing_t Drawing_t
;
145 #endif //TYPE_DRAWING_T_DEFINED
147 ProcessList
*processlist_construct(void);
148 void processlist_destroy(ProcessList
*process_list
);
149 GtkWidget
*processlist_get_widget(ProcessList
*process_list
);
151 void processlist_clear(ProcessList
*process_list
);
153 // out : success (0) and height
154 /* CPU num is only used for PID 0 */
155 //int resourcelist_add( ProcessList *process_list, Drawing_t *drawing, guint trace_num,
156 // GQuark name, guint type, guint id, guint *height, ResourceInfo **pm_resource_info,
157 // HashedResourceData **pm_hashed_resource_data, GQuark parent);
159 // out : success (0) and height
160 int processlist_remove(ProcessList
*process_list
, guint pid
, guint cpu
,
161 LttTime
*birth
, guint trace_num
);
163 /* Set the name of a process */
164 void processlist_set_name(ProcessList
*process_list
,
166 HashedResourceData
*hashed_process_data
);
168 void processlist_set_brand(ProcessList
*process_list
,
170 HashedResourceData
*hashed_process_data
);
172 /* Set the ppid of a process */
173 void processlist_set_tgid(ProcessList
*process_list
,
175 HashedResourceData
*hashed_process_data
);
176 void processlist_set_ppid(ProcessList
*process_list
,
178 HashedResourceData
*hashed_process_data
);
181 /* Synchronize the list at the left and the drawing */
182 void update_index_to_pixmap(ProcessList
*process_list
);
184 /* Update the width of each pixmap buffer for each process */
185 void update_pixmap_size(ProcessList
*process_list
, guint width
);
188 /* Put src and/or dest to NULL to copy from/to the each PID specific pixmap */
189 void copy_pixmap_region(ProcessList
*process_list
, GdkDrawable
*dest
,
190 GdkGC
*gc
, GdkDrawable
*src
,
191 gint xsrc
, gint ysrc
,
192 gint xdest
, gint ydest
, gint width
, gint height
);
194 /* If height is -1, the height of each pixmap is used */
195 void rectangle_pixmap(ProcessList
*process_list
, GdkGC
*gc
,
196 gboolean filled
, gint x
, gint y
, gint width
, gint height
);
198 /* Renders each pixmaps into on big drawable */
199 void copy_pixmap_to_screen(ProcessList
*process_list
,
203 gint width
, gint height
);
205 static inline gint
get_cell_height(GtkTreeView
*TreeView
)
208 GtkTreeViewColumn
*column
= gtk_tree_view_get_column(TreeView
, 0);
210 gtk_tree_view_column_cell_get_size(column
, NULL
, NULL
, NULL
, NULL
, &height
);
212 gint vertical_separator
;
213 gtk_widget_style_get (GTK_WIDGET (TreeView
),
214 "vertical-separator", &vertical_separator
,
216 height
+= vertical_separator
;
221 static inline guint
processlist_get_height(ProcessList
*process_list
)
223 return process_list
->cell_height
* process_list
->number_of_process
;
227 //static inline HashedResourceData *processlist_get_process_data(
228 // ProcessList *process_list, GQuark resource_name, guint trace_num)
230 // ResourceInfo resource_info;
232 //// process_info.pid = pid;
234 //// process_info.cpu = cpu;
236 //// process_info.cpu = ANY_CPU;
237 //// process_info.birth = *birth;
238 //// process_info.trace_num = trace_num;
239 // resource_info.name = resource_name;
240 // resource_info.trace_num = trace_num;
242 // return (HashedResourceData*)g_hash_table_lookup(
243 // process_list->process_hash,
248 static inline gint
processlist_get_pixels_from_data( ProcessList
*process_list
,
249 HashedResourceData
*hashed_process_data
,
254 GtkTreePath
*tree_path
;
256 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
257 &hashed_process_data
->y_iter
);
258 path_indices
= gtk_tree_path_get_indices (tree_path
);
260 *height
= get_cell_height((GtkTreeView
*)process_list
->process_list_widget
);
261 *y
= *height
* path_indices
[0];
262 gtk_tree_path_free(tree_path
);
268 static inline guint
processlist_get_index_from_data(ProcessList
*process_list
,
269 HashedResourceData
*hashed_process_data
)
272 GtkTreePath
*tree_path
;
276 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
277 &hashed_process_data
->y_iter
);
278 path_indices
= gtk_tree_path_get_indices (tree_path
);
279 depth
= gtk_tree_path_get_depth(tree_path
);
281 // ret = path_indices[1]+path_indices[0]+1;
282 ret
= path_indices
[0];
284 ret
+= 1+path_indices
[1];
286 gtk_tree_path_free(tree_path
);
291 /* Return the hash table used to store the data of each resource of a given resource type */
293 static inline GHashTable
*resourcelist_get_resource_hash_table(ControlFlowData
*resourceview_data
, guint type
)
295 return resourceview_data
->process_list
->restypes
[type
].hash_table
;
300 #endif // _PROCESS_LIST_H