www.pudn.com > vxWorks_Lab.rar > pipeServer.c


/* pipeServer.c - reads requests over pipe */ 
 
#include "vxWorks.h" 
#include "pipeDrv.h" 
#include "taskLib.h" 
#include "ioLib.h" 
 
 
typedef struct 
	{ 
	VOIDFUNCPTR routine; 
	int arg; 
	} MSG_REQUEST; 
 
 
#define TASK_PRI	254		/* server priority */ 
#define TASK_STACK	20000	/* server stack space */ 
#define PIPE_NAME	"/pipe/server" 
#define NUM_MSGS	10 
 
int pipeFd; 
 
LOCAL void pipeServer (); 
 
/************************************************** 
* serverStart -- Initializes a server task to 
* execute functons at a low priority. Uses pipes as 
* the communication mechanism. 
* 
* RETURNS: OK or ERROR on failure. 
*/ 
 
STATUS serverStart (void) 
	{ 
 
	/* Create the pipe device */ 
 
	if (pipeDevCreate (PIPE_NAME, NUM_MSGS, sizeof (MSG_REQUEST)) == ERROR) 
		return (ERROR); 
	 
	/* Open the pipe */ 
 
	if ((pipeFd = open (PIPE_NAME, UPDATE, 0)) == ERROR) 
		return (ERROR); 
 
	/* Spawn the server task */ 
 
	if (taskSpawn ("tServer", TASK_PRI, 0, TASK_STACK,(FUNCPTR)pipeServer, 
						0,0,0,0,0,0,0,0,0,0) == ERROR) 
		{ 
		close (pipeFd); 
		return (ERROR); 
		} 
	 
	return (OK); 
	} 
 
/************************************************** 
* serverSend -- Sends a request to the server to 
* execute a function at the server's priority. 
* 
* RETURNS: OK or ERROR on failure. 
*/ 
 
STATUS serverSend  
	( 
	VOIDFUNCPTR routine, 
	int arg 
	) 
	{ 
	MSG_REQUEST msgRequest; 
	int status; 
 
	/* Initialize the message structure */ 
 
	msgRequest.routine = routine; 
	msgRequest.arg = arg; 
 
	/* Send the message and return the results */ 
 
	status = write (pipeFd, (char *)&msgRequest, sizeof (MSG_REQUEST)); 
 
	return ((status == sizeof (MSG_REQUEST)) ? 
				OK : ERROR); 
	} 
 
/************************************************** 
* pipeServer -- Server task which reads from a pipe 
* and executes the function passed in the 
* MSG_REQUEST data structure. 
* 
*/ 
 
LOCAL void pipeServer (void) 
	{ 
	MSG_REQUEST msgRequest; 
 
	while (read (pipeFd, (char *)&msgRequest, sizeof (MSG_REQUEST)) > 0) 
		(*msgRequest.routine) (msgRequest.arg); 
	}