tmf: Use tabs in statistics view for each traces
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.core / src / org / eclipse / linuxtools / internal / lttng / core / latency / analyzer / EventMatcher.java
CommitLineData
fbd124dd
BH
1/*******************************************************************************\r
2 * Copyright (c) 2011 Ericsson\r
0c32e4c5 3 *\r
fbd124dd
BH
4 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse\r
5 * Public License v1.0 which accompanies this distribution, and is available at\r
6 * http://www.eclipse.org/legal/epl-v10.html\r
0c32e4c5
AM
7 *\r
8 * Contributors:\r
fbd124dd
BH
9 * Philippe Sawicki (INF4990.A2010@gmail.com) - Initial API and implementation\r
10 * Mathieu Denis (mathieu.denis55@gmail.com) - Refactored code\r
11 *******************************************************************************/\r
5945cec9 12package org.eclipse.linuxtools.internal.lttng.core.latency.analyzer;\r
fbd124dd
BH
13\r
14import java.util.Collection;\r
15import java.util.Collections;\r
16import java.util.HashMap;\r
17import java.util.Iterator;\r
18import java.util.Map.Entry;\r
19import java.util.Set;\r
20import java.util.Stack;\r
21import java.util.Vector;\r
22\r
5945cec9
FC
23import org.eclipse.linuxtools.internal.lttng.core.event.LttngEvent;\r
24import org.eclipse.linuxtools.internal.lttng.core.util.EventsPair;\r
0c32e4c5 25import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
fbd124dd
BH
26\r
27/**\r
28 * <b><u>EventMatcher</u></b>\r
29 * <p>\r
30 * Event matching class. Saves events in a list and returns the previously saved event if the currently processed one is\r
31 * its response, so that the latency can be computed by subtracting their respective timestamps.\r
0c32e4c5 32 *\r
fbd124dd
BH
33 * @author Philippe Sawicki\r
34 */\r
35public class EventMatcher {\r
36\r
37 // ------------------------------------------------------------------------\r
38 // Attributes\r
39 // ------------------------------------------------------------------------\r
0c32e4c5 40\r
fbd124dd
BH
41 /**\r
42 * Class instance (Singleton pattern).\r
43 */\r
44 private static EventMatcher fInstance = null;\r
45\r
46 /**\r
47 * Stack abstraction, used to save the events in a list.\r
48 */\r
0c32e4c5 49 private final StackWrapper fStack;\r
fbd124dd
BH
50\r
51 /**\r
52 * Match table, associates a request class to a response class.\r
53 */\r
0c32e4c5 54 private final HashMap<String, String> fMatch;\r
fbd124dd
BH
55 /**\r
56 * Inverse match table, associates a response class to a request class.\r
57 */\r
0c32e4c5 58 private final HashMap<String, String> fInverseMatch;\r
fbd124dd
BH
59\r
60 /**\r
61 * The number of events processed.\r
62 */\r
63 private int fProcessedEvents;\r
64 /**\r
65 * The number of events matched.\r
66 */\r
67 private int fMatchedEvents;\r
0c32e4c5 68\r
fbd124dd
BH
69 /**\r
70 * Event types identification Strings.\r
71 */\r
72 @SuppressWarnings("nls")\r
1cceddbe 73 public static final String\r
fbd124dd
BH
74 ADD_TO_PAGE_CACHE = "add_to_page_cache",\r
75 BIO_BACKMERGE = "bio_backmerge",\r
76 BIO_FRONTMERGE = "bio_frontmerge",\r
77 BIO_QUEUE = "bio_queue",\r
78 BUFFER_WAIT_END = "buffer_wait_end",\r
79 BUFFER_WAIT_START = "buffer_wait_start",\r
80 CALL = "call",\r
81 CLOSE = "close",\r
82 CORE_MARKER_FORMAT = "core_marker_format",\r
83 CORE_MARKER_ID = "core_marker_id",\r
84 DEV_RECEIVE = "dev_receive",\r
85 DEV_XMIT = "dev_xmit",\r
86 END_COMMIT = "end_commit",\r
87 EXEC = "exec",\r
88 FILE_DESCRIPTOR = "file_descriptor",\r
89 GETRQ = "getrq",\r
90 GETRQ_BIO = "getrq_bio",\r
91 IDT_TABLE = "idt_table",\r
92 INTERRUPT = "interrupt",\r
93 IOCTL = "ioctl",\r
94 IRQ_ENTRY = "irq_entry",\r
95 IRQ_EXIT = "irq_exit",\r
96 LIST_MODULE = "list_module",\r
97 LLSEEK = "llseek",\r
98 LSEEK = "lseek",\r
99 NAPI_COMPLETE = "napi_complete",\r
100 NAPI_POLL = "napi_poll",\r
101 NAPI_SCHEDULE = "napi_schedule",\r
102 NETWORK_IPV4_INTERFACE = "network_ipv4_interface",\r
103 NETWORK_IP_INTERFACE = "network_ip_interface",\r
104 OPEN = "open",\r
105 PAGE_FAULT_ENTRY = "page_fault_entry",\r
106 PAGE_FAULT_EXIT = "page_fault_exit",\r
107 PAGE_FAULT_GET_USER_ENTRY = "page_fault_get_user_entry",\r
108 PAGE_FAULT_GET_USER_EXIT = "page_fault_get_user_exit",\r
109 PAGE_FREE = "page_free",\r
110 PLUG = "plug",\r
111 POLLFD = "pollfd",\r
112 PREAD64 = "pread64",\r
113 PRINTF = "printf",\r
114 PRINTK = "printk",\r
115 PROCESS_EXIT = "process_exit",\r
116 PROCESS_FORK = "process_fork",\r
117 PROCESS_FREE = "process_free",\r
118 PROCESS_STATE = "process_state",\r
119 PROCESS_WAIT = "process_wait",\r
120 READ = "read",\r
121 REMAP = "remap",\r
122 REMOVE_FROM_PAGE_CACHE = "remove_from_page_cache",\r
123 RQ_COMPLETE_FS = "rq_complete_fs",\r
124 RQ_COMPLETE_PC = "rq_complete_pc",\r
125 RQ_INSERT_FS = "rq_insert_fs",\r
126 RQ_INSERT_PC = "rq_insert_pc",\r
127 RQ_ISSUE_FS = "rq_issue_fs",\r
128 RQ_ISSUE_PC = "rq_issue_pc",\r
129 RQ_REQUEUE_PC = "rq_requeue_pc",\r
130 SCHED_MIGRATE_TASK = "sched_migrate_task",\r
131 SCHED_SCHEDULE = "sched_schedule",\r
132 SCHED_TRY_WAKEUP = "sched_try_wakeup",\r
133 SCHED_WAKEUP_NEW_TASK = "sched_wakeup_new_task",\r
134 SELECT = "select",\r
135 SEM_CREATE = "sem_create",\r
136 SEND_SIGNAL = "send_signal",\r
137 SHM_CREATE = "shm_create",\r
138 SLEEPRQ_BIO = "sleeprq_bio",\r
139 SOCKET_ACCEPT = "socket_accept",\r
140 SOCKET_BIND = "socket_bind",\r
141 SOCKET_CALL = "socket_call",\r
142 SOCKET_CONNECT = "socket_connect",\r
143 SOCKET_CREATE = "socket_create",\r
144 SOCKET_GETPEERNAME = "socket_getpeername",\r
145 SOCKET_GETSOCKNAME = "socket_getsockname",\r
146 SOCKET_GETSOCKOPT = "socket_getsockopt",\r
147 SOCKET_LISTEN = "socket_listen",\r
148 SOCKET_SETSOCKOPT = "socket_setsockopt",\r
149 SOCKET_SHUTDOWN = "socket_shutdown",\r
150 SOCKET_SOCKETPAIR = "socket_socketpair",\r
151 SOFTIRQ_ENTRY = "softirq_entry",\r
152 SOFTIRQ_EXIT = "softirq_exit",\r
153 SOFTIRQ_RAISE = "softirq_raise",\r
154 SOFTIRQ_VEC = "softirq_vec",\r
155 START_COMMIT = "start_commit",\r
156 STATEDUMP_END = "statedump_end",\r
157 SYS_CALL_TABLE = "sys_call_table",\r
158 SYSCALL_ENTRY = "syscall_entry",\r
159 SYSCALL_EXIT = "syscall_exit",\r
160 TASKLET_LOW_ENTRY = "tasklet_low_entry",\r
161 TASKLET_LOW_EXIT = "tasklet_low_exit",\r
162 TCPV4_RCV = "tcpv4_rcv",\r
163 TIMER_ITIMER_EXPIRED = "timer_itimer_expired",\r
164 TIMER_ITIMER_SET = "timer_itimer_set",\r
165 TIMER_SET = "timer_set",\r
166 TIMER_TIMEOUT = "timer_timeout",\r
167 TIMER_UPDATE_TIME = "timer_update_time",\r
168 UDPV4_RCV = "udpv4_rcv",\r
169 UNPLUG_IO = "unplug_io",\r
170 UNPLUG_TIMER = "unplug_timer",\r
171 VM_MAP = "vm_map",\r
172 VPRINTK = "vprintk",\r
173 WAIT_ON_PAGE_END = "wait_on_page_end",\r
174 WAIT_ON_PAGE_START = "wait_on_page_start",\r
175 WRITE = "write",\r
176 WRITEV = "writev";\r
177\r
178 // ------------------------------------------------------------------------\r
179 // Constructor\r
180 // ------------------------------------------------------------------------\r
0c32e4c5 181\r
fbd124dd
BH
182 /**\r
183 * Private constructor to defeat instantiation (Singleton pattern).\r
184 */\r
185 private EventMatcher() {\r
186 fStack = new StackWrapper();\r
187 fMatch = new HashMap<String, String>();\r
188 fInverseMatch = new HashMap<String, String>();\r
189\r
190 fProcessedEvents = 0;\r
191 fMatchedEvents = 0;\r
192\r
193 createMatchTable();\r
194 }\r
195\r
196 // ------------------------------------------------------------------------\r
197 // Accessors\r
198 // ------------------------------------------------------------------------\r
199\r
200 /**\r
201 * Returns an instance to the EventMatcher class (Singleton pattern).\r
202 * @return An instance to the EventMatcher class (Singleton pattern).\r
203 */\r
204 public static EventMatcher getInstance() {\r
0c32e4c5 205 if (fInstance == null) {\r
fbd124dd 206 fInstance = new EventMatcher();\r
0c32e4c5 207 }\r
fbd124dd
BH
208 return fInstance;\r
209 }\r
210\r
211 /**\r
212 * Returns the number of events processed.\r
213 * @return The number of events processed.\r
214 */\r
215 public int getNBProcessedEvents() {\r
216 return fProcessedEvents;\r
217 }\r
218\r
219 /**\r
220 * Returns the number of events matched.\r
221 * @return The number of events matched.\r
222 */\r
223 public int getNBMatchedEvents() {\r
224 return fMatchedEvents;\r
225 }\r
0c32e4c5 226\r
fbd124dd
BH
227 // ------------------------------------------------------------------------\r
228 // Operations\r
229 // ------------------------------------------------------------------------\r
0c32e4c5 230\r
fbd124dd
BH
231 /**\r
232 * Releases the instance to the EventMatcher class.\r
233 */\r
234 public static void releaseInstance() {\r
235 fInstance = null;\r
236 }\r
237\r
238 /**\r
239 * Creates the event matching table, linking a response class to a request class.\r
240 */\r
241 private void createMatchTable() {\r
242 // Build the default matches\r
243 fMatch.put(PAGE_FAULT_GET_USER_EXIT, PAGE_FAULT_GET_USER_ENTRY);\r
244 fMatch.put(TASKLET_LOW_EXIT, TASKLET_LOW_ENTRY);\r
245 fMatch.put(PAGE_FAULT_EXIT, PAGE_FAULT_ENTRY);\r
246 fMatch.put(SYSCALL_EXIT, SYSCALL_ENTRY);\r
247 fMatch.put(IRQ_EXIT, IRQ_ENTRY);\r
248 fMatch.put(WRITE, READ);\r
249 fMatch.put(CLOSE, OPEN);\r
250 fMatch.put(BUFFER_WAIT_END, BUFFER_WAIT_START);\r
251 fMatch.put(END_COMMIT, START_COMMIT);\r
252 fMatch.put(WAIT_ON_PAGE_END, WAIT_ON_PAGE_START);\r
253\r
254 // Build the inverse matches based on the matches\r
255 Set<Entry<String, String>> pairs = fMatch.entrySet();\r
256 Iterator<Entry<String, String>> it = pairs.iterator();\r
257 while (it.hasNext()) {\r
258 Entry<String, String> pair = it.next();\r
259 fInverseMatch.put(pair.getValue(), pair.getKey());\r
260 }\r
261 }\r
262\r
263 /**\r
264 * Processes an event received: if it is identified as a response, try to get its request to remove it from the\r
265 * list. If no request was saved, dismiss the current response. If it is a request, save it to the list of requests\r
266 * waiting for a response.\r
267 * @param event\r
268 * The event to identify, and maybe process if it is a response.\r
269 * @return The request event associated with the current event (a response), or null if nothing was found (no\r
270 * request associated with this response, or the event to identify was a request that was added to the\r
271 * list).\r
272 */\r
0c32e4c5
AM
273 public LttngEvent process(ITmfEvent ev) {\r
274 LttngEvent event = (LttngEvent) ev;\r
fbd124dd
BH
275 fProcessedEvents++;\r
276\r
277 String markerName = event.getMarkerName();\r
278 if (fMatch.containsKey(markerName)) {\r
279 String startEventType = fMatch.get(markerName);\r
280 Stack<LttngEvent> events = fStack.getStackOf(startEventType);\r
0c32e4c5 281\r
fbd124dd
BH
282 if (events != null) {\r
283 for (int i = events.size() - 1; i >= 0; i--) {\r
284 LttngEvent request = events.get(i);\r
285\r
286 if (request.getCpuId() == event.getCpuId() && event.getTimestamp().getValue() > request.getTimestamp().getValue()) {\r
287 fStack.removeEvent(startEventType, request);\r
288 fMatchedEvents++;\r
289 return request;\r
290 }\r
291 }\r
292 }\r
293 return null;\r
294 } else {\r
295 // Add only if there can later be a match for this request\r
296 if (fMatch.containsValue(event.getMarkerName())) {\r
297 fStack.put(event.clone());\r
298 }\r
299 return null;\r
300 }\r
301 }\r
302\r
303 /**\r
304 * Clears the stack content.\r
305 */\r
306 public void clearStack() {\r
307 fStack.clear();\r
308\r
309 // Reset the processed and matched events counter\r
310 fProcessedEvents = 0;\r
311 fMatchedEvents = 0;\r
312 }\r
313\r
314 /**\r
315 * Resets all.\r
316 */\r
317 public void resetMatches() {\r
318 fMatch.clear();\r
319 fInverseMatch.clear();\r
320\r
321 fStack.clear();\r
322\r
323 // Reset the processed and matched events counter\r
324 fProcessedEvents = 0;\r
325 fMatchedEvents = 0;\r
326 }\r
327\r
328 /**\r
329 * Returns the list of start events.\r
330 * @return The list of start events.\r
331 */\r
332 public Collection<String> getStartEvents() {\r
333 return fMatch.values();\r
334 }\r
335\r
336 /**\r
337 * Returns the list of end events.\r
338 * @return The list of end events.\r
339 */\r
340 public Set<String> getEndEvents() {\r
341 return fMatch.keySet();\r
342 }\r
343\r
344 /**\r
345 * Returns the alphabetically-sorted list of start/end events pairs.\r
346 * @return The alphabetically-sorted list of start/end events pairs.\r
347 */\r
348 public EventsPair getEvents() {\r
349 Vector<String> start = new Vector<String>(getStartEvents());\r
350 Vector<String> end = new Vector<String>(fMatch.size());\r
351\r
352 Collections.sort(start);\r
353 for (int i = 0; i < start.size(); i++) {\r
354 end.add(fInverseMatch.get(start.get(i)));\r
355 }\r
356 return new EventsPair(start, end);\r
357 }\r
358\r
359 /**\r
360 * Adds a match to the list of events pairs.\r
361 * @param startType\r
362 * The start event type.\r
363 * @param endType\r
364 * The end event type.\r
365 */\r
366 public void addMatch(String startType, String endType) {\r
367 fMatch.put(endType, startType);\r
368 fInverseMatch.put(startType, endType);\r
369 }\r
370\r
371 /**\r
372 * Removes a matched pair based on the their type.\r
0c32e4c5 373 *\r
fbd124dd
BH
374 * <b>Note :</b> For now, only the pair's end type is used, since a type can only be either one start or one end.\r
375 * This function takes both types to account for the future, if a pairing process ever becomes more complex.\r
0c32e4c5 376 *\r
fbd124dd
BH
377 * @param startType\r
378 * The type of the pair's start type.\r
379 * @param endType\r
380 * The type of the pair's end type.\r
381 */\r
382 public void removeMatch(String startType, String endType) {\r
383 fMatch.remove(endType);\r
384 fInverseMatch.remove(startType);\r
385 }\r
386\r
387 /**\r
388 * Returns the list of all event possible types.\r
389 * @return The list of all event possible types.\r
390 */\r
391 public Vector<String> getTypeList() {\r
392 // Reserve some space for the 103 default event types.\r
393 Vector<String> eventsList = new Vector<String>(103);\r
394\r
395 eventsList.add(ADD_TO_PAGE_CACHE);\r
396 eventsList.add(BIO_BACKMERGE);\r
397 eventsList.add(BIO_FRONTMERGE);\r
398 eventsList.add(BIO_QUEUE);\r
399 eventsList.add(BUFFER_WAIT_END);\r
400 eventsList.add(BUFFER_WAIT_START);\r
401 eventsList.add(CALL);\r
402 eventsList.add(CLOSE);\r
403 eventsList.add(CORE_MARKER_FORMAT);\r
404 eventsList.add(CORE_MARKER_ID);\r
405 eventsList.add(DEV_RECEIVE);\r
406 eventsList.add(DEV_XMIT);\r
407 eventsList.add(END_COMMIT);\r
408 eventsList.add(EXEC);\r
409 eventsList.add(FILE_DESCRIPTOR);\r
410 eventsList.add(GETRQ);\r
411 eventsList.add(GETRQ_BIO);\r
412 eventsList.add(IDT_TABLE);\r
413 eventsList.add(INTERRUPT);\r
414 eventsList.add(IOCTL);\r
415 eventsList.add(IRQ_ENTRY);\r
416 eventsList.add(IRQ_EXIT);\r
417 eventsList.add(LIST_MODULE);\r
418 eventsList.add(LLSEEK);\r
419 eventsList.add(LSEEK);\r
420 eventsList.add(NAPI_COMPLETE);\r
421 eventsList.add(NAPI_POLL);\r
422 eventsList.add(NAPI_SCHEDULE);\r
423 eventsList.add(NETWORK_IPV4_INTERFACE);\r
424 eventsList.add(NETWORK_IP_INTERFACE);\r
425 eventsList.add(OPEN);\r
426 eventsList.add(PAGE_FAULT_ENTRY);\r
427 eventsList.add(PAGE_FAULT_EXIT);\r
428 eventsList.add(PAGE_FAULT_GET_USER_ENTRY);\r
429 eventsList.add(PAGE_FAULT_GET_USER_EXIT);\r
430 eventsList.add(PAGE_FREE);\r
431 eventsList.add(PLUG);\r
432 eventsList.add(POLLFD);\r
433 eventsList.add(PREAD64);\r
434 eventsList.add(PRINTF);\r
435 eventsList.add(PRINTK);\r
436 eventsList.add(PROCESS_EXIT);\r
437 eventsList.add(PROCESS_FORK);\r
438 eventsList.add(PROCESS_FREE);\r
439 eventsList.add(PROCESS_STATE);\r
440 eventsList.add(PROCESS_WAIT);\r
441 eventsList.add(READ);\r
442 eventsList.add(REMAP);\r
443 eventsList.add(REMOVE_FROM_PAGE_CACHE);\r
444 eventsList.add(RQ_COMPLETE_FS);\r
445 eventsList.add(RQ_COMPLETE_PC);\r
446 eventsList.add(RQ_INSERT_FS);\r
447 eventsList.add(RQ_INSERT_PC);\r
448 eventsList.add(RQ_ISSUE_FS);\r
449 eventsList.add(RQ_ISSUE_PC);\r
450 eventsList.add(RQ_REQUEUE_PC);\r
451 eventsList.add(SCHED_MIGRATE_TASK);\r
452 eventsList.add(SCHED_SCHEDULE);\r
453 eventsList.add(SCHED_TRY_WAKEUP);\r
454 eventsList.add(SCHED_WAKEUP_NEW_TASK);\r
455 eventsList.add(SELECT);\r
456 eventsList.add(SEM_CREATE);\r
457 eventsList.add(SEND_SIGNAL);\r
458 eventsList.add(SHM_CREATE);\r
459 eventsList.add(SLEEPRQ_BIO);\r
460 eventsList.add(SOCKET_ACCEPT);\r
461 eventsList.add(SOCKET_BIND);\r
462 eventsList.add(SOCKET_CALL);\r
463 eventsList.add(SOCKET_CONNECT);\r
464 eventsList.add(SOCKET_CREATE);\r
465 eventsList.add(SOCKET_GETPEERNAME);\r
466 eventsList.add(SOCKET_GETSOCKNAME);\r
467 eventsList.add(SOCKET_GETSOCKOPT);\r
468 eventsList.add(SOCKET_LISTEN);\r
469 eventsList.add(SOCKET_SETSOCKOPT);\r
470 eventsList.add(SOCKET_SHUTDOWN);\r
471 eventsList.add(SOCKET_SOCKETPAIR);\r
472 eventsList.add(SOFTIRQ_ENTRY);\r
473 eventsList.add(SOFTIRQ_EXIT);\r
474 eventsList.add(SOFTIRQ_RAISE);\r
475 eventsList.add(SOFTIRQ_VEC);\r
476 eventsList.add(START_COMMIT);\r
477 eventsList.add(STATEDUMP_END);\r
478 eventsList.add(SYS_CALL_TABLE);\r
479 eventsList.add(SYSCALL_ENTRY);\r
480 eventsList.add(SYSCALL_EXIT);\r
481 eventsList.add(TASKLET_LOW_ENTRY);\r
482 eventsList.add(TASKLET_LOW_EXIT);\r
483 eventsList.add(TCPV4_RCV);\r
484 eventsList.add(TIMER_ITIMER_EXPIRED);\r
485 eventsList.add(TIMER_ITIMER_SET);\r
486 eventsList.add(TIMER_SET);\r
487 eventsList.add(TIMER_TIMEOUT);\r
488 eventsList.add(TIMER_UPDATE_TIME);\r
489 eventsList.add(UDPV4_RCV);\r
490 eventsList.add(UNPLUG_IO);\r
491 eventsList.add(UNPLUG_TIMER);\r
492 eventsList.add(VM_MAP);\r
493 eventsList.add(VPRINTK);\r
494 eventsList.add(WAIT_ON_PAGE_END);\r
495 eventsList.add(WAIT_ON_PAGE_START);\r
496 eventsList.add(WRITE);\r
497 eventsList.add(WRITEV);\r
498\r
499 return eventsList;\r
500 }\r
501\r
502 /**\r
503 * Prints the stack content to the console.\r
504 */\r
505 public void print() {\r
506 fStack.printContent();\r
507 }\r
508}
This page took 0.052403 seconds and 5 git commands to generate.