LINUX.ORG.RU

Глянул. И впрямь на 5 минут. Сделаю, сёдгня вечером положу - счас нету линуха под рукой чтоб потестить.

Sectoid ★★★★★
()
Ответ на: комментарий от birdie

>Хм, кажется, человек не дошёл до дома.

скорее всего, до какого-то дома он дошёл, но может, здесь под вечер Linux не к месту :))

anonymous
()
Ответ на: комментарий от birdie

>Хм, кажется, человек не дошёл до дома.

По дороге встретил линуксоидов и была досрочное пятниццо. Залью сегодня.

Sectoid ★★★★★
()

--- Process.h.orig	2007-10-12 00:29:06.000000000 +0100
+++ Process.h	2007-10-12 09:35:16.000000000 +0100
@@ -47,6 +47,7 @@
    #ifdef HAVE_OPENVZ
    VEID, VPID,
    #endif
+   IOREAD,IOWRITE,
    LAST_PROCESSFIELD
 } ProcessField;
 
@@ -118,6 +119,8 @@
    unsigned int veid;
    unsigned int vpid;
    #endif
+   long int ioread;
+   long int iowrite;
 } Process;
 
 
--- Process.c.orig	2007-10-12 00:29:14.000000000 +0100
+++ Process.c	2007-10-12 09:34:56.000000000 +0100
@@ -45,6 +45,7 @@
    #ifdef HAVE_OPENVZ
    VEID, VPID,
    #endif
+   IOREAD,IOWRITE,
    LAST_PROCESSFIELD
 } ProcessField;
 
@@ -116,6 +117,8 @@
    unsigned int veid;
    unsigned int vpid;
    #endif
+   long int ioread;
+   long int iowrite;
 } Process;
 
 }*/
@@ -131,6 +134,7 @@
 #ifdef HAVE_OPENVZ
 "VEID", "VPID",
 #endif
+"IOREAD","IOWRITE",
 "*** report bug! ***"
 };
 
@@ -379,6 +383,12 @@
    case VEID: snprintf(buffer, n, "%5u ", this->veid); break;
    case VPID: snprintf(buffer, n, "%5u ", this->vpid); break;
    #endif
+   case IOREAD: if(this->ioread>=0) Process_printLargeNumber(this, str, this->ioread); 
+                else snprintf(buffer, n, "-     ");
+                break;
+   case IOWRITE: if(this->iowrite >= 0) Process_printLargeNumber(this, str, this->iowrite); 
+                 else snprintf(buffer, n, "-     ");
+                 break; 
    default:
       snprintf(buffer, n, "- ");
    }
@@ -449,6 +459,10 @@
    case VPID:
       return (p1->vpid - p2->vpid);
    #endif
+   case IOREAD:
+      return (p1->ioread - p2->ioread);
+   case IOWRITE:
+      return (p1->iowrite - p2->iowrite);
    default:
       return (p1->pid - p2->pid);
    }
@@ -487,6 +501,8 @@
    case VEID: return " VEID ";
    case VPID: return " VPID ";
    #endif
+   case IOREAD: return " IORD ";
+   case IOWRITE: return " IOWR ";
    default: return "- ";
    }
 }
--- ProcessList.c.orig	2007-10-12 08:27:52.000000000 +0100
+++ ProcessList.c	2007-10-12 09:36:05.000000000 +0100
@@ -575,9 +575,47 @@
 
          int success = ProcessList_readStatFile(this, process, status, command);
          fclose(status);
+
          if(!success)
             goto errorReadingProcess;
 
+
+
+
+
+	 snprintf(statusfilename, MAX_NAME, "%s/%s/io/read_bytes", dirname, name);
+         status = ProcessList_fopen(this, statusfilename, "r");
+	 num=0;
+         if(status!=NULL){
+	   num = ProcessList_fread(this, status, "%ld",&process->ioread);
+           fclose(status);
+	 }
+	 if( num != 1 ) process->ioread=-1;
+         snprintf(statusfilename, MAX_NAME, "%s/%s/io/write_bytes", dirname, name);
+         status = ProcessList_fopen(this, statusfilename, "r");
+	 num=0;
+         if(status!=NULL){
+	   num = ProcessList_fread(this, status, "%ld", &process->iowrite);
+           fclose(status);
+	 }
+	 if(num!=1){
+	    process->iowrite = -1;
+	 }else{
+	    num=0;
+	    long int temp_v=0;
+            snprintf(statusfilename, MAX_NAME, "%s/%s/io/cancelled_write_bytes", dirname, name);
+            status = ProcessList_fopen(this, statusfilename, "r");
+            if(status!=NULL){
+	      num = ProcessList_fread(this, status, "%ld", &temp_v);
+              fclose(status);
+            }	      
+	    if( num == 1 )  process->iowrite-=temp_v;
+	 }
+
+
+
+
+
          if(!existingProcess) {
             process->user = UsersTable_getRef(this->usersTable, process->st_uid);
 

anonymous
()
Ответ на: комментарий от anonymous

не советовал бы править h файлы в htop, т.к. они генеряться автоматически, см. Makefile.am.

и кстати на моем 2.6.22 не существует директории /proc/self/io, а есть файл /proc/self/io

fghj ★★★★★
()
Ответ на: комментарий от fghj

>не советовал бы править h файлы в htop, т.к. они генеряться автоматически, см. Makefile.am

Шаблон тоже исправлен.

> на моем 2.6.22 не существует директории /proc/self/io, а есть файл /proc/self/io

На моём 2.6.20 и того не существует, как понял ТЗ - так и написал.

anonymous
()
Ответ на: комментарий от anonymous

>Шаблон тоже исправлен.

Ну, как я понимаю идея в том, чтобы этот патч приложить к багу,
а автору htop будет намного легче делать "review" патча,
если он будет исправлять только что нужно испралять.

fghj ★★★★★
()
Ответ на: комментарий от fghj

>Ну, как я понимаю идея в том, чтобы этот патч приложить к багу, а автору htop будет намного легче делать "review" патча, если он будет исправлять только что нужно испралять.

Это не баг, а новый функционал. В исходниках хидер присутствует.

Вместо го, что бы лечить моск, лучше бы скинул пример в каком виде у тебя io статистика представлена, что бы можно было подправить ту часть, где она пытается считываться из несуществующих файлов.

anonymous
()
Ответ на: комментарий от anonymous

static void readIOFile(Process *proc, FILE *f) {
        unsigned long long rchar, wchar, syscr, syscw, read_bytes, write_bytes;
        char buf[MAX_READ + 1];
      
        assert(f != NULL);
        assert(proc != NULL);

        size_t size = fread(buf, 1, MAX_READ, f);
        if(!size)
                return;
        buf[size] = '\0';
        int res = ProcessList_read(this, buf,
                                   "rchar:%llu\n"
                                   "wchar:%llu\n"
                                   "syscr:%llu\n"
                                   "syscw:%llu\n"
                                   "read_bytes:%llu\n"
                                   "write_bytes:%llu\n",
                                   &rchar, &wchar, &syscr, &syscw, &read_bytes,
                                   &write_bytes);
        if (res != 6)
                return;
        proc->read_bytes = read_bytes;
        proc->write_bytes = write_bytes;
}

вот такая процедура считает всю нужную статистику,
если перед этим сделать
FILE *f = fopen("/proc/SOMEPID/io", "r");

fghj ★★★★★
()
Ответ на: комментарий от anonymous

> В исходниках хидер присутствует.

В исходниках еще configure и Makefile.in присуствует,
но это же не повод включать их изменения в патч,
если что-то поправили в coinfugre.in и Makefile.am соотвественно.

fghj ★★★★★
()
Ответ на: комментарий от fghj

Формат файла на вашей совести...




--- Process.h.orig 2007-10-12 00:29:06.000000000 +0100
+++ Process.h 2007-10-12 14:07:45.000000000 +0100
@@ -47,6 +47,7 @@
#ifdef HAVE_OPENVZ
VEID, VPID,
#endif
+ IOREAD,IOWRITE,
LAST_PROCESSFIELD
} ProcessField;

@@ -118,6 +119,9 @@
unsigned int veid;
unsigned int vpid;
#endif
+ unsigned long long int ioread;
+ unsigned long long int iowrite;
+ bool f_io_accessible;
} Process;


@@ -146,6 +150,8 @@
#define ONE_K 1024
#define ONE_M (ONE_K * ONE_K)
#define ONE_G (ONE_M * ONE_K)
+#define ONE_T (ONE_G * ONE_K)
+

void Process_writeField(Process* this, RichString* str, ProcessField field);

--- Process.c.orig 2007-10-12 00:29:14.000000000 +0100
+++ Process.c 2007-10-12 14:08:51.000000000 +0100
@@ -45,6 +45,7 @@
#ifdef HAVE_OPENVZ
VEID, VPID,
#endif
+ IOREAD,IOWRITE,
LAST_PROCESSFIELD
} ProcessField;

@@ -116,6 +117,9 @@
unsigned int veid;
unsigned int vpid;
#endif
+ unsigned long long int ioread;
+ unsigned long long int iowrite;
+ bool f_io_accessible;
} Process;

}*/
@@ -131,6 +135,7 @@
#ifdef HAVE_OPENVZ
"VEID", "VPID",
#endif
+"IOREAD","IOWRITE",
"*** report bug! ***"
};

@@ -200,12 +205,13 @@
#define ONE_K 1024
#define ONE_M (ONE_K * ONE_K)
#define ONE_G (ONE_M * ONE_K)
+#define ONE_T (ONE_G * ONE_K)

static void Process_printLargeNumber(Process* this, RichString *str, unsigned long number) {
char buffer[11];
int len;
if(number >= (1000 * ONE_M)) {
- len = snprintf(buffer, 10, "%4.2fG ", (float)number / ONE_M);
+ len = snprintf(buffer, 10, "%4.2fG ", (float)number / ONE_M); //<<BUG??
RichString_appendn(str, CRT_colors[LARGE_NUMBER], buffer, len);
} else if(number >= (100000)) {
len = snprintf(buffer, 10, "%4ldM ", number / ONE_K);
@@ -225,6 +231,23 @@
}
}

+static void Process_printHugeNumber(Process* this, RichString *str, unsigned long long int number) {
+ char buffer[11];
+ int len;
+ unsigned long nmMb=(number/ONE_M);//Mbytes
+ if(nmMb >= 1024*1000) { //>1TB
+ len = snprintf(buffer, 10, "%4.2fT ", (float)nmMb /(1024*1024));
+ RichString_appendn(str, CRT_colors[LARGE_NUMBER], buffer, len);
+ } else if(nmMb >= 1000) { //>1GB
+ len = snprintf(buffer, 10, "%4.2fG ", (float)nmMb /1024);
+ RichString_appendn(str, CRT_colors[LARGE_NUMBER], buffer, len);
+ } else {
+ nmMb=number;
+ Process_printLargeNumber(this, str, nmMb);
+ }
+}
+
+
static double jiffy = 0.0;

static void Process_printTime(RichString* str, unsigned long t) {
@@ -379,6 +402,12 @@
case VEID: snprintf(buffer, n, "%5u ", this->veid); break;
case VPID: snprintf(buffer, n, "%5u ", this->vpid); break;
#endif
+ case IOREAD: if(this->f_io_accessible==TRUE)

anonymous
()
Ответ на: комментарий от anonymous

Process_printHugeNumber(this, str, this->ioread); + else snprintf(buffer, n, " - "); + return; + case IOWRITE: if(this->f_io_accessible==TRUE) Process_printHugeNumber(this, str, this->iowrite); + else snprintf(buffer, n, " - "); + return; default: snprintf(buffer, n, "- "); } @@ -449,6 +478,10 @@ case VPID: return (p1->vpid - p2->vpid); #endif + case IOREAD: + return (p1->ioread - p2->ioread); + case IOWRITE: + return (p1->iowrite - p2->iowrite); default: return (p1->pid - p2->pid); } @@ -487,6 +520,8 @@ case VEID: return " VEID "; case VPID: return " VPID "; #endif + case IOREAD: return " IORD "; + case IOWRITE: return " IOWR "; default: return "- "; } } --- ProcessList.c.orig 2007-10-12 08:27:52.000000000 +0100 +++ ProcessList.c 2007-10-12 14:08:58.000000000 +0100 @@ -575,9 +575,41 @@ int success = ProcessList_readStatFile(this, process, status, command); fclose(status); + if(!success) goto errorReadingProcess; + + + + + + process->f_io_accessible=FALSE; + snprintf(statusfilename, MAX_NAME, "%s/%s/io", dirname, name); + status = ProcessList_fopen(this, statusfilename, "r"); + if(status!=NULL){ + long long unsigned int stub, cancelled_write_bytes=0; + num=ProcessList_fread(this, status, + "rchar: %llu\n"\ + "wchar: %llu\n"\ + "syscr: %llu\n"\ + "syscw: %llu\n"\ + "read_bytes: %llu\n"\ + "write_bytes: %llu\n"\ + "cancelled_write_bytes: %llu\n", + &stub, &stub, &stub, &stub, + &process->ioread,&process->iowrite, + &cancelled_write_bytes); + if (num == 7){ + process->f_io_accessible=TRUE; + process->iowrite-=cancelled_write_bytes; + } + fclose(status); + } + + + + if(!existingProcess) { process->user = UsersTable_getRef(this->usersTable, process->st_uid);

anonymous
()
Ответ на: комментарий от anonymous

Когда постил вторую часть - формат сбился. Поправляюсь:

Process_printHugeNumber(this, str, this->ioread); + else snprintf(buffer, n, " - "); + return; + case IOWRITE: if(this->f_io_accessible==TRUE) Process_printHugeNumber(this, str, this->iowrite); + else snprintf(buffer, n, " - "); + return; default: snprintf(buffer, n, "- "); } @@ -449,6 +478,10 @@ case VPID: return (p1->vpid - p2->vpid); #endif + case IOREAD: + return (p1->ioread - p2->ioread); + case IOWRITE: + return (p1->iowrite - p2->iowrite); default: return (p1->pid - p2->pid); } @@ -487,6 +520,8 @@ case VEID: return " VEID "; case VPID: return " VPID "; #endif + case IOREAD: return " IORD "; + case IOWRITE: return " IOWR "; default: return "- "; } } --- ProcessList.c.orig 2007-10-12 08:27:52.000000000 +0100 +++ ProcessList.c 2007-10-12 14:08:58.000000000 +0100 @@ -575,9 +575,41 @@ int success = ProcessList_readStatFile(this, process, status, command); fclose(status); + if(!success) goto errorReadingProcess; + + + + + + process->f_io_accessible=FALSE; + snprintf(statusfilename, MAX_NAME, "%s/%s/io", dirname, name); + status = ProcessList_fopen(this, statusfilename, "r"); + if(status!=NULL){ + long long unsigned int stub, cancelled_write_bytes=0; + num=ProcessList_fread(this, status, + "rchar: %llu\n"\ + "wchar: %llu\n"\ + "syscr: %llu\n"\ + "syscw: %llu\n"\ + "read_bytes: %llu\n"\ + "write_bytes: %llu\n"\ + "cancelled_write_bytes: %llu\n", + &stub, &stub, &stub, &stub, + &process->ioread,&process->iowrite, + &cancelled_write_bytes); + if (num == 7){ + process->f_io_accessible=TRUE; + process->iowrite-=cancelled_write_bytes; + } + fclose(status); + } + + + + if(!existingProcess) { process->user = UsersTable_getRef(this->usersTable, process->st_uid);

anonymous
()
Ответ на: комментарий от anonymous

Блядь да что же за херня %-[


Process_printHugeNumber(this, str, this->ioread);
+ else snprintf(buffer, n, " - ");
+ return;
+ case IOWRITE: if(this->f_io_accessible==TRUE) Process_printHugeNumber(this, str, this->iowrite);
+ else snprintf(buffer, n, " - ");
+ return;
default:
snprintf(buffer, n, "- ");
}
@@ -449,6 +478,10 @@
case VPID:
return (p1->vpid - p2->vpid);
#endif
+ case IOREAD:
+ return (p1->ioread - p2->ioread);
+ case IOWRITE:
+ return (p1->iowrite - p2->iowrite);
default:
return (p1->pid - p2->pid);
}
@@ -487,6 +520,8 @@
case VEID: return " VEID ";
case VPID: return " VPID ";
#endif
+ case IOREAD: return " IORD ";
+ case IOWRITE: return " IOWR ";
default: return "- ";
}
}
--- ProcessList.c.orig 2007-10-12 08:27:52.000000000 +0100
+++ ProcessList.c 2007-10-12 14:08:58.000000000 +0100
@@ -575,9 +575,41 @@

int success = ProcessList_readStatFile(this, process, status, command);
fclose(status);
+
if(!success)
goto errorReadingProcess;

+
+
+
+
+
+ process->f_io_accessible=FALSE;
+ snprintf(statusfilename, MAX_NAME, "%s/%s/io", dirname, name);
+ status = ProcessList_fopen(this, statusfilename, "r");
+ if(status!=NULL){
+ long long unsigned int stub, cancelled_write_bytes=0;
+ num=ProcessList_fread(this, status,
+ "rchar: %llu\n"\
+ "wchar: %llu\n"\
+ "syscr: %llu\n"\
+ "syscw: %llu\n"\
+ "read_bytes: %llu\n"\
+ "write_bytes: %llu\n"\
+ "cancelled_write_bytes: %llu\n",
+ &stub, &stub, &stub, &stub,
+ &process->ioread,&process->iowrite,
+ &cancelled_write_bytes);
+ if (num == 7){
+ process->f_io_accessible=TRUE;
+ process->iowrite-=cancelled_write_bytes;
+ }
+ fclose(status);
+ }
+
+
+
+
if(!existingProcess) {
process->user = UsersTable_getRef(this->usersTable, process->st_uid);

anonymous
()
Ответ на: комментарий от fghj

> В исходниках еще configure и Makefile.in присуствует, но это же не повод включать их изменения в патч

Забери исходники из svn и посмотри что там присутствует. Задолбал уже своими попытками лечить моск.

anonymous
()

Народ, кому не лень, сделайте нормальный патч и залейте его на sf.net.

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie

ЧТо "АУ"? Объясни, чем тебя этот не устраивает?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.