📄 monitor.c
字号:
swap_used; gulong swap_in, swap_out; } mem;voidgkrellm_mem_assign_data(guint64 total, guint64 used, guint64 free, guint64 shared, guint64 buffers, guint64 cached) { if ( mem.total != total || mem.used != used || mem.free != free || mem.shared != shared || mem.buffers != buffers || mem.cached != cached ) { mem.total = total; mem.used = used; mem.free = free; mem.shared = shared; mem.buffers = buffers; mem.cached = cached; mem.mem_changed = TRUE; } }voidgkrellm_swap_assign_data(guint64 total, guint64 used, gulong swap_in, gulong swap_out) { if ( mem.swap_total != total || mem.swap_used != used || mem.swap_in != swap_in || mem.swap_out != swap_out ) { mem.swap_total = total; mem.swap_used = used; mem.swap_in = swap_in; mem.swap_out = swap_out; mem.swap_changed = TRUE; } }static voidupdate_mem(GkrellmdMonitor *mon, gboolean first_update) { mem.mem_changed = mem.swap_changed = FALSE; gkrellm_sys_swap_read_data(); if (first_update || GK.five_second_tick) gkrellm_sys_mem_read_data(); if (mem.mem_changed || mem.swap_changed) gkrellmd_need_serve(mon); }static voidserve_mem_data(GkrellmdMonitor *mon, gboolean first_serve) { gchar buf[128]; if (mem.mem_changed || first_serve) { gkrellmd_set_serve_name(mon, "mem"); snprintf(buf, sizeof(buf), "%llu %llu %llu %llu %llu %llu\n", mem.total, mem.used, mem.free, mem.shared, mem.buffers, mem.cached); gkrellmd_serve_data(mon, buf); } if (mem.swap_changed || first_serve) { gkrellmd_set_serve_name(mon, "swap"); snprintf(buf, sizeof(buf), "%llu %llu %lu %lu\n", mem.swap_total, mem.swap_used, mem.swap_in, mem.swap_out); gkrellmd_serve_data(mon, buf); } }static GkrellmdMonitor mem_monitor = { "mem", update_mem, serve_mem_data, NULL };static GkrellmdMonitor *init_mem_monitor(void) { if (!gkrellm_sys_mem_init()) return NULL; serveflag_done_list = g_list_append(serveflag_done_list, &mem.mem_changed); serveflag_done_list = g_list_append(serveflag_done_list,&mem.swap_changed); return &mem_monitor; }/* ======================================================= */typedef struct { gboolean busy, deleted, is_mounted, is_nfs, changed; gchar *directory, *device, *type, *options; glong blocks, bavail, bfree, bsize; } Mount;static GList *mounts_list, *fstab_list;static gboolean nfs_check, fs_check, fs_need_serve, fstab_list_modified, mounts_list_modified, mounting_unsupported;static gchar *remote_fs_types[] = { "nfs", "smbfs" };voidgkrellm_fs_setup_eject(gchar *eject_tray, gchar *close_tray, void (*eject_func)(), void (*close_func)()) { /* Not supported remotely */ }voidgkrellm_fs_add_to_mounts_list(gchar *dir, gchar *dev, gchar *type) { GList *list; Mount *m; gint i; for (list = mounts_list; list; list = list->next) { m = (Mount *) list->data; if ( !strcmp(m->directory, dir) && !strcmp(m->device, dev) && !strcmp(m->type, type) ) break; } if (!list) { m = g_new0(Mount, 1); m->directory = g_strdup(dir); m->device = g_strdup(dev); m->type = g_strdup(type); mounts_list = g_list_append(mounts_list, m); mounts_list_modified = TRUE; serveflag_done_list = g_list_append(serveflag_done_list, &m->changed); for (i = 0; i < (sizeof(remote_fs_types) / sizeof(gchar *)); ++i) { if (!strcmp(m->type, remote_fs_types[i])) { m->is_nfs = TRUE; break; } } } m->is_mounted = TRUE; }voidgkrellm_fs_add_to_fstab_list(gchar *dir, gchar *dev, gchar *type, gchar *opt) { Mount *m; m = g_new0(Mount, 1); m->directory = g_strdup(dir); m->device = g_strdup(dev); m->type = g_strdup(type); fstab_list = g_list_append(fstab_list, m); }voidgkrellm_fs_assign_fsusage_data(gpointer pointer, glong blocks, glong bavail, glong bfree, glong bsize) { Mount *m = (Mount *) pointer; if ( m->blocks != blocks || m->bavail != bavail || m->bfree != bfree || m->bsize != bsize ) { m->blocks = blocks; m->bavail = bavail; m->bfree = bfree; m->bsize = bsize; m->changed = TRUE; } }voidgkrellm_fs_mounting_unsupported(void) { mounting_unsupported = TRUE; }static voidrefresh_mounts_list(void) { GList *list; Mount *m; for (list = mounts_list; list; list = list->next) ((Mount *) list->data)->is_mounted = FALSE; gkrellm_sys_fs_get_mounts_list(); for (list = mounts_list; list; ) { m = (Mount *) list->data; if (!m->is_mounted) { if (list == mounts_list) mounts_list = mounts_list->next; list = g_list_remove_link(list, list); g_free(m->directory); g_free(m->device); g_free(m->type); serveflag_done_list = g_list_remove(serveflag_done_list, &m->changed); if (m->busy) m->deleted = TRUE; else g_free(m); mounts_list_modified = TRUE; } else list = list->next; } }static voidrefresh_fstab_list(void) { Mount *m; while (fstab_list) { m = (Mount *) fstab_list->data; g_free(m->directory); g_free(m->device); g_free(m->type); g_free(m); fstab_list = g_list_remove(fstab_list, fstab_list->data); } gkrellm_sys_fs_get_fstab_list(); fstab_list_modified = TRUE; }#if GLIB_CHECK_VERSION(2,0,0)static gpointerget_fsusage_thread(void *data) { Mount *m = (Mount *) data; gkrellm_sys_fs_get_fsusage(m, m->directory); if (m->deleted) g_free(m); else { if (m->changed) fs_need_serve = TRUE; m->busy = FALSE; } return NULL; }#endifstatic voidupdate_fs(GkrellmdMonitor *mon, gboolean first_update) { GList *list; Mount *m; static gint check_tick; if (fs_need_serve) /* Asynchronous change in fsusage thread? */ gkrellmd_need_serve(mon); fs_need_serve = FALSE; if (GK.second_tick) ++check_tick; fs_check = !(check_tick % _GK.fs_interval); if (_GK.nfs_interval > 0) nfs_check = !(check_tick % _GK.nfs_interval); else nfs_check = 0; if (!first_update && (!GK.second_tick || (!fs_check && !nfs_check))) return; refresh_mounts_list(); for (list = mounts_list; list; list = list->next) { m = (Mount *) list->data; if (fs_check && !m->is_nfs) gkrellm_sys_fs_get_fsusage(m, m->directory); else if (nfs_check && m->is_nfs && !m->busy) {#if GLIB_CHECK_VERSION(2,0,0) m->busy = TRUE; g_thread_create(get_fsusage_thread, m, FALSE, NULL);#else gkrellm_sys_fs_get_fsusage(m, m->directory);#endif } } if (gkrellm_sys_fs_fstab_modified()) refresh_fstab_list(); gkrellmd_need_serve(mon); }static voidserve_fs_data(GkrellmdMonitor *mon, gboolean first_serve) { Mount *m; GList *list; gchar buf[128]; if (mounts_list_modified || first_serve) { gkrellmd_set_serve_name(mon, "fs_mounts"); gkrellmd_serve_data(mon, ".clear\n"); for (list = mounts_list; list; list = list->next) { m = (Mount *) list->data; snprintf(buf, sizeof(buf), "%s %s %s %ld %ld %ld %ld\n", m->directory, m->device, m->type, m->blocks, m->bavail, m->bfree, m->bsize); gkrellmd_serve_data(mon, buf); } } else { gkrellmd_set_serve_name(mon, "fs"); for (list = mounts_list; list; list = list->next) { m = (Mount *) list->data; if (!m->changed) continue; snprintf(buf, sizeof(buf), "%s %s %ld %ld %ld %ld\n", m->directory, m->device, m->blocks, m->bavail, m->bfree, m->bsize); gkrellmd_serve_data(mon, buf); } } if (fstab_list_modified || first_serve) { gkrellmd_set_serve_name(mon, "fs_fstab"); gkrellmd_serve_data(mon, ".clear\n"); for (list = fstab_list; list; list = list->next) { m = (Mount *) list->data; snprintf(buf, sizeof(buf), "%s %s %s\n", m->directory, m->device, m->type); gkrellmd_serve_data(mon, buf); } } }static voidserve_fs_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; if (mounting_unsupported) gkrellmd_send_to_client(client, "<fs_setup>\nmounting_unsupported\n"); }static GkrellmdMonitor fs_monitor = { "fs", update_fs, serve_fs_data, serve_fs_setup };static GkrellmdMonitor *init_fs_monitor(void) { if (!gkrellm_sys_fs_init()) return NULL; serveflag_done_list = g_list_append(serveflag_done_list, &fstab_list_modified); serveflag_done_list = g_list_append(serveflag_done_list, &mounts_list_modified); return &fs_monitor; }/* ======================================================= */typedef struct { gboolean changed, have_data; gint id; gboolean present, on_line, charging; gint percent; gint time_left; } Battery;static GList *battery_list;static Battery *composite_battery;static Battery *battery_nth(gint n) { Battery *bat; static gint n_batteries; if (n > 10) return NULL; if (n < 0) { if (!composite_battery) { bat = g_new0(Battery, 1); battery_list = g_list_prepend(battery_list, bat); bat->id = GKRELLM_BATTERY_COMPOSITE_ID; composite_battery = bat; serveflag_done_list = g_list_append(serveflag_done_list, &composite_battery->changed); } return composite_battery; } if (composite_battery) ++n; while ((bat = (Battery *)g_list_nth_data(battery_list, n)) == NULL) { bat = g_new0(Battery, 1); battery_list = g_list_append(battery_list, bat); bat->id = n_batteries++; serveflag_done_list = g_list_append(serveflag_done_list, &bat->changed); } return bat; }voidgkrellm_battery_assign_data(gint id, gboolean present, gboolean on_line, gboolean charging, gint percent, gint time_left) { Battery *bat; bat = battery_nth(id); if (!bat) return; if ( present != bat->present || on_line != bat->on_line || charging != bat->charging || percent != bat->percent || time_left != bat->time_left ) { bat->present = present; bat->on_line = on_line; bat->charging = charging; bat->percent = percent; bat->time_left = time_left; bat->changed = TRUE; } bat->have_data = TRUE; }gintgkrellm_battery_full_cap_fallback() { return 5000; /* XXX Linux ACPI bug not handled by server */ }static voidupdate_battery(GkrellmdMonitor *mon, gboolean first_update) { GList *list; Battery *bat; if (!first_update && !GK.five_second_tick) return; for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; bat->have_data = FALSE; bat->changed = FALSE; } gkrellm_sys_battery_read_data(); for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; if (!bat->have_data && bat->present) { bat->present = FALSE; bat->changed = TRUE; } if (bat->changed) gkrellmd_need_serve(mon); } }static voidserve_battery_data(GkrellmdMonitor *mon, gboolean first_serve) { Battery *bat; GList *list; gchar buf[128]; gkrellmd_set_serve_name(mon, "battery"); for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; if ( (!bat->changed && !first_serve) || ( !gkrellmd_check_client_version(mon, 2,1,9) && bat->id > 0 ) ) continue; snprintf(buf, sizeof(buf), "%d %d %d %d %d %d\n", bat->present, bat->on_line, bat->charging, bat->percent, bat->time_left, bat->id); gkrellmd_serve_data(mon, buf); } }static voidserve_battery_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; gkrellm_sys_battery_read_data(); if (battery_list) gkrellmd_send_to_client(client, "<battery_setup>\nbattery_available\n"); }static GkrellmdMonitor battery_monitor = { "battery", update_battery, serve_battery_data, serve_battery_setup };static GkrellmdMonitor *init_battery_monitor(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -