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

📄 multithreadingsampleprovider.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================//// Author: Subodh Soni IBM Corporation, (ssubodh@in.ibm.com)//// Modified By://             //             ////%////////////////////////////////////////////////////////////////////////////#include <stdio.h>#include <iostream>#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include "MultithreadingSampleProvider.h"#include <Pegasus/Common/Config.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Common/CIMDateTime.h>#include <Pegasus/Common/InternalException.h>#define NO_OF_INSTANCES	5PEGASUS_NAMESPACE_BEGINPEGASUS_USING_STD;void writer (const char* message, int count, FILE* stream){ 		for (; count > 0; --count) {		// Write the message to the stream, and send it off immediately.			fprintf (stream,"%s\n" , message);			fflush (stream);		// Sleeping for a long time in the writer thread so as to get a timeout		// when CLI is executed from inside the reader thread		sleep (100);		}}void reader (FILE* stream){	char buffer[1024];	// Read until we hit the end of the stream. fgets reads until either	// a newline or the end-of-file.	while (!feof(stream) 		&& !ferror(stream) 		&& fgets(buffer, sizeof(buffer), stream) != NULL)		fputs (buffer, stdout);}int CreateThreads(){ 	char* arg_list[] = {			"CLI",			"niall",			"-n",			"root/SampleProvider",			NULL	};	int fds[2];	pid_t cpid;	pipe(fds);	cpid = fork();	if (cpid == (pid_t)0)	{ 		FILE* stream; 		// This is the child process. Close our copy of the write end		// of the file descriptor.		close(fds[1]);		// Connect the read end of the pipe to standard input.		dup2(fds[0], STDIN_FILENO);		// Convert the read file descriptor to a FILE object, and read from it		stream = fdopen(fds[0],"r" );		reader(stream);		close(fds[0]);		// Replace the child process with the CLI program 		execvp ("CLI", arg_list);	}	else	{		FILE* stream;		// Close our copy of the read end of the file descriptor.		close (fds[0]);		// Convert the write file descriptor to a FILE object,and write to it.		stream = fdopen(fds[1],"w" );				writer("Test Writer from Parent process\n", 2, stream);		close (fds[1]);		// Wait for child process to finish		waitpid(cpid, NULL, 0);	}	return 0;}MultithreadingSampleProvider::MultithreadingSampleProvider(void){}MultithreadingSampleProvider::~MultithreadingSampleProvider(void){}void MultithreadingSampleProvider::initialize(CIMOMHandle & cimom){    cout <<" MultithreadingSampleProvider::initialize" << endl;}void MultithreadingSampleProvider::terminate(void){    cout <<" MultithreadingSampleProvider::terminate" << endl;}void MultithreadingSampleProvider::getInstance(	const OperationContext & context,	const CIMObjectPath & instanceReference,	const Boolean includeQualifiers,	const Boolean includeClassOrigin,	const CIMPropertyList & propertyList,	InstanceResponseHandler & handler){	CIMObjectPath localReference = CIMObjectPath(		String(), 		String(),		instanceReference.getClassName(),        instanceReference.getKeyBindings());	CIMName className = instanceReference.getClassName();	cout << "className (Method: getInstance) " << className.getString() << endl;    CIMNamespaceName nameSpace = instanceReference.getNameSpace();    cout << "[className: " << className.getString()<< "], [in namespace: " << nameSpace.getString() << 			"] " << endl;	// instance index corresponds to reference index	for(Uint32 i = 0, n = _instances.size(); i < n; i++)    {        if(localReference == _instanceNames[i])	        {		    // deliver requested instance		    handler.deliver(_instances[i]);		    break;	        }	    }	// complete processing the request	handler.complete();}void MultithreadingSampleProvider::enumerateInstanceNames(	const OperationContext & context,	const CIMObjectPath & classReference,	ObjectPathResponseHandler & handler){	cout << "MultithreadingSampleProvider::enumerateInstancesNames" << endl;		// begin processing the request	handler.processing();	    for(Uint32 i = 0, n = _instances.size(); i < n; i++)    // deliver instance    	handler.deliver(_instanceNames[i]);	// complete processing the request	handler.complete();}void MultithreadingSampleProvider::enumerateInstances(	const OperationContext & context,	const CIMObjectPath & classReference,	const Boolean includeQualifiers,	const Boolean includeClassOrigin,	const CIMPropertyList & propertyList,	InstanceResponseHandler & handler){	int retval;	char buffer[NO_OF_INSTANCES];	CIMInstance Instances[NO_OF_INSTANCES];	CIMObjectPath References[NO_OF_INSTANCES];	cout << "MultithreadingSampleProvider::enumerateInstances" << endl;		cout << "_instances.size = " << _instances.size() << endl;		// begin processing the request	handler.processing();	CIMName clName = classReference.getClassName();	String className = clName.getString();	cout << "className = " << className<< endl;	for (Uint32 i = 0; i < NO_OF_INSTANCES; i++)    {    	sprintf(buffer, "%d", i);	    Instances[i] = CIMInstance("ThreadSampleOne");    	References[i] = CIMObjectPath("ThreadSampleOne.Id="+String(buffer));	    Instances[i].addProperty(CIMProperty("Id", Uint16(i)));		Instances[i].addProperty(CIMProperty("Message", String(buffer)));	_instances.append(Instances[i]);    _instanceNames.append(References[i]);	}	retval = CreateThreads();	cout << "Return from CreateThreads" << retval << endl;	for(Uint32 i = 0, n = NO_OF_INSTANCES; i < n; i++)	// deliver reference		handler.deliver(_instances[i]);	// complete processing the request	handler.complete();}void MultithreadingSampleProvider::modifyInstance(	const OperationContext & context,	const CIMObjectPath & instanceReference,	const CIMInstance & instanceObject,	const Boolean includeQualifiers,	const CIMPropertyList & propertyList,	ResponseHandler & handler){	cout << "MultithreadingSampleProvider::modifyInstance" << endl;		// convert a potential fully qualified reference into a local reference	// (class name and keys only).	CIMObjectPath localReference = CIMObjectPath(		String(),		String(),		instanceReference.getClassName(),		instanceReference.getKeyBindings());	// begin processing the request	handler.processing();	// instance index corresponds to reference index	for(Uint32 i = 0, n = _instances.size(); i < n; i++)	{		if(localReference == _instanceNames[i])		{			// overwrite existing instance			_instances[i] = instanceObject;			break;		}	}	// complete processing the request	handler.complete();}void MultithreadingSampleProvider::createInstance(	const OperationContext & context,	const CIMObjectPath & instanceReference,	const CIMInstance & instanceObject,	ObjectPathResponseHandler & handler){	cout << "MultithreadingSampleProvider::createInstance" << endl;		// convert a potential fully qualified reference into a local reference	// (class name and keys only).	CIMObjectPath localReference = CIMObjectPath(		String(),		String(),		instanceReference.getClassName(),		instanceReference.getKeyBindings());	// instance index corresponds to reference index	for(Uint32 i = 0, n = _instanceNames.size(); i < n; i++)	{		if(localReference == _instanceNames[i])		{			throw CIMObjectAlreadyExistsException(                                  localReference.toString());		}	}	// begin processing the request	handler.processing();	// add the new instance to the array	_instances.append(instanceObject);	_instanceNames.append(instanceReference);	// deliver the new instance	handler.deliver(_instanceNames[_instanceNames.size() - 1]);	// complete processing the request	handler.complete();}void MultithreadingSampleProvider::deleteInstance(	const OperationContext & context,	const CIMObjectPath & instanceReference,	ResponseHandler & handler){	cout << "MultithreadingSampleProvider::deleteInstance" << endl;		// convert a potential fully qualified reference into a local reference	// (class name and keys only).	CIMObjectPath localReference = CIMObjectPath(		String(),		String(),		instanceReference.getClassName(),		instanceReference.getKeyBindings());	// begin processing the request	handler.processing();	// instance index corresponds to reference index	for(Uint32 i = 0, n = _instances.size(); i < n; i++)	{		if(localReference == _instanceNames[i])		{			// save the instance locally			CIMInstance cimInstance(_instances[i]);			// remove instance from the array			_instances.remove(i);			_instanceNames.remove(i);			// exit loop			break;		}	}	// complete processing the request	handler.complete();}PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -