@Override public void generate(Module rep) { if (!mLoaded) return; BugReportModule br = (BugReportModule) rep; Chapter ch = br.findOrCreateChapter("Battery info/Kernel wakelocks"); addHelp(ch); long uptime = br.getUptime(); Table tg = new Table(Table.FLAG_SORT, ch); tg.setCSVOutput(rep, "kernel_wakelocks"); tg.setTableName(rep, "kernel_wakelocks"); tg.addColumn("Name", "The name of the wakelock as provided by the driver", 0, "name varchar"); tg.addColumn( "Count", "The number of times that the wakelock has been acquired.", Table.FLAG_ALIGN_RIGHT, "count int"); tg.addColumn( "Expire count", "The number of times that the wakelock has timed out. This indicates that some application has an input device open, but is not reading from it, which is a bug.", Table.FLAG_ALIGN_RIGHT, "expire_count int"); tg.addColumn( "Wake count", "The number of times that the wakelock was the first to be acquired in the resume path.", Table.FLAG_ALIGN_RIGHT, "wake_count int"); tg.addColumn( "Active since (ms)", "Tracks how long a wakelock has been held since it was last acquired, or zero if it is not currently held.", Table.FLAG_ALIGN_RIGHT, "active_since_ms int"); tg.addColumn( "Total time (ms)", "Accumulates the total amount of time that the corresponding wakelock has been held.", Table.FLAG_ALIGN_RIGHT, "total_time_ms int"); if (uptime > 0) { tg.addColumn( "Total time (%)", "Total time as percentage of uptime", Table.FLAG_ALIGN_RIGHT, "total_time_p int"); } tg.addColumn( "Average time (ms)", "Total time divided by Count.", Table.FLAG_ALIGN_RIGHT, "average_time_ms int"); tg.addColumn( "Sleep time (ms)", "The total time that the wakelock was held while the display was powered off.", Table.FLAG_ALIGN_RIGHT, "sleep_time_ms int"); tg.addColumn( "Max time (ms)", "The longest hold time for the wakelock. This allows finding cases where wakelocks are held for too long, but are eventually released. (In contrast, active_since is more useful in the held-forever case.)", Table.FLAG_ALIGN_RIGHT, "max_time_ms int"); tg.addColumn("Last change", "?", Table.FLAG_ALIGN_RIGHT, "last_change int"); tg.begin(); for (KernelWakelock lock : mLocks) { tg.addData(lock.name); tg.addData(lock.count); tg.addData(lock.expire_count); tg.addData(lock.wake_count); long activeSinceMs = lock.active_since / 1000000L; tg.addData(Util.formatTS(activeSinceMs), new ShadedValue(activeSinceMs)); long totalMs = lock.total_time / 1000000L; tg.addData(Util.formatTS(totalMs), new ShadedValue(totalMs)); if (uptime > 0) { tg.addData(lock.total_time / 10000000L / uptime); } long avgMs = (lock.count == 0) ? 0 : (lock.total_time / lock.count / 1000000L); tg.addData(Util.formatTS(avgMs), new ShadedValue(avgMs)); long sleepMs = lock.sleep_time / 1000000L; tg.addData(Util.formatTS(sleepMs), new ShadedValue(sleepMs)); long maxMs = lock.max_time / 1000000L; tg.addData(Util.formatTS(maxMs), new ShadedValue(maxMs)); tg.addData(lock.last_change); } tg.end(); }