+#if ENABLE_FEATURE_TOPMEM
+ if (flags & (PSSCAN_SMAPS)) {
+ FILE *file;
+
+ strcpy(filename_tail, "/smaps");
+ file = fopen_for_read(filename);
+ if (!file)
+ break;
+ while (fgets(buf, sizeof(buf), file)) {
+ unsigned long sz;
+ char *tp;
+ char w;
+#define SCAN(str, name) \
+ if (strncmp(buf, str, sizeof(str)-1) == 0) { \
+ tp = skip_whitespace(buf + sizeof(str)-1); \
+ sp->name += fast_strtoul_10(&tp); \
+ continue; \
+ }
+ SCAN("Shared_Clean:" , shared_clean );
+ SCAN("Shared_Dirty:" , shared_dirty );
+ SCAN("Private_Clean:", private_clean);
+ SCAN("Private_Dirty:", private_dirty);
+#undef SCAN
+ // f7d29000-f7d39000 rw-s ADR M:m OFS FILE
+ tp = strchr(buf, '-');
+ if (tp) {
+ *tp = ' ';
+ tp = buf;
+ sz = fast_strtoul_16(&tp); /* start */
+ sz = (fast_strtoul_16(&tp) - sz) >> 10; /* end - start */
+ // tp -> "rw-s" string
+ w = tp[1];
+ // skipping "rw-s ADR M:m OFS "
+ tp = skip_whitespace(skip_fields(tp, 4));
+ // filter out /dev/something (something != zero)
+ if (strncmp(tp, "/dev/", 5) != 0 || strcmp(tp, "/dev/zero\n") == 0) {
+ if (w == 'w') {
+ sp->mapped_rw += sz;
+ } else if (w == '-') {
+ sp->mapped_ro += sz;
+ }
+ }
+//else printf("DROPPING %s (%s)\n", buf, tp);
+ if (strcmp(tp, "[stack]\n") == 0)
+ sp->stack += sz;
+ }
+ }
+ fclose(file);
+ }
+#endif /* TOPMEM */
+
+#if 0 /* PSSCAN_CMD is not used */
+ if (flags & (PSSCAN_CMD|PSSCAN_ARGV0)) {
+ free(sp->argv0);
+ sp->argv0 = NULL;