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

📄 tmtask.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 
	taskmCreateTask

	Since the task opening happens in different phases it has to be 
	implemented as a finite state machine, that changes state every time there
	is a callback from the DSP. 
*/
STATUS	taskmCreateTask ( PVOID	pObject, PVOID TaskCreateArg, PDWORD Handle )
{
	PTMTASK_MGR_OBJECT	this	=  ( PTMTASK_MGR_OBJECT )pObject;
	PTMTASK_OBJECT		pTask;
	PTMIF_STRUCT_TASKCREATE		TaskCreate = 
		(PTMIF_STRUCT_TASKCREATE)TaskCreateArg;
	TMSTD_PACKET		Packet;
	DWORD				IdxTask;
	STATUS				Status;

	// find the task object

	pTask = NULL;

	if ( this->AllocatedCount >= this->TaskCount )
	{
		Status = TM_STATUS(TMTASK_ERR_OUTOFTASKS);
		goto	taskmCreateTask_fail1;
	}

	for ( IdxTask = 0 ; IdxTask < this->TaskCount ; IdxTask ++ )
	{
		if ( ! this->pTaskTab[IdxTask] )
		{
			break;
		}
	}

	if ( ( pTask = vxdMalloc ( sizeof ( TMTASK_OBJECT ) ) ) == NULL )
	{
		Status  = TM_STATUS ( TMTASK_ERR_OBJALLOCFAIL );
		goto	taskmCreateTask_fail2;
	}

	this->pTaskTab[IdxTask] = (PVOID)pTask;
	this->AllocatedCount++;
	FlagSet ( pTask->Flags, TMTASK_TASK_FLAG_ALLOCATED );
	pTask->Size = sizeof (TMTASK_OBJECT);
	pTask->pContainer = this->pContainer;
	pTask->Idx = IdxTask;

	pTask->dwPriority = TaskCreate->dwPriority;
	pTask->dwStackSize = TaskCreate->dwStackSize;
	vxdStrCopy ( TaskCreate->szTaskFile, pTask->szTaskFile );
	pTask->ClientHandle = TaskCreate->ClientHandle;
	pTask->Callback 	= TaskCreate->dwCallback;
	pTask->pContext 	= TaskCreate->pvContext;

	/* no requests pending in the queue so dump the request directly */
	Packet.dwCommand = TMHD_TASK_CREATE;
	Packet.dwArgument[TMHD_TASK_ARGHOSTTASK] = (DWORD)pTask;

	if ( this->fRequestInService )
	{
		if ( cqueueInsert ( this->pTaskRequestQ , &Packet ) != TRUE )
		{
			Status  = TM_STATUS ( TMTASK_ERR_QINSERTFAIL );
			goto	taskmCreateTask_fail3;
		}
	}
	else
	{
		this->pSharedData->dwPriority = pTask->dwPriority;
		this->pSharedData->dwStackSize = pTask->dwStackSize;
		vxdStrCopy ( pTask->szTaskFile, this->pSharedData->szTaskFile );
	
		if ( ( Status = chnlPacketSend ( this->pSysChnlSend, &Packet ) ) != TMOK )
		{
			Status  = TM_STATUS ( TMTASK_ERR_CHNLSENDFAIL );
			goto	taskmCreateTask_fail3;
		}
		else
		{
			this->fRequestInService = TRUE;
		}
	}

	*Handle = (DWORD)pTask;
	return TMOK;

taskmCreateTask_fail3:
	vxdFree( pTask );

taskmCreateTask_fail2:
	FlagClr ( pTask->Flags, TMTASK_TASK_FLAG_ALLOCATED );

taskmCreateTask_fail1:
	return Status;
}

STATUS	taskStart ( DWORD dwHandle )
{
	PTMTASK_OBJECT		this = ( PTMTASK_OBJECT) dwHandle;
	TMSTD_PACKET		Packet;
	STATUS				Status = TMOK;
	PTMTASK_MGR_OBJECT	pTaskMgr	=  GetTaskMgrObject ( this->pContainer );

	if ( ( Status = taskValidateHandle ( this ) ) != TMOK )
	{
		return Status;
	}

	Packet.dwCommand = TMHD_TASK_START;
	Packet.dwArgument[TMHD_TASK_ARGHOSTTASK] = (DWORD)this;
	Packet.dwArgument[TMHD_TASK_ARGDSPTASK]	= this->dwDSPTaskHandle;

	// queue up the request if there is already one in service
	if ( pTaskMgr->fRequestInService )
	{
		if ( cqueueInsert ( pTaskMgr->pTaskRequestQ , &Packet ) != TRUE )
		{
			Status  = TM_STATUS ( TMTASK_ERR_QINSERTFAIL );
			goto	taskStartExit1;
		}
	}
	else
	{
		if ( ( Status = chnlPacketSend ( pTaskMgr->pSysChnlSend, &Packet ) ) != TMOK )
		{
			goto	taskStartExit1;
		}
		else
		{
			pTaskMgr->fRequestInService = TRUE;
		}
	}
taskStartExit1:
	return  Status;
}

STATUS	taskStop ( DWORD dwHandle )
{
	PTMTASK_OBJECT		this = ( PTMTASK_OBJECT) dwHandle;
	TMSTD_PACKET		Packet;
	STATUS				Status = TMOK;
	PTMTASK_MGR_OBJECT	pTaskMgr	=  GetTaskMgrObject ( this->pContainer );

	if ( ( Status = taskValidateHandle ( this ) ) != TMOK )
	{
		return Status;
	}

	Packet.dwCommand = TMHD_TASK_STOP;
	Packet.dwArgument[TMHD_TASK_ARGHOSTTASK] = (DWORD)this;
	Packet.dwArgument[TMHD_TASK_ARGDSPTASK]	= this->dwDSPTaskHandle;

	if ( pTaskMgr->fRequestInService )
	{
		if ( cqueueInsert ( pTaskMgr->pTaskRequestQ , &Packet ) != TRUE )
		{
			Status  = TM_STATUS ( TMTASK_ERR_QINSERTFAIL );
			goto	taskStopExit1;
		}
	}
	else
	{
		if ( ( Status = chnlPacketSend ( pTaskMgr->pSysChnlSend,
			&Packet ) ) != TMOK )
		{
			goto	taskStopExit1;
		}
		else
		{
			pTaskMgr->fRequestInService = TRUE;
		}
	}

taskStopExit1:
	return  Status;
}

STATUS	taskSignal ( DWORD dwHandle, DWORD State )
{
	PTMTASK_OBJECT		this = ( PTMTASK_OBJECT) dwHandle;
	TMSTD_PACKET		Packet;
	STATUS				Status = TMOK;
	PTMTASK_MGR_OBJECT	pTaskMgr	=  GetTaskMgrObject ( this->pContainer );

	if ( ( Status = taskValidateHandle ( this ) ) != TMOK )
	{
		return Status;
	}

	Packet.dwCommand = TMHD_TASK_SIGNAL;
	Packet.dwArgument[TMHD_TASK_ARGHOSTTASK] = (DWORD)this;
	Packet.dwArgument[TMHD_TASK_ARGDSPTASK]	= this->dwDSPTaskHandle;
	Packet.dwArgument[TMHD_TASK_ARGSTATUS]	= State;

	if ( pTaskMgr->fRequestInService )
	{
		if ( cqueueInsert ( pTaskMgr->pTaskRequestQ , &Packet ) != TRUE )
		{
			Status  = TM_STATUS ( TMTASK_ERR_QINSERTFAIL );
			goto	taskSignalExit1;
		}
	}
	else
	{
		if ( ( Status = chnlPacketSend ( pTaskMgr->pSysChnlSend,
			&Packet ) ) != TMOK )
		{
			goto	taskSignalExit1;
		}
		else
		{
			pTaskMgr->fRequestInService = TRUE;
		}
	}

taskSignalExit1:
	return  Status;
}

STATUS	taskDestroy ( DWORD dwHandle )
{
	PTMTASK_OBJECT		this = ( PTMTASK_OBJECT) dwHandle;
	TMSTD_PACKET		Packet;
	STATUS				Status = TMOK;
	PTMTASK_MGR_OBJECT	pTaskMgr	=  GetTaskMgrObject ( this->pContainer );

	if ( ( Status = taskValidateHandle ( this ) ) != TMOK )
	{
		return Status;
	}

	Packet.dwCommand = TMHD_TASK_DESTROY;
	Packet.dwArgument[TMHD_TASK_ARGHOSTTASK] = (DWORD)this;
	Packet.dwArgument[TMHD_TASK_ARGDSPTASK]	= this->dwDSPTaskHandle;

	if ( pTaskMgr->fRequestInService )
	{
		if ( cqueueInsert ( pTaskMgr->pTaskRequestQ , &Packet ) != TRUE )
		{
			Status  = TM_STATUS ( TMTASK_ERR_QINSERTFAIL );
			goto	taskDestroyExit1;
		}
	}
	else
	{
		if ( ( Status = chnlPacketSend ( pTaskMgr->pSysChnlSend, &Packet ) ) != TMOK )
		{
			goto	taskDestroyExit1;
		}
		else
		{
			pTaskMgr->fRequestInService = TRUE;
		}
	}


taskDestroyExit1:
	return Status;
}

STATUS	taskmDestroy ( PVOID pTaskMgr )
{
	PTMTASK_MGR_OBJECT	this = (PTMTASK_MGR_OBJECT)pTaskMgr;
	
	this->Size = 0;
	this->Flags = 0;
	chnlDestroy ( this->pSysChnlSend );
	chnlDestroy ( this->pSysChnlRecv );
	vxdFree ( this->pTaskTab );
	vxdFree ( this );
	return TMOK;
}


STATUS	taskmDestroyTaskByClnt  ( PVOID pObject, DWORD dwClientHandle )
{
	PTMTASK_MGR_OBJECT	this	=  ( PTMTASK_MGR_OBJECT )pObject;
	PTMTASK_OBJECT		pTask; 

	DWORD	IdxTask;

	for ( IdxTask = 0 ; IdxTask < this->TaskCount ; IdxTask ++ )
	{
		pTask = this->pTaskTab[IdxTask];

		if ( ! pTask )
			continue;

		if ( ! FlagGet ( pTask->Flags, 
			TMTASK_TASK_FLAG_ALLOCATED ) )
			continue;

		if ( pTask->ClientHandle != dwClientHandle )
			continue; 

		taskDestroy ( (DWORD)pTask );
	}
	
	return TMOK;

}

STATUS	taskValidateHandle ( PVOID  TaskObject )
{
	PTMTASK_OBJECT this = (PTMTASK_OBJECT)TaskObject;

	if ( ! TaskObject )
		goto taskValidateHandle_fail;

	if ( this->Size != sizeof(TMTASK_OBJECT) )
		goto taskValidateHandle_fail;

	if ( ! FlagGet ( this->Flags, TMTASK_TASK_FLAG_ALLOCATED ) )
		goto taskValidateHandle_fail;

	return TMOK;

taskValidateHandle_fail :
	DP(0,"TM:taskValidateHandle:Task[%x]:FAIL\n",TaskObject);
	return TMTASK_ERR_INVALIDHANDLE;
}

⌨️ 快捷键说明

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