您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ AVB_TRACE_ENTRY函数代码示例

51自学网 2021-06-01 19:38:46
  C++
这篇教程C++ AVB_TRACE_ENTRY函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中AVB_TRACE_ENTRY函数的典型用法代码示例。如果您正苦于以下问题:C++ AVB_TRACE_ENTRY函数的具体用法?C++ AVB_TRACE_ENTRY怎么用?C++ AVB_TRACE_ENTRY使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了AVB_TRACE_ENTRY函数的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: TLHandleListGet

// This is currently only for used for Endpointtl_handle_t TLHandleListGet(int endpointHandle){	AVB_TRACE_ENTRY(AVB_TRACE_TL);	if (!endpointHandle || !gTLHandleList) {		AVB_TRACE_EXIT(AVB_TRACE_TL);		return NULL;	}	TL_LOCK();	int i1;	for (i1 = 0; i1 < gMaxTL; i1++) {		if (gTLHandleList[i1]) {			tl_state_t *pTLState = (tl_state_t *)gTLHandleList[i1];			if (pTLState->endpointHandle == endpointHandle) {				TL_UNLOCK();				AVB_TRACE_EXIT(AVB_TRACE_TL);				return pTLState;			}		}	}	TL_UNLOCK();	AVB_TRACE_EXIT(AVB_TRACE_TL);	return NULL;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:26,


示例2: openavbTLAVDECCRunTalker

bool openavbTLAVDECCRunTalker(tl_handle_t handle, U16 configIdx, U16 descriptorType, U16 descriptorIdx, void *pVoidTalkerStreamInfo){	AVB_TRACE_ENTRY(AVB_TRACE_TL);	if (!handle) {		AVB_LOG_ERROR("Invalid handle.");		AVB_TRACE_EXIT(AVB_TRACE_TL);		return FALSE;	}	tl_state_t *pTLState = (tl_state_t *)handle;	if (pTLState->cfg.intf_cb.intf_avdecc_init_cb) {		pTLState->cfg.intf_cb.intf_avdecc_init_cb(pTLState->pMediaQ, configIdx, descriptorType, descriptorIdx);	}	if (pTLState->cfg.map_cb.map_avdecc_init_cb) {		pTLState->cfg.map_cb.map_avdecc_init_cb(pTLState->pMediaQ, configIdx, descriptorType, descriptorIdx);	}	if (!openavbTLIsRunning(handle)) {		openavbTLRun(handle);	}	AVB_TRACE_EXIT(AVB_TRACE_TL);	return TRUE;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:26,


示例3: openavbTLThreadFn

/* Talker Listener thread function that talks primarily with the endpoint */void* openavbTLThreadFn(void *pv){	AVB_TRACE_ENTRY(AVB_TRACE_TL);	tl_state_t *pTLState = (tl_state_t *)pv;	while (pTLState->bRunning) {		AVB_TRACE_LINE(AVB_TRACE_TL_DETAIL);		int endpointHandle = openavbEptClntOpenSrvrConnection(pTLState);		if (endpointHandle == AVB_ENDPOINT_HANDLE_INVALID) {			// error connecting to endpoint, already logged		}		else {			pTLState->endpointHandle = endpointHandle;			// Validate the AVB version for TL and Endpoint are the same before continuing			pTLState->AVBVerState = OPENAVB_TL_AVB_VER_UNKNOWN;			pTLState->bConnected = openavbEptClntRequestVersionFromServer(pTLState->endpointHandle);			while (pTLState->bRunning && pTLState->bConnected && pTLState->AVBVerState == OPENAVB_TL_AVB_VER_UNKNOWN) {				// Check for endpoint version message. Timeout in 50 msec.				if (!openavbEptClntService(pTLState->endpointHandle, 50)) {					AVB_LOG_WARNING("Lost connection to endpoint, will retry");					pTLState->bConnected = FALSE;					pTLState->endpointHandle = 0;				}			}			if (pTLState->AVBVerState == OPENAVB_TL_AVB_VER_INVALID) {				AVB_LOG_ERROR("AVB core version is different than Endpoint AVB core version. Streams will not be started. Will reconnect to the endpoint and check again.");			}			if (pTLState->bConnected && pTLState->AVBVerState == OPENAVB_TL_AVB_VER_VALID) {				if (pTLState->cfg.role == AVB_ROLE_TALKER) {					openavbTLRunTalker(pTLState);				}				else {					openavbTLRunListener(pTLState);				}			}			// Close the endpoint connection. unless connection already gone in which case the socket could already be reused.			if (pTLState->bConnected) {				openavbEptClntCloseSrvrConnection(endpointHandle);				pTLState->bConnected = FALSE;				pTLState->endpointHandle = 0;			}		}		if (pTLState->bRunning) {			SLEEP(1);		}	}	THREAD_JOINABLE(pTLState->TLThread);	AVB_TRACE_EXIT(AVB_TRACE_TL);	return NULL;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:61,


示例4: openavbRawsockClose

void openavbRawsockClose(void *pvRawsock){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	((base_rawsock_t*)pvRawsock)->cb.close(pvRawsock);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:8,


示例5: socketClose

static void socketClose(int h){	AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);	if (h != AVB_ENDPOINT_HANDLE_INVALID) {		close(h);	}	AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:8,


示例6: openavbSetRxSignalMode

void openavbSetRxSignalMode(void *pvRawsock, bool rxSignalMode){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	((base_rawsock_t*)pvRawsock)->cb.setRxSignalMode(pvRawsock, rxSignalMode);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:8,


示例7: openavbEptSrvrHndlVerRqstFromClient

/* Client version request */bool openavbEptSrvrHndlVerRqstFromClient(int h){	AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);	openavbEptSrvrSendServerVersionToClient(h, AVB_CORE_VER_FULL);	AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);	return TRUE;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:11,


示例8: openavbTLAVDECCStopTalker

bool openavbTLAVDECCStopTalker(tl_handle_t handle, U16 configIdx, void *pVoidTalkerStreamInfo){	AVB_TRACE_ENTRY(AVB_TRACE_TL);	openavbTLStop(handle);	AVB_TRACE_EXIT(AVB_TRACE_TL);	return TRUE;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例9: openavbRawsockRxBufLevel

int openavbRawsockRxBufLevel(void *pvRawsock){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	int ret = ((base_rawsock_t*)pvRawsock)->cb.rxBufLevel(pvRawsock);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例10: openavbRawsockGetAddr

bool openavbRawsockGetAddr(void *pvRawsock, U8 addr[ETH_ALEN]){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.getAddr(pvRawsock, addr);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例11: openavbRawsockRxAVTPSubtype

bool openavbRawsockRxAVTPSubtype(void *pvRawsock, U8 subtype){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.rxAVTPSubtype(pvRawsock, subtype);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例12: openavbRawsockGetSocket

int openavbRawsockGetSocket(void *pvRawsock){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	int ret = ((base_rawsock_t*)pvRawsock)->cb.getSocket(pvRawsock);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例13: openavbRawsockRelRxFrame

bool openavbRawsockRelRxFrame(void *pvRawsock, U8 *pBuffer){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.relRxFrame(pvRawsock, pBuffer);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例14: listenerDoStream

static inline bool listenerDoStream(tl_state_t *pTLState){	AVB_TRACE_ENTRY(AVB_TRACE_TL);	if (!pTLState) {		AVB_LOG_ERROR("Invalid TLState");		AVB_TRACE_EXIT(AVB_TRACE_TL);		return FALSE;	}	openavb_tl_cfg_t *pCfg = &pTLState->cfg;	listener_data_t *pListenerData = pTLState->pPvtListenerData;	bool bRet = FALSE;	if (pTLState->bStreaming) {		U64 nowNS;		pListenerData->nReportCalls++;		// Try to receive a frame		if (IS_OPENAVB_SUCCESS(openavbAvtpRx(pListenerData->avtpHandle))) {			pListenerData->nReportFrames++;		}		CLOCK_GETTIME64(OPENAVB_TIMER_CLOCK, &nowNS);		if (pCfg->report_seconds > 0) {			if (nowNS > pListenerData->nextReportNS) {				listenerShowStats(pListenerData, pTLState);				openavbListenerAddStat(pTLState, TL_STAT_RX_CALLS, pListenerData->nReportCalls);				openavbListenerAddStat(pTLState, TL_STAT_RX_FRAMES, pListenerData->nReportFrames);				pListenerData->nReportCalls = 0;				pListenerData->nReportFrames = 0;				pListenerData->nextReportNS += (pCfg->report_seconds * NANOSECONDS_PER_SECOND);			}		} else if (pCfg->report_frames > 0 && pListenerData->nReportFrames != pListenerData->lastReportFrames) {			if (pListenerData->nReportFrames % pCfg->report_frames == 1) {				listenerShowStats(pListenerData, pTLState);				pListenerData->lastReportFrames = pListenerData->nReportFrames;			}		}		if (nowNS > pListenerData->nextSecondNS) {			pListenerData->nextSecondNS += NANOSECONDS_PER_SECOND;			bRet = TRUE;		}	}	else {		SLEEP_MSEC(1);		bRet = TRUE;	}	AVB_TRACE_EXIT(AVB_TRACE_TL);	return bRet;}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:57,


示例15: AVB_TRACE_ENTRY

U8 *openavbRawsockGetRxFrame(void *pvRawsock, U32 timeout, unsigned int *offset, unsigned int *len){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	U8 *ret = ((base_rawsock_t*)pvRawsock)->cb.getRxFrame(pvRawsock, timeout, offset, len);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例16: openavbRawsockRxParseHdr

int openavbRawsockRxParseHdr(void *pvRawsock, U8 *pBuffer, hdr_info_t *pInfo){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	int ret = ((base_rawsock_t*)pvRawsock)->cb.rxParseHdr(pvRawsock, pBuffer, pInfo);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例17: openavbRawsockTxFrameReady

bool openavbRawsockTxFrameReady(void *pvRawsock, U8 *pBuffer, unsigned int len){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.txFrameReady(pvRawsock, pBuffer, len);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例18: openavbAvdeccMsgSrvrHndlVerRqstFromClient

/* Client version request */bool openavbAvdeccMsgSrvrHndlVerRqstFromClient(int avdeccMsgHandle){	AVB_TRACE_ENTRY(AVB_TRACE_AVDECC_MSG);	openavbAvdeccMsgSrvrSendServerVersionToClient(avdeccMsgHandle, AVB_CORE_VER_FULL);	AVB_TRACE_EXIT(AVB_TRACE_AVDECC_MSG);	return TRUE;}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:11,


示例19: openavbRawsockTxSetHdr

bool openavbRawsockTxSetHdr(void *pvRawsock, hdr_info_t *pHdr){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.txSetHdr(pvRawsock, pHdr);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例20: openavbRawsockTxSetMark

bool openavbRawsockTxSetMark(void *pvRawsock, int mark){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.txSetMark(pvRawsock, mark);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例21: openavbRawsockGetTXOutOfBuffersCyclic

unsigned long openavbRawsockGetTXOutOfBuffersCyclic(void *pvRawsock){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK_DETAIL);	unsigned long ret = ((base_rawsock_t*)pvRawsock)->cb.getTXOutOfBuffersCyclic(pvRawsock);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK_DETAIL);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例22: openavbRawsockRxMulticast

bool openavbRawsockRxMulticast(void *pvRawsock, bool add_membership, const U8 addr[ETH_ALEN]){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	bool ret = ((base_rawsock_t*)pvRawsock)->cb.rxMulticast(pvRawsock, add_membership, addr);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return ret;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:9,


示例23: AVB_TRACE_ENTRY

// Open a rawsock for TX or RXvoid *pcapRawsockOpen(pcap_rawsock_t* rawsock, const char *ifname, bool rx_mode, bool tx_mode, U16 ethertype, U32 frame_size, U32 num_frames){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	AVB_LOGF_DEBUG("Open, rx=%d, tx=%d, ethertype=%x size=%d, num=%d",	rx_mode, tx_mode, ethertype, frame_size, num_frames);	baseRawsockOpen(&rawsock->base, ifname, rx_mode, tx_mode, ethertype, frame_size, num_frames);	if (tx_mode) {		AVB_LOG_DEBUG("pcap rawsock transmit mode will bypass FQTSS");	}	rawsock->handle = 0;	// Get info about the network device	if (!simpleAvbCheckInterface(ifname, &(rawsock->base.ifInfo))) {		AVB_LOGF_ERROR("Creating rawsock; bad interface name: %s", ifname);		free(rawsock);		AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);		return NULL;	}	// Deal with frame size.	if (rawsock->base.frameSize == 0) {		// use interface MTU as max frames size, if none specified		rawsock->base.frameSize = rawsock->base.ifInfo.mtu + ETH_HLEN + VLAN_HLEN;	}	else if (rawsock->base.frameSize > rawsock->base.ifInfo.mtu + ETH_HLEN + VLAN_HLEN) {		AVB_LOG_ERROR("Creating rawsock; requested frame size exceeds MTU");		free(rawsock);		AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);		return NULL;	}	char errbuf[PCAP_ERRBUF_SIZE];	rawsock->handle = open_pcap_dev(ifname, rawsock->base.frameSize, errbuf);	if (!rawsock->handle) {		AVB_LOGF_ERROR("Cannot open device %s: %s", ifname, errbuf);		free(rawsock);		AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);		return NULL;	}	// fill virtual functions table	rawsock_cb_t *cb = &rawsock->base.cb;	cb->close = pcapRawsockClose;	cb->getTxFrame = pcapRawsockGetTxFrame;	cb->txFrameReady = pcapRawsockTxFrameReady;	cb->send = pcapRawsockSend;	cb->getRxFrame = pcapRawsockGetRxFrame;	cb->rxMulticast = pcapRawsockRxMulticast;	cb->rxParseHdr = pcapRawsockRxParseHdr;	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);	return rawsock;}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:57,


示例24: openavbRawsockClose

void openavbRawsockClose(void *pvRawsock){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	base_rawsock_t *rawsock = (base_rawsock_t*)pvRawsock;	if (VALID_RAWSOCK(rawsock) && rawsock->cb.close)		rawsock->cb.close(pvRawsock);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);}
开发者ID:HuangFeiFelix,项目名称:openavbtest2,代码行数:10,


示例25: openavbSetRxSignalMode

void openavbSetRxSignalMode(void *pvRawsock, bool rxSignalMode){	AVB_TRACE_ENTRY(AVB_TRACE_RAWSOCK);	base_rawsock_t *rawsock = (base_rawsock_t*)pvRawsock;	if (VALID_RAWSOCK(rawsock) && rawsock->cb.setRxSignalMode)		rawsock->cb.setRxSignalMode(pvRawsock, rxSignalMode);	AVB_TRACE_EXIT(AVB_TRACE_RAWSOCK);}
开发者ID:HuangFeiFelix,项目名称:openavbtest2,代码行数:10,


示例26: openavbAcmpSMController_removeInflight

void openavbAcmpSMController_removeInflight(openavb_acmp_ACMPCommandResponse_t *commandResponse){	AVB_TRACE_ENTRY(AVB_TRACE_ACMP);	openavb_list_node_t node = openavbAcmpSMController_findInflightNodeFromCommand(commandResponse);	if (node) {		openavbListDelete(openavbAcmpSMControllerVars.inflight, node);	}	AVB_TRACE_EXIT(AVB_TRACE_ACMP);}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:11,


示例27: openavbAcmpSMControllerSet_doTerminate

void openavbAcmpSMControllerSet_doTerminate(bool value){	AVB_TRACE_ENTRY(AVB_TRACE_ACMP);	openavbAcmpSMControllerVars.doTerminate = value;	SEM_ERR_T(err);	SEM_POST(openavbAcmpSMControllerSemaphore, err);	SEM_LOG_ERR(err);	AVB_TRACE_EXIT(AVB_TRACE_ACMP);}
开发者ID:AVnu,项目名称:Open-AVB,代码行数:11,


示例28: openavbEptSrvrSendToClient

static bool openavbEptSrvrSendToClient(int h, openavbEndpointMessage_t *msg){    AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);    if (h < 0 || h >= POLL_FD_COUNT) {        AVB_LOG_ERROR("Sending message; invalid handle");        AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);        return FALSE;    }    if (!msg) {        AVB_LOG_ERROR("Sending message; invalid argument passed");        AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);        return FALSE;    }    int csock = fds[h].fd;    if (csock == SOCK_INVALID) {        AVB_LOG_ERROR("Socket closed unexpectedly");        return FALSE;    }    ssize_t nWrite = write(csock, msg, OPENAVB_ENDPOINT_MSG_LEN);    AVB_LOGF_VERBOSE("Sent message, len=%zu, nWrite=%zu", OPENAVB_ENDPOINT_MSG_LEN, nWrite);    if (nWrite < OPENAVB_ENDPOINT_MSG_LEN) {        if (nWrite < 0) {            AVB_LOGF_ERROR("Failed to write socket: %s", strerror(errno));        }        else if (nWrite == 0) {            AVB_LOG_ERROR("Socket closed unexpectedly");        }        else {            AVB_LOG_ERROR("Socket write too short");        }        socketClose(h);        AVB_TRACE_ENTRY(AVB_TRACE_ENDPOINT);        return FALSE;    }    AVB_TRACE_EXIT(AVB_TRACE_ENDPOINT);    return TRUE;}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:41,


示例29: openavbIntfLoggerGenEndCB

// General shutdown callback regardless if a talker or listener. Called once during openavbTLClose()void openavbIntfLoggerGenEndCB(media_q_t *pMediaQ) {	AVB_TRACE_ENTRY(AVB_TRACE_INTF);	if (pMediaQ) {		pvt_data_t *pPvtData = pMediaQ->pPvtIntfInfo;		if (!pPvtData) {			AVB_LOG_ERROR("Private interface module data not allocated.");			return;		}	}	AVB_TRACE_EXIT(AVB_TRACE_INTF);}
开发者ID:Chandini212,项目名称:Open-AVB,代码行数:13,



注:本文中的AVB_TRACE_ENTRY函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ AVER函数代码示例
C++ AV函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。