⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 4 页
字号:
				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 + -