Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'lttng/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/handlers/before/StateBeforeUpdateHandlers.java')
-rw-r--r--lttng/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/handlers/before/StateBeforeUpdateHandlers.java1580
1 files changed, 1580 insertions, 0 deletions
diff --git a/lttng/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/handlers/before/StateBeforeUpdateHandlers.java b/lttng/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/handlers/before/StateBeforeUpdateHandlers.java
new file mode 100644
index 0000000000..fb7b7ef300
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/handlers/before/StateBeforeUpdateHandlers.java
@@ -0,0 +1,1580 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.linuxtools.lttng.tests.state.handlers.before;
+
+import org.eclipse.linuxtools.lttng.TraceDebug;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
+import org.eclipse.linuxtools.lttng.state.StateStrings.ExecutionMode;
+import org.eclipse.linuxtools.lttng.state.StateStrings.ExecutionSubMode;
+import org.eclipse.linuxtools.lttng.state.StateStrings.Fields;
+import org.eclipse.linuxtools.lttng.state.evProcessor.ILttngEventProcessor;
+import org.eclipse.linuxtools.lttng.state.model.LttngExecutionState;
+import org.eclipse.linuxtools.lttng.state.model.LttngProcessState;
+import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
+import org.eclipse.linuxtools.lttng.tests.state.handlers.AbsStateUpdate;
+
+/**
+ * Process the system call entry event
+ *
+ * @author alvaro
+ *
+ */
+class StateBeforeUpdateHandlers {
+
+ final ILttngEventProcessor getSyscallEntryHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // TraceDebug.debug("Before event called");
+ //
+ Long cpu = trcEvent.getCpuId();
+
+ // No syscall_entry update for initialization process
+ LttngProcessState process = traceSt.getRunning_process().get(
+ cpu);
+
+ pid = process.getPid();
+ if (pid == 0L) {
+ return true;
+ }
+
+ // Get the expected event field
+ Long syscall = getAFieldLong(trcEvent, traceSt,
+ Fields.LTT_FIELD_SYSCALL_ID);
+ if (syscall == null) {
+ TraceDebug.debug("Syscall Field not found in Event: "
+ + trcEvent.getMarkerName());
+ return true;
+ }
+
+ String submode = traceSt.getSyscall_names().get(syscall);
+
+ if (submode == null) {
+ TraceDebug.debug("Submode not found in Event");
+ submode = ExecutionSubMode.LTTV_STATE_SUBMODE_UNKNOWN
+ .getInName();
+ }
+
+ exState = new LttngExecutionState();
+ exState.setExec_mode(ExecutionMode.LTTV_STATE_SYSCALL);
+ exState.setExec_submode(submode);
+ exState.setEntry_Time(trcEvent.getTimestamp().getValue());
+ exState.setChange_Time(trcEvent.getTimestamp().getValue());
+ exState.setCum_cpu_time(0L);
+
+ return false;
+ }
+ };
+ return handler;
+ }
+
+ final ILttngEventProcessor getsySyscallExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+
+ Long cpu = trcEvent.getCpuId();
+ LttngProcessState process = traceSt.getRunning_process().get(
+ cpu);
+
+ /* There can be no system call from PID 0 : unknown state */
+ pid = process.getPid();
+ if (pid == 0L) {
+ return true;
+ }
+
+ // pop_state(cpu, StateStrings.ExecutionMode.LTTV_STATE_SYSCALL,
+ // traceSt, trcEvent.getTimestamp());
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * Update stacks related to the parsing of an LttngEvent
+ *
+ * @return
+ */
+ final ILttngEventProcessor getTrapEntryHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // Long cpu = trcEvent.getCpuId();
+ //
+ // Long trap = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_TRAP_ID);
+ // if (trap == null) {
+ // return true;
+ // }
+ //
+ // String submode = traceSt.getSyscall_names()
+ // .get(trap);
+ //
+ // if (submode == null) {
+ // submode = ExecutionSubMode.LTTV_STATE_SUBMODE_UNKNOWN
+ // .getInName();
+ // }
+ //
+ // /* update process state */
+ // push_state(cpu, StateStrings.ExecutionMode.LTTV_STATE_TRAP,
+ // submode, trcEvent.getTimestamp(), traceSt);
+ //
+ // /* update cpu status */
+ // LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
+ // cpu_push_mode(cpust, StateStrings.CpuMode.LTTV_CPU_TRAP);
+ // cpust.setLast_trap(trap); /* update trap status */
+ //
+ // // update Trap State
+ // LttngTrapState trap_state = traceSt.getTrap_states().get(
+ // trap);
+ // trap_state.incrementRunning();
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getTrapExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ // LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
+ // Long trap = cpust.getLast_trap();
+ //
+ // pop_state(cpu, ExecutionMode.LTTV_STATE_TRAP, traceSt,
+ // trcEvent
+ // .getTimestamp());
+ //
+ // /* update cpu status */
+ // cpu_pop_mode(cpust);
+ //
+ // /* update trap status */
+ // if (trap != -1L) {
+ // traceSt.getTrap_states().get(trap).decrementRunning();
+ // }
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getIrqEntryHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ //
+ // Long irq = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_IRQ_ID);
+ // if (irq == null) {
+ // return true;
+ // }
+ //
+ // String submode;
+ // submode = traceSt.getIrq_names().get(irq);
+ //
+ // if (submode == null) {
+ // submode =
+ // ExecutionSubMode.LTTV_STATE_SUBMODE_UNKNOWN.getInName();
+ // }
+ //
+ // /*
+ // * Do something with the info about being in user or system
+ // mode
+ // * when int?
+ // */
+ // push_state(cpu, ExecutionMode.LTTV_STATE_IRQ, submode,
+ // trcEvent
+ // .getTimestamp(), traceSt);
+ //
+ // /* update cpu state */
+ // LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
+ // cpu_push_mode(cpust, CpuMode.LTTV_CPU_IRQ); /* mode stack */
+ // cpust.setLast_irq(irq); /* last irq */
+ //
+ // /* udpate irq state */
+ // irq_push_mode(traceSt.getIrq_states().get(irq),
+ // IRQMode.LTTV_IRQ_BUSY);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getSoftIrqExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ // LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
+ // Long softirq = cpust.getLast_soft_irq();
+ // pop_state(cpu, ExecutionMode.LTTV_STATE_SOFT_IRQ, traceSt,
+ // trcEvent.getTimestamp());
+ //
+ // /* update softirq status */
+ // if (softirq != -1) {
+ // LttngSoftIRQState softIrqstate = traceSt
+ // .getSoft_irq_states().get(softirq);
+ // softIrqstate.decrementRunning();
+ // }
+ //
+ // /* update cpu status */
+ // cpu_pop_mode(cpust);
+
+ return false;
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getIrqExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ //
+ // /* update process state */
+ // pop_state(cpu, ExecutionMode.LTTV_STATE_IRQ, traceSt,
+ // trcEvent
+ // .getTimestamp());
+ //
+ // /* update cpu status */
+ // LTTngCPUState cpust = traceSt.getCpu_states().get(cpu);
+ // cpu_pop_mode(cpust);
+ //
+ // /* update irq status */
+ // Long last_irq = cpust.getLast_irq();
+ // if (last_irq != -1L) {
+ // LttngIRQState irq_state = traceSt.getIrq_states().get(
+ // last_irq);
+ // irq_pop_mode(irq_state);
+ // }
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getSoftIrqRaiseHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // // Long cpu = trcEvent.getCpuId();
+ //
+ // // get event field
+ // Long softirq = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_SOFT_IRQ_ID);
+ //
+ // if (softirq == null) {
+ // return true;
+ // }
+ //
+ // // String submode;
+ // // String[] softIrqNames = traceSt.getSoft_irq_names();
+ // // if (softirq < softIrqNames.length) {
+ // // submode = softIrqNames[softirq];
+ // // } else {
+ // // submode = "softirq " + softirq;
+ // // }
+ //
+ // /* update softirq status */
+ // /* a soft irq raises are not cumulative */
+ // LttngSoftIRQState irqState =
+ // traceSt.getSoft_irq_states().get(
+ // softirq);
+ // if (irqState != null) {
+ // irqState.setPending(1L);
+ // } else {
+ // TraceDebug
+ // .debug("unexpected soft irq id value: " + softirq);
+ // }
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getSoftIrqEntryHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // // obtrain cpu
+ // Long cpu = trcEvent.getCpuId();
+ //
+ // // get event field
+ // Long softirq = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_SOFT_IRQ_ID);
+ //
+ // if (softirq == null) {
+ // return true;
+ // }
+ //
+ // // obtain submode
+ // Map<Long, String> softIrqNames = traceSt.getSoft_irq_names();
+ // String submode = softIrqNames.get(softirq);
+ // if (submode == null) {
+ // submode = "softirq " + softirq;
+ // softIrqNames.put(softirq, submode);
+ // }
+ //
+ // /* update softirq status */
+ // LttngSoftIRQState irqState =
+ // traceSt.getSoft_irq_states().get(
+ // softirq);
+ // if (irqState != null) {
+ // irqState.decrementPending();
+ // irqState.incrementRunning();
+ // } else {
+ // TraceDebug
+ // .debug("unexpected soft irq id value: " + softirq);
+ // }
+ //
+ // /* update cpu state */
+ // LTTngCPUState cpu_state = traceSt.getCpu_states().get(cpu);
+ // cpu_state.setLast_soft_irq(softirq);
+ // cpu_push_mode(cpu_state, CpuMode.LTTV_CPU_SOFT_IRQ);
+ //
+ // /* update process execution mode state stack */
+ // push_state(cpu, ExecutionMode.LTTV_STATE_SOFT_IRQ, submode,
+ // trcEvent.getTimestamp(), traceSt);
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * Method to handle the event: LTT_EVENT_LIST_INTERRRUPT
+ *
+ * @return
+ */
+ final ILttngEventProcessor getEnumInterruptHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // String action = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_ACTION);
+ // Long irq = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_IRQ_ID);
+ //
+ // Map<Long, String> irq_names = traceSt.getIrq_names();
+ //
+ // irq_names.put(irq, action);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * Handle the event LTT_EVENT_REQUEST_ISSUE
+ *
+ * @return
+ */
+ final ILttngEventProcessor getBdevRequestIssueHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // // Get Fields
+ // Long major = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_MAJOR);
+ // Long minor = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_MINOR);
+ // Long operation = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_OPERATION);
+ //
+ // // calculate bdevcode
+ // Long devcode = mkdev(major, minor);
+ //
+ // if (devcode == null) {
+ // TraceDebug
+ // .debug("incorrect calcualtion of bdevcode input( major: "
+ // + major
+ // + " minor: "
+ // + minor
+ // + " operation: " + operation);
+ // return true;
+ // }
+ //
+ // Map<Long, LttngBdevState> bdev_states = traceSt
+ // .getBdev_states();
+ // // Get the instance
+ // LttngBdevState bdevState = bdev_states.get(devcode);
+ // if (bdevState == null) {
+ // bdevState = new LttngBdevState();
+ // }
+ //
+ // // update the mode in the stack
+ // if (operation == 0L) {
+ // bdevState.getMode_stack().push(
+ // BdevMode.LTTV_BDEV_BUSY_READING);
+ // } else {
+ // bdevState.getMode_stack().push(
+ // BdevMode.LTTV_BDEV_BUSY_WRITING);
+ // }
+ //
+ // // make sure it is included in the set
+ // bdev_states.put(devcode, bdevState);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handling event: LTT_EVENT_REQUEST_COMPLETE
+ * </p>
+ * <p>
+ * FIELDS(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getBdevRequestCompleteHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // // Get Fields
+ // Long major = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_MAJOR);
+ // Long minor = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_MINOR);
+ // Long operation = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_OPERATION);
+ //
+ // // calculate bdevcode
+ // Long devcode = mkdev(major, minor);
+ //
+ // if (devcode == null) {
+ // TraceDebug
+ // .debug("incorrect calcualtion of bdevcode input( major: "
+ // + major
+ // + " minor: "
+ // + minor
+ // + " operation: " + operation);
+ // return true;
+ // }
+ //
+ // Map<Long, LttngBdevState> bdev_states = traceSt
+ // .getBdev_states();
+ // // Get the instance
+ // LttngBdevState bdevState = bdev_states.get(devcode);
+ // if (bdevState == null) {
+ // bdevState = new LttngBdevState();
+ // }
+ //
+ // /* update block device */
+ // bdev_pop_mode(bdevState);
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles event: LTT_EVENT_FUNCTION_ENTRY
+ * </p>
+ * <p>
+ * FIELDS: LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getFunctionEntryHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // Long cpu = trcEvent.getCpuId();
+ // Long funcptr = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_THIS_FN);
+ //
+ // push_function(traceSt, funcptr, cpu);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ final ILttngEventProcessor getFunctionExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long funcptr = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_THIS_FN);
+ //
+ // pop_function(traceSt, trcEvent, funcptr);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * process event: LTT_EVENT_SYS_CALL_TABLE
+ * </p>
+ * <p>
+ * fields: LTT_FIELD_ID, LTT_FIELD_ADDRESS, LTT_FIELD_SYMBOL
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getDumpSyscallHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // // obtain the syscall id
+ // Long id = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_ID);
+ //
+ // // Long address = getAFieldLong(trcEvent, traceSt,
+ // // Fields.LTT_FIELD_ADDRESS);
+ //
+ // // Obtain the symbol
+ // String symbol = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_SYMBOL);
+ //
+ // // fill the symbol to the sycall_names collection
+ // traceSt.getSyscall_names().put(id, symbol);
+
+ return false;
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles event: LTT_EVENT_KPROBE_TABLE
+ * </p>
+ * <p>
+ * Fields: LTT_FIELD_IP, LTT_FIELD_SYMBOL
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getDumpKprobeHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long ip = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_IP);
+ // String symbol = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_SYMBOL);
+ //
+ // traceSt.getKprobe_table().put(ip, symbol);
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_SOFTIRQ_VEC
+ * </p>
+ * <p>
+ * Fields: LTT_FIELD_ID, LTT_FIELD_ADDRESS, LTT_FIELD_SYMBOL
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getDumpSoftIrqHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // // Get id
+ // Long id = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_ID);
+ //
+ // // Address not needed
+ // // Long address = ltt_event_get_long_unsigned(e,
+ // // lttv_trace_get_hook_field(th,
+ // // 1));
+ //
+ // // Get symbol
+ // String symbol = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_SYMBOL);
+ //
+ // // Register the soft irq name
+ // traceSt.getSoft_irq_names().put(id, symbol);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_SCHED_SCHEDULE
+ * </p>
+ * <p>
+ * Fields: LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV_STATE
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getSchedChangeHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ // TmfTimestamp eventTime = trcEvent.getTimestamp();
+ //
+ // LttngProcessState process = traceSt.getRunning_process().get(
+ // cpu);
+ //
+ // Long pid_out = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_PREV_PID);
+ // Long pid_in = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_NEXT_PID);
+ // Long state_out = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_PREV_STATE);
+ //
+ // if (process != null) {
+ //
+ // /*
+ // * We could not know but it was not the idle process
+ // * executing. This should only happen at the beginning,
+ // * before the first schedule event, and when the initial
+ // * information (current process for each CPU) is missing. It
+ // * is not obvious how we could, after the fact, compensate
+ // * the wrongly attributed statistics.
+ // */
+ //
+ // // This test only makes sense once the state is known and if
+ // // there
+ // // is no
+ // // missing events. We need to silently ignore schedchange
+ // // coming
+ // // after a
+ // // process_free, or it causes glitches. (FIXME)
+ // // if(unlikely(process->pid != pid_out)) {
+ // // g_assert(process->pid == 0);
+ // // }
+ // if (process.getPid() == 0
+ // && process.getState().getExec_mode() ==
+ // ExecutionMode.LTTV_STATE_MODE_UNKNOWN) {
+ // if (pid_out == 0) {
+ // /*
+ // * Scheduling out of pid 0 at beginning of the trace
+ // * : we know for sure it is in syscall mode at this
+ // * point.
+ // */
+ // int stackSize = process.getExecution_stack().size();
+ // if (stackSize != 1) {
+ // TraceDebug
+ // .debug("unpexpected process execution stack size, expected 1, received: ");
+ // }
+ //
+ // process.getState().setExec_mode(
+ // ExecutionMode.LTTV_STATE_SYSCALL);
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_WAIT);
+ // process.getState().setChage_Time(
+ // trcEvent.getTimestamp());
+ // process.getState().setEntry_Time(
+ // trcEvent.getTimestamp());
+ // }
+ // } else {
+ // if (process.getState().getProc_status() ==
+ // ProcessStatus.LTTV_STATE_EXIT) {
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_ZOMBIE);
+ // process.getState().setChage_Time(
+ // trcEvent.getTimestamp());
+ // } else {
+ // if (state_out == 0L) {
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_WAIT_CPU);
+ // } else {
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_WAIT);
+ // }
+ //
+ // process.getState().setChage_Time(
+ // trcEvent.getTimestamp());
+ // }
+ //
+ // if (state_out == 32L || state_out == 64L) { /*
+ // * EXIT_DEAD
+ // * ||
+ // * TASK_DEAD
+ // */
+ // /* see sched.h for states */
+ // if (!exit_process(traceSt, process)) {
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_DEAD);
+ // process.getState().setChage_Time(
+ // trcEvent.getTimestamp());
+ // }
+ // }
+ // }
+ // }
+ // process = lttv_state_find_process_or_create(traceSt, cpu,
+ // pid_in, eventTime);
+ //
+ // traceSt.getRunning_process().put(cpu, process);
+ //
+ // process.getState().setProc_status(ProcessStatus.LTTV_STATE_RUN);
+ // process.getState().setChage_Time(eventTime);
+ // process.setCpu(cpu);
+ // // process->state->s = LTTV_STATE_RUN;
+ // // if(process->usertrace)
+ // // process->usertrace->cpu = cpu;
+ // // process->last_cpu_index =
+ // // ltt_tracefile_num(((LttvTracefileContext*)s)->tf);
+ //
+ // // process->state->change = s->parent.timestamp;
+ //
+ // LTTngCPUState cpu_state = traceSt.getCpu_states().get(cpu);
+ // /* update cpu status */
+ // if (pid_in == 0) {
+ //
+ // /* going to idle task */
+ // cpu_set_base_mode(cpu_state, CpuMode.LTTV_CPU_IDLE);
+ // } else {
+ // /*
+ // * scheduling a real task. we must be careful here: if we
+ // * just schedule()'ed to a process that is in a trap, we
+ // * must put the cpu in trap mode
+ // */
+ // cpu_set_base_mode(cpu_state, CpuMode.LTTV_CPU_BUSY);
+ // if (process.getState().getExec_mode() ==
+ // ExecutionMode.LTTV_STATE_TRAP) {
+ // cpu_push_mode(cpu_state, CpuMode.LTTV_CPU_TRAP);
+ // }
+ // }
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_PROCESS_FORK
+ * </p>
+ * <p>
+ * Fields: FIELD_ARRAY(LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID,
+ * LTT_FIELD_CHILD_TGID)
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getProcessForkHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ // LttngProcessState process = traceSt.getRunning_process().get(
+ // cpu);
+ // TmfTimestamp timeStamp = trcEvent.getTimestamp();
+ //
+ // // /* Parent PID */
+ // // Long parent_pid = getAFieldLong(trcEvent, traceSt,
+ // // Fields.LTT_FIELD_PARENT_PID);
+ //
+ // /* Child PID */
+ // /* In the Linux Kernel, there is one PID per thread. */
+ // Long child_pid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_CHILD_PID);
+ //
+ // /* Child TGID */
+ // /* tgid in the Linux kernel is the "real" POSIX PID. */
+ // Long child_tgid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_CHILD_TGID);
+ // if (child_tgid == null) {
+ // child_tgid = 0L;
+ // }
+ //
+ // /*
+ // * Mathieu : it seems like the process might have been
+ // scheduled
+ // * in before the fork, and, in a rare case, might be the
+ // current
+ // * process. This might happen in a SMP case where we don't
+ // have
+ // * enough precision on the clocks.
+ // *
+ // * Test reenabled after precision fixes on time. (Mathieu)
+ // */
+ // // #if 0
+ // // zombie_process = lttv_state_find_process(ts, ANY_CPU,
+ // // child_pid);
+ // //
+ // // if(unlikely(zombie_process != NULL)) {
+ // // /* Reutilisation of PID. Only now we are sure that the old
+ // // PID
+ // // * has been released. FIXME : should know when release_task
+ // // happens
+ // // instead.
+ // // */
+ // // guint num_cpus = ltt_trace_get_num_cpu(ts->parent.t);
+ // // guint i;
+ // // for(i=0; i< num_cpus; i++) {
+ // // g_assert(zombie_process != ts->running_process[i]);
+ // // }
+ // //
+ // // exit_process(s, zombie_process);
+ // // }
+ // // #endif //0
+ //
+ // if (process.getPid() == child_pid) {
+ // TraceDebug
+ // .debug("Unexpected, process pid equal to child pid: "
+ // + child_pid
+ // + " Event Time: "
+ // + trcEvent.getTimestamp());
+ // }
+ //
+ // // g_assert(process->pid != child_pid);
+ // // FIXME : Add this test in the "known state" section
+ // // g_assert(process->pid == parent_pid);
+ // LttngProcessState child_process = lttv_state_find_process(
+ // traceSt, ANY_CPU, child_pid);
+ // if (child_process == null) {
+ // child_process = create_process(traceSt, cpu, child_pid,
+ // child_tgid, timeStamp);
+ // } else {
+ // /*
+ // * The process has already been created : due to time
+ // * imprecision between multiple CPUs : it has been scheduled
+ // * in before creation. Note that we shouldn't have this kind
+ // * of imprecision.
+ // *
+ // * Simply put a correct parent.
+ // */
+ // StringBuilder sb = new StringBuilder("Process " + child_pid);
+ // sb.append(" has been created at ["
+ // + child_process.getCration_time() + "] ");
+ // sb.append("and inserted at ["
+ // + child_process.getInsertion_time() + "] ");
+ // sb.append("before \nfork on cpu " + cpu + " Event time: ["
+ // + trcEvent + "]\n.");
+ // sb
+ // .append("Probably an unsynchronized TSD problem on the traced machine.");
+ // TraceDebug.debug(sb.toString());
+ //
+ // // g_assert(0); /* This is a problematic case : the process
+ // // has
+ // // beencreated
+ // // before the fork event */
+ // child_process.setPpid(process.getPid());
+ // child_process.setTgid(child_tgid);
+ // }
+ //
+ // if (!child_process.getName().equals(
+ // ProcessStatus.LTTV_STATE_UNNAMED.getInName())) {
+ // TraceDebug.debug("Unexpected child process status: "
+ // + child_process.getName());
+ // }
+ //
+ // child_process.setName(process.getName());
+ // child_process.setBrand(process.getBrand());
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_KTHREAD_CREATE
+ * </p>
+ * <p>
+ * Fields: LTT_FIELD_PID
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getProcessKernelThreadHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ // /*
+ // * We stamp a newly created process as kernel_thread. The
+ // thread
+ // * should not be running yet.
+ // */
+ //
+ // LttngExecutionState exState;
+ // Long pid;
+ // LttngProcessState process;
+ //
+ // /* PID */
+ // pid = getAFieldLong(trcEvent, traceSt, Fields.LTT_FIELD_PID);
+ // // s->parent.target_pid = pid;
+ //
+ // process = lttv_state_find_process_or_create(traceSt, ANY_CPU,
+ // pid, new TmfTimestamp());
+ //
+ // if (!process.getState().getProc_status().equals(
+ // ProcessStatus.LTTV_STATE_DEAD)) {
+ // // Leave only the first element in the stack with execution
+ // // mode to
+ // // syscall
+ // Stack<LttngExecutionState> processExStack = process
+ // .getExecution_stack();
+ // exState = processExStack.firstElement();
+ // exState.setExec_mode(ExecutionMode.LTTV_STATE_SYSCALL);
+ // if (processExStack.size() > 1) {
+ // processExStack.clear();
+ // processExStack.add(exState);
+ // }
+ //
+ // // update the process state to the only one in the stack
+ // process.setState(exState);
+ // }
+ //
+ // process.setType(ProcessType.LTTV_STATE_KERNEL_THREAD);
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_PROCESS_EXIT
+ * </p>
+ * <p>
+ * LTT_FIELD_PID
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getProcessExitHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long pid;
+ // LttngProcessState process;
+ //
+ // pid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_PID);
+ // // s->parent.target_pid = pid;
+ //
+ // // FIXME : Add this test in the "known state" section
+ // // g_assert(process->pid == pid);
+ //
+ // process = lttv_state_find_process(traceSt, ANY_CPU, pid);
+ // if (process != null) {
+ // process.getState().setProc_status(
+ // ProcessStatus.LTTV_STATE_EXIT);
+ // }
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_PROCESS_FREE
+ * </p>
+ * <p>
+ * Fields: LTT_FIELD_PID
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getProcessFreeHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long release_pid;
+ // LttngProcessState process;
+ //
+ // /* PID of the process to release */
+ // release_pid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_PID);
+ // // s->parent.target_pid = release_pid;
+ //
+ // if (release_pid == 0) {
+ // TraceDebug.debug("Unexpected release_pid: 0, Event time: "
+ // + trcEvent.getTimestamp());
+ // }
+ //
+ // process = lttv_state_find_process(traceSt, ANY_CPU,
+ // release_pid);
+ // if (process != null) {
+ // exit_process(traceSt, process);
+ // }
+
+ return false;
+ // DISABLED
+ // if(process != null) {
+ /*
+ * release_task is happening at kernel level : we can now safely
+ * release the data structure of the process
+ */
+ // This test is fun, though, as it may happen that
+ // at time t : CPU 0 : process_free
+ // at time t+150ns : CPU 1 : schedule out
+ // Clearly due to time imprecision, we disable it. (Mathieu)
+ // If this weird case happen, we have no choice but to put the
+ // Currently running process on the cpu to 0.
+ // I re-enable it following time precision fixes. (Mathieu)
+ // Well, in the case where an process is freed by a process on
+ // another
+ // CPU
+ // and still scheduled, it happens that this is the schedchange
+ // that
+ // will
+ // drop the last reference count. Do not free it here!
+
+ // int num_cpus = ltt_trace_get_num_cpu(ts->parent.t);
+ // guint i;
+ // for(i=0; i< num_cpus; i++) {
+ // //g_assert(process != ts->running_process[i]);
+ // if(process == ts->running_process[i]) {
+ // //ts->running_process[i] = lttv_state_find_process(ts, i, 0);
+ // break;
+ // }
+ // }
+ // if(i == num_cpus) /* process is not scheduled */
+ // exit_process(s, process);
+ // }
+ //
+ // return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_EXEC
+ * </p>
+ * <p>
+ * FIELDS: LTT_FIELD_FILENAME
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getProcessExecHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long cpu = trcEvent.getCpuId();
+ // LttngProcessState process = traceSt.getRunning_process().get(
+ // cpu);
+ //
+ // // #if 0//how to use a sequence that must be transformed in a
+ // // string
+ // // /* PID of the process to release */
+ // // guint64 name_len = ltt_event_field_element_number(e,
+ // // lttv_trace_get_hook_field(th, 0));
+ // // //name = ltt_event_get_string(e,
+ // // lttv_trace_get_hook_field(th, 0));
+ // // LttField *child = ltt_event_field_element_select(e,
+ // // lttv_trace_get_hook_field(th, 0), 0);
+ // // gchar *name_begin =
+ // // (gchar*)(ltt_event_data(e)+ltt_event_field_offset(e,
+ // child));
+ // // gchar *null_term_name = g_new(gchar, name_len+1);
+ // // memcpy(null_term_name, name_begin, name_len);
+ // // null_term_name[name_len] = '\0';
+ // // process->name = g_quark_from_string(null_term_name);
+ // // #endif //0
+ //
+ // process.setName(getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_FILENAME));
+ // process.setBrand(StateStrings.LTTV_STATE_UNBRANDED);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * <p>
+ * LTT_EVENT_THREAD_BRAND
+ * </p>
+ * <p>
+ * FIELDS: LTT_FIELD_NAME
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor GetThreadBrandHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // String name;
+ // Long cpu = trcEvent.getCpuId();
+ // LttngProcessState process = traceSt.getRunning_process().get(
+ // cpu);
+ //
+ // name = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_NAME);
+ // process.setBrand(name);
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * @return
+ */
+ final ILttngEventProcessor getStateDumpEndHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // /* For all processes */
+ // /*
+ // * if kernel thread, if stack[0] is unknown, set to syscall
+ // * mode, wait
+ // */
+ // /* else, if stack[0] is unknown, set to user mode, running */
+ // List<LttngProcessState> processes = traceSt.getProcesses();
+ // TmfTimestamp time = trcEvent.getTimestamp();
+ //
+ // for (LttngProcessState process : processes) {
+ // fix_process(process, time);
+ // }
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+ /**
+ * Private method used to establish the first execution state in the stack
+ * for a given process
+ *
+ * @param process
+ * @param timestamp
+ */
+ // private void fix_process(LttngProcessState process,
+ // TmfTimestamp timestamp) {
+ //
+ // LttngExecutionState es;
+ // Stack<LttngExecutionState> procStack = process
+ // .getExecution_stack();
+ //
+ // if (process.getType() == ProcessType.LTTV_STATE_KERNEL_THREAD) {
+ // es = procStack.firstElement();
+ //
+ // if (es.getExec_mode() == ExecutionMode.LTTV_STATE_MODE_UNKNOWN) {
+ // es.setExec_mode(ExecutionMode.LTTV_STATE_SYSCALL);
+ // es
+ // .setExec_submode(ExecutionSubMode.LTTV_STATE_SUBMODE_NONE
+ // .getInName());
+ // es.setEntry_Time(timestamp);
+ // es.setChage_Time(timestamp);
+ // es.setCum_cpu_time(0L);
+ // if (es.getProc_status() == ProcessStatus.LTTV_STATE_UNNAMED) {
+ // es.setProc_status(ProcessStatus.LTTV_STATE_WAIT);
+ // }
+ // }
+ // } else {
+ // es = procStack.firstElement();
+ // if (es.getExec_mode() == ExecutionMode.LTTV_STATE_MODE_UNKNOWN) {
+ // es.setExec_mode(ExecutionMode.LTTV_STATE_USER_MODE);
+ // es
+ // .setExec_submode(ExecutionSubMode.LTTV_STATE_SUBMODE_NONE
+ // .getInName());
+ // es.setEntry_Time(timestamp);
+ // es.setChage_Time(timestamp);
+ // es.setCum_cpu_time(0L);
+ // if (es.getProc_status() == ProcessStatus.LTTV_STATE_UNNAMED) {
+ // es.setProc_status(ProcessStatus.LTTV_STATE_RUN);
+ // }
+ //
+ // if (procStack.size() == 1) {
+ // /*
+ // * Still in bottom unknown mode, means never did a
+ // * system call May be either in user mode, syscall
+ // * mode, running or waiting.
+ // */
+ // /*
+ // * FIXME : we may be tagging syscall mode when being
+ // * user mode
+ // */
+ // // Get a new execution State
+ // es = new LttngExecutionState();
+ //
+ // // initialize values
+ // es.setExec_mode(ExecutionMode.LTTV_STATE_SYSCALL);
+ // es
+ // .setExec_submode(ExecutionSubMode.LTTV_STATE_SUBMODE_NONE
+ // .getInName());
+ // es.setEntry_Time(timestamp);
+ // es.setChage_Time(timestamp);
+ // es.setCum_cpu_time(0L);
+ // es.setProc_status(ProcessStatus.LTTV_STATE_UNNAMED);
+ //
+ // // Push the new state to the stack
+ // procStack.push(es);
+ // }
+ // }
+ // }
+ // }
+ // };
+ // return handler;
+ // }
+
+ /**
+ * <p>
+ * Handles: LTT_EVENT_PROCESS_STATE
+ * </p>
+ * <p>
+ * FIELDS: LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME,
+ * LTT_FIELD_TYPE, LTT_FIELD_MODE, LTT_FIELD_SUBMODE, LTT_FIELD_STATUS,
+ * LTT_FIELD_TGID
+ * </p>
+ *
+ * @return
+ */
+ final ILttngEventProcessor getEnumProcessStateHandler() {
+ AbsStateUpdate handler = new AbsStateUpdate() {
+
+ // @Override
+ public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
+ //
+ // Long parent_pid;
+ // Long pid;
+ // Long tgid;
+ // String command;
+ // Long cpu = trcEvent.getCpuId();
+ // LttngProcessState process = traceSt.getRunning_process().get(
+ // cpu);
+ // LttngProcessState parent_process;
+ // String type;
+ // // String mode, submode, status;
+ // LttngExecutionState es;
+ //
+ // /* PID */
+ // pid = getAFieldLong(trcEvent, traceSt, Fields.LTT_FIELD_PID);
+ //
+ // /* Parent PID */
+ // parent_pid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_PARENT_PID);
+ //
+ // /* Command name */
+ // command = getAFieldString(trcEvent, traceSt,
+ // Fields.LTT_FIELD_NAME);
+ //
+ // /* TODO: type field, Values need to be verified */
+ // /* type */
+ // Long typeVal = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_TYPE);
+ // if (typeVal == 0L) {
+ // type = ProcessType.LTTV_STATE_KERNEL_THREAD.getInName();
+ // } else {
+ // type = ProcessType.LTTV_STATE_USER_THREAD.getInName();
+ // }
+ //
+ // // FIXME: type is rarely used, enum must match possible
+ // types.
+ //
+ // // /* mode */
+ // // mode = getAFieldString(trcEvent, traceSt,
+ // // Fields.LTT_FIELD_MODE);
+ // //
+ // // /* submode */
+ // // submode = getAFieldString(trcEvent, traceSt,
+ // // Fields.LTT_FIELD_SUBMODE);
+ // //
+ // // /* status */
+ // // status = getAFieldString(trcEvent, traceSt,
+ // // Fields.LTT_FIELD_STATUS);
+ //
+ // /* TGID */
+ // tgid = getAFieldLong(trcEvent, traceSt,
+ // Fields.LTT_FIELD_TGID);
+ // if (tgid == null) {
+ // tgid = 0L;
+ // }
+ //
+ // if (pid == 0) {
+ // for (Long acpu : traceSt.getCpu_states().keySet()) {
+ // process = lttv_state_find_process(traceSt, acpu, pid);
+ // if (process != null) {
+ // process.setPpid(parent_pid);
+ // process.setTgid(tgid);
+ // process.setName(command);
+ // process
+ // .setType(ProcessType.LTTV_STATE_KERNEL_THREAD);
+ // } else {
+ // StringBuilder sb = new StringBuilder(
+ // "Unexpected, null process read from the TraceState list of processes, event time: "
+ // + trcEvent.getTimestamp());
+ // TraceDebug.debug(sb.toString());
+ // }
+ // }
+ // } else {
+ // /*
+ // * The process might exist if a process was forked while
+ // * performing the state dump.
+ // */
+ // process = lttv_state_find_process(traceSt, ANY_CPU, pid);
+ // if (process == null) {
+ // parent_process = lttv_state_find_process(traceSt,
+ // ANY_CPU, parent_pid);
+ // process = create_process(traceSt, cpu, pid, tgid,
+ // command, trcEvent.getTimestamp());
+ // if (parent_process != null) {
+ // process.setPpid(parent_process.getPid());
+ // }
+ //
+ // /* Keep the stack bottom : a running user mode */
+ // /*
+ // * Disabled because of inconsistencies in the current
+ // * statedump states.
+ // */
+ // if (type.equals(ProcessType.LTTV_STATE_KERNEL_THREAD
+ // .getInName())) {
+ // /*
+ // * FIXME Kernel thread : can be in syscall or
+ // * interrupt or trap.
+ // */
+ // /*
+ // * Will cause expected trap when in fact being
+ // * syscall (even after end of statedump event) Will
+ // * cause expected interrupt when being syscall.
+ // * (only before end of statedump event)
+ // */
+ // process
+ // .setType(ProcessType.LTTV_STATE_KERNEL_THREAD);
+ //
+ // // #if 0
+ // // es->t = LTTV_STATE_SYSCALL;
+ // // es->s = status;
+ // // es->n = submode;
+ // // #endif //0
+ // } else {
+ // /*
+ // * User space process : bottom : user mode either
+ // * currently running or scheduled out. can be
+ // * scheduled out because interrupted in (user mode
+ // * or in syscall) or because of an explicit call to
+ // * the scheduler in syscall. Note that the scheduler
+ // * call comes after the irq_exit, so never in
+ // * interrupt context.
+ // */
+ // // temp workaround : set size to 1 : only have user
+ // // mode
+ // // bottom of stack.
+ // // will cause g_info message of expected syscall
+ // // mode when
+ // // in fact being
+ // // in user mode. Can also cause expected trap when
+ // // in fact
+ // // being user
+ // // mode in the event of a page fault reenabling
+ // // interrupts
+ // // in the handler.
+ // // Expected syscall and trap can also happen after
+ // // the end
+ // // of statedump
+ // // This will cause a
+ // // "popping last state on stack, ignoring it."
+ //
+ // // process->execution_stack =
+ // // g_array_set_size(process->execution_stack, 1);
+ // // es = process->state =
+ // // &g_array_index(process->execution_stack,
+ // // LttvExecutionState, 0);
+ // // a new process must have only one state in the
+ // // stack and
+ // // be the same as the current state
+ // // es = process.getState();
+ // // es.setExec_mode(ExecutionMode.LTTV_STATE_MODE_UNKNOWN);
+ // // es.setProc_status(ProcessStatus.LTTV_STATE_UNNAMED);
+ // // es
+ // //
+ // .setExec_submode(ExecutionSubMode.LTTV_STATE_SUBMODE_UNKNOWN
+ // // .getInName());
+ //
+ // // #if 0
+ // // es->t = LTTV_STATE_USER_MODE;
+ // // es->s = status;
+ // // es->n = submode;
+ // // #endif //0
+ // }
+ // // TODO: clean up comments above: Moved repeated code
+ // // from both
+ // // if / else blocks above,
+ // // comments left temporarily for easier visualization
+ // // and
+ // // comparision with c code
+ // es = process.getState();
+ // es.setExec_mode(ExecutionMode.LTTV_STATE_MODE_UNKNOWN);
+ // es.setProc_status(ProcessStatus.LTTV_STATE_UNNAMED);
+ // es
+ // .setExec_submode(ExecutionSubMode.LTTV_STATE_SUBMODE_UNKNOWN
+ // .getInName());
+ // // #if 0
+ // // /* UNKNOWN STATE */
+ // // {
+ // // es = process->state =
+ // // &g_array_index(process->execution_stack,
+ // // LttvExecutionState, 1);
+ // // es->t = LTTV_STATE_MODE_UNKNOWN;
+ // // es->s = LTTV_STATE_UNNAMED;
+ // // es->n = LTTV_STATE_SUBMODE_UNKNOWN;
+ // // }
+ // // #endif //0
+ // } else {
+ // /*
+ // * The process has already been created : Probably was
+ // * forked while dumping the process state or was simply
+ // * scheduled in prior to get the state dump event.
+ // */
+ // process.setPpid(parent_pid);
+ // process.setTgid(tgid);
+ // process.setName(command);
+ // if (type.equals(ProcessType.LTTV_STATE_KERNEL_THREAD
+ // .getInName())) {
+ // process
+ // .setType(ProcessType.LTTV_STATE_KERNEL_THREAD);
+ // } else {
+ // process.setType(ProcessType.LTTV_STATE_USER_THREAD);
+ // }
+ //
+ // // es =
+ // // &g_array_index(process->execution_stack,
+ // // LttvExecutionState,
+ // // 0);
+ // // #if 0
+ // // if(es->t == LTTV_STATE_MODE_UNKNOWN) {
+ // // if(type == LTTV_STATE_KERNEL_THREAD)
+ // // es->t = LTTV_STATE_SYSCALL;
+ // // else
+ // // es->t = LTTV_STATE_USER_MODE;
+ // // }
+ // // #endif //0
+ // /*
+ // * Don't mess around with the stack, it will eventually
+ // * become ok after the end of state dump.
+ // */
+ // }
+ // }
+
+ return false;
+
+ }
+ };
+ return handler;
+ }
+
+}

Back to the top