示例#1
0
int CreatePerProcessProcEntry(const char *name, read_proc_t rhandler,
			      write_proc_t whandler, void *data)
{
	struct PVRSRV_ENV_PER_PROCESS_DATA *psPerProc;
	u32 ui32PID;

	if (!dir) {
		PVR_DPF(PVR_DBG_ERROR,
			 "CreatePerProcessProcEntries: /proc/%s doesn't exist",
			 PVRProcDirRoot);

		return -ENOMEM;
	}

	ui32PID = OSGetCurrentProcessIDKM();

	psPerProc = PVRSRVPerProcessPrivateData(ui32PID);
	if (!psPerProc) {
		PVR_DPF(PVR_DBG_ERROR,
			 "CreatePerProcessProcEntries: no per process data");

		return -ENOMEM;
	}

	if (!psPerProc->psProcDir) {
		char dirname[16];
		int ret;

		ret = snprintf(dirname, sizeof(dirname), "%u", ui32PID);

		if (ret <= 0 || ret >= sizeof(dirname)) {
			PVR_DPF(PVR_DBG_ERROR, "CreatePerProcessProcEntries: "
					"couldn't generate per process proc "
					"directory name \"%u\"",
					 ui32PID);

			return -ENOMEM;
		} else {
			psPerProc->psProcDir = proc_mkdir(dirname, dir);
			if (!psPerProc->psProcDir) {
				PVR_DPF(PVR_DBG_ERROR,
					"CreatePerProcessProcEntries: "
					"couldn't create per process proc "
					"directory /proc/%s/%u",
					 PVRProcDirRoot, ui32PID);

				return -ENOMEM;
			}
		}
	}

	return CreateProcEntryInDir(psPerProc->psProcDir, name, rhandler,
				    whandler, data);
}
IMG_HANDLE LinuxTerminatingProcessPrivateData(IMG_VOID)
{
	if(!gui32ReleasePID)
		return NULL;
	return PVRSRVPerProcessPrivateData(gui32ReleasePID);
}