view driver/procfs/processes.c @ 0:42f240cc4bc6

From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Sep 2009 13:44:18 +0900
parents
children
line wrap: on
line source

/**
 * processes.c
 * SPE プロセスマネージャ spe_manager
 * procfs エントリ "processes" のハンドラ
 */

#include <linux/module.h>      // カーネルモジュール全般
#include <linux/kernel.h>      // printk
#include <linux/semaphore.h>   // down_interruptible, up
#include <linux/spinlock.h>    // spin_lock, spin_unlock

#include "../main.h"
#include "../critical.h"
#include "../process_list.h"
#include "processes.h"



//============================================================================================== procfs_processes_read()
/**
 * procfs_processes_read
 * procfs エントリ "processes" の read イベントハンドラ
 *
 * @param  char *   page
 * @param  char **  start
 * @param  off_t    off
 * @param  int      count
 * @param  int *    eof
 * @param  void *   data
 * @return int
 */
int procfs_processes_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
	int               opened, written, waiting, running, not_released, released;
	struct semaphore *semaphore_for_process_list = get_semaphore_for_process_list();
	spinlock_t       *spinlock_for_process_list  = get_spinlock_for_process_list();


//	Critical Section (semaphore) >>>
	if (down_interruptible(semaphore_for_process_list))
		goto procfs_processes_read__error1;

		// 各 SPE プロセス状態のプロセス数を取得 (セマフォをロックするだけで取得可能なもの)
		opened   = get_process_count_opened();
		written  = get_process_count_written();
		released = get_process_count_released();

//		Critical Section (spinlock) >>>
		spin_lock(spinlock_for_process_list);
		{
			// 各 SPE プロセス状態のプロセス数を取得 (スピンロックも行わないと取得できないもの)
			waiting      = get_process_count_waiting();
			running      = get_process_count_running();
			not_released = get_process_count_not_released();
		}
		spin_unlock(spinlock_for_process_list);
//		<<< Critical Section (spinlock)

	up(semaphore_for_process_list);
//	<<< Critical Section (semaphore)


	// プロセス数情報を出力する
	*eof = 1;
	return sprintf (
		page,
		"               Processes \n"
		"-------------------------\n"
		" Opened        %9d\n"
		" Written       %9d\n"
		" Waiting       %9d\n"
		" Running       %9d\n"
		" Not Released  %9d\n"
		" Released      %9d\n"
		"-------------------------\n"
		" Total         %9d\n",
		opened, written, waiting, running, not_released, released,
		opened + written + waiting + running + not_released + released   // Total
	);


procfs_processes_read__error1:
	return -ERESTARTSYS;
}