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_BDEV 3
48 #define RV_RESOURCE_COUNT 4
50 /* Enumeration of the columns */
59 typedef struct _ResourceInfo {
67 typedef struct _ResourceUniqueNumeric
{
70 } ResourceUniqueNumeric
;
72 typedef struct _HashedResourceData
{
75 GdkPixmap
*pixmap
; // Pixmap slice containing drawing buffer for the PID
76 gint height
; // height of the pixmap
77 GtkTreeIter y_iter
; // Access quickly to y pos.
78 // DrawContext *draw_context;
79 /* Information on current drawing */
82 gboolean over_used
; /* inform the user that information is incomplete */
83 gboolean over_marked
; /* inform the user that information is incomplete */
85 gboolean middle_used
; /* inform the user that information is incomplete */
86 gboolean middle_marked
;/* inform the user that information is incomplete */
88 gboolean under_used
; /* inform the user that information is incomplete */
89 gboolean under_marked
; /* inform the user that information is incomplete */
90 } x
; /* last x position saved by after state update */
92 LttTime next_good_time
; /* precalculate the next time where the next
97 struct _ResourceType
{
98 /* functions for the hash table below */
99 guint (*hashfunc
)(gconstpointer
);
100 gboolean (*hashequalfunc
)(gconstpointer
,gconstpointer
);
101 /* a hashtable containing the data of each resource of this type */
102 GHashTable
*hash_table
;
104 typedef struct _ResourceType ResourceType
;
106 struct _ProcessList
{
108 GtkWidget
*process_list_widget
;
109 GtkTreeStore
*list_store
;
110 GtkWidget
*button
; /* one button of the tree view */
111 GtkCellRenderer
*renderer
;
113 /* A hash table by PID to speed up process position find in the list */
114 // GHashTable *process_hash;
116 guint number_of_process
;
119 /* Current process pointer, one per cpu, one per trace */
120 HashedResourceData
***current_hash_data
;
122 /* Array containing index -> pixmap correspondance. Must be updated
123 * every time the process list is reordered, process added or removed */
124 GPtrArray
* index_to_pixmap
;
126 ResourceType restypes
[RV_RESOURCE_COUNT
];
129 typedef struct _UpdateIndexPixmapArg
{
130 ProcessList
*process_list
;
132 } UpdateIndexPixmapArg
;
134 #ifndef TYPE_PROCESSLIST_DEFINED
135 #define TYPE_PROCESSLIST_DEFINED
136 typedef struct _ProcessList ProcessList
;
137 #endif //TYPE_PROCESSLIST_DEFINED
140 #ifndef TYPE_DRAWING_T_DEFINED
141 #define TYPE_DRAWING_T_DEFINED
142 typedef struct _Drawing_t Drawing_t
;
143 #endif //TYPE_DRAWING_T_DEFINED
145 ProcessList
*processlist_construct(void);
146 void processlist_destroy(ProcessList
*process_list
);
147 GtkWidget
*processlist_get_widget(ProcessList
*process_list
);
149 void processlist_clear(ProcessList
*process_list
);
151 // out : success (0) and height
152 /* CPU num is only used for PID 0 */
153 //int resourcelist_add( ProcessList *process_list, Drawing_t *drawing, guint trace_num,
154 // GQuark name, guint type, guint id, guint *height, ResourceInfo **pm_resource_info,
155 // HashedResourceData **pm_hashed_resource_data, GQuark parent);
157 // out : success (0) and height
158 int processlist_remove(ProcessList
*process_list
, guint pid
, guint cpu
,
159 LttTime
*birth
, guint trace_num
);
161 /* Set the name of a process */
162 void processlist_set_name(ProcessList
*process_list
,
164 HashedResourceData
*hashed_process_data
);
166 void processlist_set_brand(ProcessList
*process_list
,
168 HashedResourceData
*hashed_process_data
);
170 /* Set the ppid of a process */
171 void processlist_set_tgid(ProcessList
*process_list
,
173 HashedResourceData
*hashed_process_data
);
174 void processlist_set_ppid(ProcessList
*process_list
,
176 HashedResourceData
*hashed_process_data
);
179 /* Synchronize the list at the left and the drawing */
180 void update_index_to_pixmap(ProcessList
*process_list
);
182 /* Update the width of each pixmap buffer for each process */
183 void update_pixmap_size(ProcessList
*process_list
, guint width
);
186 /* Put src and/or dest to NULL to copy from/to the each PID specific pixmap */
187 void copy_pixmap_region(ProcessList
*process_list
, GdkDrawable
*dest
,
188 GdkGC
*gc
, GdkDrawable
*src
,
189 gint xsrc
, gint ysrc
,
190 gint xdest
, gint ydest
, gint width
, gint height
);
192 /* If height is -1, the height of each pixmap is used */
193 void rectangle_pixmap(ProcessList
*process_list
, GdkGC
*gc
,
194 gboolean filled
, gint x
, gint y
, gint width
, gint height
);
196 /* Renders each pixmaps into on big drawable */
197 void copy_pixmap_to_screen(ProcessList
*process_list
,
201 gint width
, gint height
);
203 static inline gint
get_cell_height(GtkTreeView
*TreeView
)
206 GtkTreeViewColumn
*column
= gtk_tree_view_get_column(TreeView
, 0);
208 gtk_tree_view_column_cell_get_size(column
, NULL
, NULL
, NULL
, NULL
, &height
);
210 gint vertical_separator
;
211 gtk_widget_style_get (GTK_WIDGET (TreeView
),
212 "vertical-separator", &vertical_separator
,
214 height
+= vertical_separator
;
219 static inline guint
processlist_get_height(ProcessList
*process_list
)
221 return process_list
->cell_height
* process_list
->number_of_process
;
225 //static inline HashedResourceData *processlist_get_process_data(
226 // ProcessList *process_list, GQuark resource_name, guint trace_num)
228 // ResourceInfo resource_info;
230 //// process_info.pid = pid;
232 //// process_info.cpu = cpu;
234 //// process_info.cpu = ANY_CPU;
235 //// process_info.birth = *birth;
236 //// process_info.trace_num = trace_num;
237 // resource_info.name = resource_name;
238 // resource_info.trace_num = trace_num;
240 // return (HashedResourceData*)g_hash_table_lookup(
241 // process_list->process_hash,
246 static inline gint
processlist_get_pixels_from_data( ProcessList
*process_list
,
247 HashedResourceData
*hashed_process_data
,
252 GtkTreePath
*tree_path
;
254 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
255 &hashed_process_data
->y_iter
);
256 path_indices
= gtk_tree_path_get_indices (tree_path
);
258 *height
= get_cell_height((GtkTreeView
*)process_list
->process_list_widget
);
259 *y
= *height
* path_indices
[0];
260 gtk_tree_path_free(tree_path
);
266 static inline guint
processlist_get_index_from_data(ProcessList
*process_list
,
267 HashedResourceData
*hashed_process_data
)
270 GtkTreePath
*tree_path
;
274 tree_path
= gtk_tree_model_get_path((GtkTreeModel
*)process_list
->list_store
,
275 &hashed_process_data
->y_iter
);
276 path_indices
= gtk_tree_path_get_indices (tree_path
);
277 depth
= gtk_tree_path_get_depth(tree_path
);
279 // ret = path_indices[1]+path_indices[0]+1;
280 ret
= path_indices
[0];
282 ret
+= 1+path_indices
[1];
284 gtk_tree_path_free(tree_path
);
289 /* Return the hash table used to store the data of each resource of a given resource type */
291 static inline GHashTable
*resourcelist_get_resource_hash_table(ControlFlowData
*resourceview_data
, guint type
)
293 return resourceview_data
->process_list
->restypes
[type
].hash_table
;
298 #endif // _PROCESS_LIST_H