📄 monitor.c
字号:
/* GKrellM| Copyright (C) 1999-2006 Bill Wilson|| Author: Bill Wilson billw@gkrellm.net| Latest versions might be found at: http://gkrellm.net|| This program is free software which I release under the GNU General Public| License. You may redistribute and/or modify this program under the terms| of that license as published by the Free Software Foundation; either| version 2 of the License, or (at your option) any later version.|| This program is distributed in the hope that it will be useful,| but WITHOUT ANY WARRANTY; without even the implied warranty of| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the| GNU General Public License for more details. Version 2 is in the| COPYRIGHT file in the top level directory of this distribution.| | To get a copy of the GNU General Puplic License, write to the Free Software| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#include "gkrellmd.h"#include "gkrellmd-private.h"GList *gkrellmd_monitor_list;static GList *serveflag_done_list;static struct tm gkrellmd_current_tm;gintgkrellm_get_timer_ticks(void) { return GK.timer_ticks; }gbooleangkrellmd_check_client_version(GkrellmdMonitor *mon, gint major, gint minor, gint rev) { GkrellmdClient *client = mon->privat->client; if ( client->major_version > major || (client->major_version == major && client->minor_version > minor) || ( client->major_version == major && client->minor_version == minor && client->rev_version >= rev ) ) return TRUE; return FALSE; }voidgkrellmd_add_serveflag_done(gboolean *flag) { serveflag_done_list = g_list_append(serveflag_done_list, flag); }voidgkrellmd_set_serve_name(GkrellmdMonitor *mon, const gchar *tag) { GkrellmdMonitorPrivate *mp = mon->privat; mp->serve_name = tag; mp->serve_name_sent = FALSE; }voidgkrellmd_serve_data(GkrellmdMonitor *mon, gchar *line) { GkrellmdMonitorPrivate *mp = mon->privat; gchar buf[128]; if (!line || !*line) return; if (!mp->serve_name_sent) { if (mp->serve_name) { snprintf(buf, sizeof(buf), "<%s>\n", mp->serve_name); mp->serve_gstring = g_string_append(mp->serve_gstring, buf); mp->serve_name_sent = TRUE; } else { printf("gkrellmd: %s forgot to gkrellmd_set_serve_name()\n", mon->name); return; } } mp->serve_gstring = g_string_append(mp->serve_gstring, line); }/* ======================================================= */typedef struct { gint instance; gulong user, nice, sys, idle; } CpuData;static gchar *n_cpus_setup;static gboolean nice_time_unsupported;static GList *cpu_list;static GList *instance_list;voidgkrellm_cpu_set_number_of_cpus(gint n) { CpuData *cpu; GList *list; gint i; n_cpus_setup = g_strdup_printf("n_cpus %d\n", n); for (i = 0; i < n; ++i) { cpu = g_new0(CpuData, 1); cpu_list = g_list_append(cpu_list, cpu); if (instance_list && (list = g_list_nth(instance_list, i)) != NULL) cpu->instance = GPOINTER_TO_INT(list->data); else cpu->instance = i; } }voidgkrellm_cpu_add_instance(gint instance) { instance_list = g_list_append(instance_list, GINT_TO_POINTER(instance)); }voidgkrellm_cpu_nice_time_unsupported(void) { nice_time_unsupported = TRUE; }voidgkrellm_cpu_assign_composite_data(gulong user, gulong nice, gulong sys, gulong idle) { return; /* let client gkrellm compute it */ }voidgkrellm_cpu_assign_data(gint n, gulong user, gulong nice, gulong sys, gulong idle) { CpuData *cpu = NULL; GList *list; for (list = cpu_list; list; list = list->next) { cpu = (CpuData *) list->data; if (cpu->instance == n) break; } if (list) { cpu->user = user; cpu->nice = nice; cpu->sys = sys; cpu->idle = idle; } }static voidupdate_cpu(GkrellmdMonitor *mon, gboolean first_update) { gkrellm_sys_cpu_read_data(); gkrellmd_need_serve(mon); }static voidserve_cpu_data(GkrellmdMonitor *mon, gboolean first_serve) { CpuData *cpu; GList *list; gchar buf[128]; gkrellmd_set_serve_name(mon, "cpu"); for (list = cpu_list; list; list = list->next) { cpu = (CpuData *) list->data; sprintf(buf, "%d %lu %lu %lu %lu\n", cpu->instance, cpu->user, cpu->nice, cpu->sys, cpu->idle); gkrellmd_serve_data(mon, buf); } }static voidserve_cpu_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; GList *list; gchar buf[64]; gkrellmd_send_to_client(client, "<cpu_setup>\n"); for (list = instance_list; list; list = list->next) { snprintf(buf, sizeof(buf), "cpu_instance %d\n", GPOINTER_TO_INT(list->data)); gkrellmd_send_to_client(client, buf); } gkrellmd_send_to_client(client, n_cpus_setup); if (nice_time_unsupported) gkrellmd_send_to_client(client, "nice_time_unsupported\n"); }static GkrellmdMonitor cpu_monitor = { "cpu", update_cpu, serve_cpu_data, serve_cpu_setup };static GkrellmdMonitor *init_cpu_monitor(void) { if (gkrellm_sys_cpu_init()) return &cpu_monitor; return NULL; }/* ======================================================= */struct { gboolean changed; gint n_processes, n_running, n_users; gulong n_forks; gfloat fload; } proc;voidgkrellm_proc_assign_data(gint n_processes, gint n_running, gulong n_forks, gfloat load) { if ( proc.n_processes != n_processes || proc.n_running != n_running || proc.n_forks != n_forks || proc.fload != load ) { proc.n_processes = n_processes; proc.n_running = n_running; proc.n_forks = n_forks; proc.fload = load; proc.changed = TRUE; } }voidgkrellm_proc_assign_users(gint n_users) { if (proc.n_users != n_users) { proc.n_users = n_users; proc.changed = TRUE; } }static voidupdate_proc(GkrellmdMonitor *mon, gboolean first_update) { proc.changed = FALSE; gkrellm_sys_proc_read_data(); if (first_update || GK.five_second_tick) gkrellm_sys_proc_read_users(); if (proc.changed) gkrellmd_need_serve(mon); }static voidserve_proc_data(GkrellmdMonitor *mon, gboolean first_serve) { gchar buf[128]; gkrellmd_set_serve_name(mon, "proc"); snprintf(buf, sizeof(buf), "%d %d %lu %.2f %d\n", proc.n_processes, proc.n_running, proc.n_forks, proc.fload, proc.n_users); gkrellmd_serve_data(mon, buf); }static GkrellmdMonitor proc_monitor = { "proc", update_proc, serve_proc_data, NULL };static GkrellmdMonitor *init_proc_monitor(void) { if (!gkrellm_sys_proc_init()) return NULL; serveflag_done_list = g_list_append(serveflag_done_list, &proc.changed); return &proc_monitor; }/* ======================================================= */typedef struct { gchar *name; gchar *subdisk_parent; gint order, subdisk, changed; gint device_number, unit_number; gboolean virtual; guint64 rb, wb; } DiskData;static GList *disk_list;static gint n_disks;static gboolean units_are_blocks;static DiskData *add_disk(gchar *name, gint order, gint device_number, gint unit_number) { DiskData *disk; GList *list; gint i; disk = g_new0(DiskData, 1); disk->name = g_strdup(name); disk->order = order; disk->subdisk = -1; disk->device_number = device_number; disk->unit_number = unit_number; if (order >= 0) { for (i = 0, list = disk_list; list; list = list->next, ++i) if (disk->order < ((DiskData *) list->data)->order) break; disk_list = g_list_insert(disk_list, disk, i); } else disk_list = g_list_append(disk_list, disk); ++n_disks; return disk; }static DiskData *add_subdisk(gchar *subdisk_name, gchar *disk_name, gint subdisk) { DiskData *sdisk = NULL;#if GLIB_CHECK_VERSION(2,0,0) DiskData *disk; GList *list = NULL; for (list = disk_list; list; list = list->next) { disk = (DiskData * ) list->data; if (!strcmp(disk_name, disk->name)) break; } if (!list) return NULL; sdisk = g_new0(DiskData, 1); sdisk->name = g_strdup(subdisk_name); sdisk->subdisk_parent = g_strdup(disk_name); sdisk->order = disk->order; sdisk->subdisk = subdisk; for (list = list->next; list; list = list->next) { disk = (DiskData * ) list->data; if (disk->subdisk == -1 || disk->subdisk > subdisk) break; } disk_list = g_list_insert_before(disk_list, list, sdisk); ++n_disks;#endif return sdisk; }static voiddisk_assign_data(DiskData *disk, guint64 rb, guint64 wb, gboolean virtual) { if (disk) { if (disk->rb != rb || disk->wb != wb) disk->changed = TRUE; else disk->changed = FALSE; disk->rb = rb; disk->wb = wb; disk->virtual = virtual; } }voidgkrellm_disk_reset_composite(void) { /* Don't handle this. */ }voidgkrellm_disk_units_are_blocks(void) { units_are_blocks = TRUE; }voidgkrellm_disk_assign_data_by_device(gint device_number, gint unit_number, guint64 rb, guint64 wb, gboolean virtual) { GList *list; DiskData *disk = NULL; gchar *name; gint order = -1; for (list = disk_list; list; list = list->next) { disk = (DiskData * ) list->data; if ( disk->device_number == device_number && disk->unit_number == unit_number ) break; disk = NULL; } if (!disk) { name = gkrellm_sys_disk_name_from_device(device_number, unit_number, &order); if (name) disk = add_disk(name, order, device_number, unit_number); } disk_assign_data(disk, rb, wb, virtual); }voidgkrellm_disk_assign_data_nth(gint n, guint64 rb, guint64 wb, gboolean virtual) { DiskData *disk; gchar name[32]; if (n < n_disks) disk = (DiskData *) g_list_nth_data(disk_list, n); else { sprintf(name, "%s%c", _("Disk"), 'A' + n); disk = add_disk(name, n, 0, 0); } disk_assign_data(disk, rb, wb, virtual); }voidgkrellm_disk_assign_data_by_name(gchar *name, guint64 rb, guint64 wb, gboolean virtual) { GList *list; DiskData *disk = NULL; gint order = -1; for (list = disk_list; list; list = list->next) { disk = (DiskData * ) list->data; if (!strcmp(name, disk->name)) break; disk = NULL; } if (!disk) { order = gkrellm_sys_disk_order_from_name(name); disk = add_disk(name, order, 0, 0); } disk_assign_data(disk, rb, wb, virtual); }voidgkrellm_disk_subdisk_assign_data_by_name(gchar *subdisk_name, gchar *disk_name, guint64 rb, guint64 wb) { GList *list; DiskData *disk = NULL; gchar *s, *endptr; gint subdisk; if (!subdisk_name || !disk_name) return; for (list = disk_list; list; list = list->next) { disk = (DiskData * ) list->data; if (!strcmp(subdisk_name, disk->name)) break; disk = NULL; } if (!disk) { /* A subdisk name is expected to be the disk_name with a number string | appended. Eg. "hda1" is a subdisk_name of disk_name "hda" */ s = subdisk_name + strlen(disk_name); subdisk = strtol(s, &endptr, 0); if (!*s || *endptr) return; disk = add_subdisk(subdisk_name, disk_name, subdisk); } disk_assign_data(disk, rb, wb, FALSE); }static voidupdate_disk(GkrellmdMonitor *mon, gboolean first_update) { GList *list; DiskData *disk = NULL; gkrellm_sys_disk_read_data(); for (list = disk_list; list; list = list->next) { disk = (DiskData * ) list->data; if (disk->changed) { gkrellmd_need_serve(mon); break; } } }static voidserve_disk_data(GkrellmdMonitor *mon, gboolean first_serve) { DiskData *disk; GList *list; gchar buf[128]; gkrellmd_set_serve_name(mon, "disk"); for (list = disk_list; list; list = list->next) { disk = (DiskData *) list->data; if (!disk->changed && !first_serve) continue; if (!disk->subdisk_parent) { if (gkrellmd_check_client_version(mon, 2, 2, 7) && disk->virtual) snprintf(buf, sizeof(buf), "%s virtual %llu %llu\n", disk->name, disk->rb, disk->wb); else snprintf(buf, sizeof(buf), "%s %llu %llu\n", disk->name, disk->rb, disk->wb); } else if (mon->privat->client->feature_subdisk) snprintf(buf, sizeof(buf), "%s %s %llu %llu\n", disk->name, disk->subdisk_parent, disk->rb, disk->wb); else continue; gkrellmd_serve_data(mon, buf); } }static voidserve_disk_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; if (units_are_blocks) gkrellmd_send_to_client(client, "<disk_setup>\nunits_are_blocks\n"); if (gkrellmd_check_client_version(mon, 2,1,3)) client->feature_subdisk = TRUE; }static GkrellmdMonitor disk_monitor =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -