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

📄 tm1if_pc.c

📁 PNX系列设备驱动 PNX系列设备驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *  COPYRIGHT (c) 1995 by Philips Semiconductors
 *
 *   +-----------------------------------------------------------------+
 *   | THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED |
 *   | AND COPIED IN ACCORDANCE WITH THE TERMS AND CONDITIONS OF SUCH  |
 *   | A LICENSE AND WITH THE INCLUSION OF THE THIS COPY RIGHT NOTICE. |
 *   | THIS SOFTWARE OR ANY OTHER COPIES OF THIS SOFTWARE MAY NOT BE   |
 *   | PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. THE   |
 *   | OWNERSHIP AND TITLE OF THIS SOFTWARE IS NOT TRANSFERRED.        |
 *   +-----------------------------------------------------------------+
 *
 *  Module name              : TM1IF_pc.c    1.7
 *
 *  Last update              : 11:04:54 - 99/03/29
 *
 *  Title                    : PC version of HostCall server, PC part
 *
 *  Reviewed                 : 
 *
 *  Revision history         : 
 *
 *  Description              :  
 *
 *            This module is part of an implementation of the server part  
 *            for a HostCall interface. HostCall is the software component 
 *            which is required by the TCS toolset to adapt the programs 
 *            generated by this toolset to a specific host (see file 
 *            HostCall.h in the TCS include dir).
 *
 *            HostIF is the part of the implementation which runs on the
 *            host, serving all IO requests of the TM-1 application. 
 *            HostIF is one of two modules of this host-resident part, and
 *            defines all host specific issues which are communication
 *            with the target and the ability to start a number of server
 *            tasks. The other part, RPCClient, defines *how* messages 
 *            should be served; RPCClient it still is host independent.
 *
 *            RPCServ is the counterpart of RPCClient on the target, and
 *            TM1IF is the counterpart of HostIF on the target. However,
 *            contrary to the target situation, where RPCClient is built
 *            on top of HostIF, on the host side TM1IF is built on top of
 *            RPCServ. Hence TM1IF forms the external interface of the 
 *            server pair.
 *
 *            The interface to this module is as follows: First, it should
 *            be initialised. Second, a number of nodes should be defined, 
 *            specifying node specific information. 
 *            After this, the nodes can be started and a communication
 *            session with these nodes can be started by means of function
 *            TM1IF_start_serving; depending on the implementation, a call
 *            to this function either immediately returns, with a number
 *            of serving tasks created for handling target's IO requests,
 *            or it blocks until function TM1IF_term is called (typically
 *            by the exit handler, when the last node has reported termination).
 *
 *            Having a pool of servers reduces the possibility that serving
 *            is halted due to serving requests which take a longer 
 *            time to complete. For instance, when running pSOS on the 
 *            target with one task requesting keyboard input from the host, 
 *            the current implementation of RPCClient will stop serving 
 *            requests when only one server task is selected: while blocked 
 *            on the keyboard, it will not be able to serve requests from 
 *            other pSOS tasks. 
 *            The current host (with the OS used) might or might not be
 *            able to dispatch multiple tasks, so start_serving returns
 *            one of the following results:
 *                - TM1IF_Serving_Failed
 *                           Initialisation (e.g. setup of target
 *                           communication, or server task creation) 
 *                           failed.
 *                - TM1IF_Serving_Started
 *                           The servers have been created, and
 *                           are now busy serving.
 *                           Serving should be stopped using the
 *                           TM1IF_term function.
 *                - TM1IF_Serving_Completed
 *                           TM1IF was not capable of creating independent 
 *                           serving tasks, so the TM-1 application
 *                           has been entirely served during the call
 *                           to start_serving.
 *           
 *            NB: This interface does not provide for loading and
 *                starting the TM1 appication. 
 *
 *            This module forms a Windows 95 implementation of
 *            the TM1IF interface. It is capable of creating multiple
 *            server tasks. The communication is implemented on top of
 *            the Trimedia Manager interface, of which it reserves 
 *            Channel #1.
 */

/*---------------------------- Includes --------------------------------------*/

#include <windows.h>
#include <winioctl.h>
#include <time.h>
#include <sys/timeb.h>
#include <signal.h>


#include <stdarg.h>
#include <assert.h>
#include <math.h>
#include <string.h>
#include <setjmp.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>


#include "tmtypes.h"
#include "tmmanerr.h"
#include "tmmanapi.h"
#include "HostCall.h"
#include "RPC_Common.h"
#include "TM1IF.h"
#include "io.h"
#include "Lib_Local.h"

/*---------------------------- Module State ----------------------------------*/


#define NROF_SERVERS      4


/*
 * Various global state:
 */
static Int32    nrof_created_servers;
static HANDLE  *created_servers;

static Bool     same_endian;

static HANDLE   MessageSynchHandle;


typedef struct {
    DWORD     dsp_number;
    DWORD     dsp_handle;
    DWORD     hostcall_channel;
    Bool      valid;
} NodeData;


static NodeData *nodedata;
static Int       nrof_dsps;


/*--------------------------- Exported Functions -----------------------------*/


    static Bool serving_stopped;


    static void 
    serve()
    {
	int         i;
	while (!serving_stopped) {
		tmmanPacket Packet;

		WaitForSingleObject(MessageSynchHandle, INFINITE);

		for (i = 0; i < nrof_dsps; i++) {
			if (serving_stopped) {

				/*
				 * Pass termination event:
				 */
				SetEvent(MessageSynchHandle);
				return;
			}
			else if (nodedata[i].valid
				 && tmmanMessageReceive(nodedata[i].hostcall_channel, &Packet) == statusSuccess
				) {
				Pointer     raw_command;
				HostCall_command *command;

				/*
				 * Let next task check for next message:
				 */
				SetEvent(MessageSynchHandle);

				raw_command = Packet.Argument[0];
				command = RPCServ_raw_to_host(raw_command);

				command->notification_status = HostCall_BUSY;

				if (RPCServ_serve(raw_command)) {
					tmmanMessageSend(nodedata[i].hostcall_channel, &Packet);
				}
			}
		}
	}
    }


/*
 * Function         : Start serving the (independently started)
 *                    TM-1 application. Serving should use the specified
 *                    IO functions, and use the specified file descriptors
 *                    for stdin, stdout and stderr. It should try to 
 *                    start the requested number of serving tasks and return,
 *                    but when there are no capabilities for starting 
 *                    tasks this function itself can act as server before
 *                    it returns.
 * Function Result  : see module header
 * Precondition     : -
 * Postcondition    : -
 * Sideeffects      : -
 */

TM1IF_Served_Status
        TM1IF_start_serving( )
{
    Int32 i;

    nrof_created_servers = 0;
    created_servers      = malloc( NROF_SERVERS * sizeof(HANDLE) );

    if (created_servers == NULL) {
	return TM1IF_Serving_Failed;
    }

    for (i=1; i <= NROF_SERVERS; i++) {
	HANDLE dummy;
	HANDLE new_thread;

	new_thread= CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)serve, 0, 0, (LPDWORD)&dummy );

	if (new_thread != NULL) {
	    created_servers[nrof_created_servers++]= new_thread;
	}
    }

    if (nrof_created_servers > 0) {
	return TM1IF_Serving_Started;
    } else {
	return TM1IF_Serving_Failed;
    } 
}




/*
 * Function         : Initialise this module, and make the
 *                    I/O callback functions known to it.
 * Parameters       : open .. exit        (I) IO functions.
 *                    endian              (I) node's endianness
 * Function Result  : True iff initialisation succeeded
 */

Bool TM1IF_init(
	RPCServ_OpenFunc    open,
	RPCServ_OpenDllFunc open_dll,
	RPCServ_CloseFunc   close,
	RPCServ_ReadFunc    read,
	RPCServ_WriteFunc   write,

⌨️ 快捷键说明

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