亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rvmutex.c

?? 基于h323協議的軟phone
?? C
字號:
/***********************************************************************
Filename   : rvmutex.c
Description: recursive mutex functions
************************************************************************
        Copyright (c) 2001 RADVISION Inc. and RADVISION Ltd.
************************************************************************
NOTICE:
This document contains information that is confidential and proprietary
to RADVISION Inc. and RADVISION Ltd.. No part of this document may be
reproduced in any form whatsoever without written prior approval by
RADVISION Inc. or RADVISION Ltd..

RADVISION Inc. and RADVISION Ltd. reserve the right to revise this
publication and make changes without obligation to notify any person of
such revisions or changes.
***********************************************************************/
#include "rvmutex.h"
#include "rvthread.h"
#include <string.h>

#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS)
#include <errno.h>

/* See if we have a Solaris that can set a mutex's protocol or not */
static RvBool RvMutexTrySettingProtocol = RV_TRUE;
#endif

/* NOTE: all mutex functions are only callable at task level */

/* define the default attributes since they may be a structure */
static RvMutexAttr RvDefaultMutexAttr = RV_MUTEX_ATTRIBUTE_DEFAULT;

/* Lets make error codes a little easier to type */
#define RvMutexErrorCode(_e) RvErrorCode(RV_ERROR_LIBCODE_CCORE, RV_CCORE_MODULE_MUTEX, (_e))

RvStatus RvMutexInit(void)
{
	return RV_OK;
}

RvStatus RvMutexEnd(void)
{
	return RV_OK;
}

#if (RV_MUTEX_TYPE != RV_MUTEX_NONE)
/* Don't include any other code if type is none */

/* startcount needs to be <= a signed 32 bit number for compatability */
RVCOREAPI
RvStatus RVCALLCONV RvMutexConstruct(RvMutex *mu)
{
#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS)
	pthread_mutexattr_t ma;
    int result;
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	pthread_mutexattr_t ma;
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	RvStatus result;
#endif

#if defined(RV_NULLCHECK)
	if(mu == NULL)
		return RvMutexErrorCode(RV_ERROR_NULLPTR);
#endif
	
#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS) || (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	if(pthread_mutexattr_init(&ma) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS)
	/* Should allow these along with _setprioceiling and */
	/* _setrobust_np to be set from config file. */ 
    if (RvMutexTrySettingProtocol)
    {
        result = pthread_mutexattr_setprotocol(&ma, RvDefaultMutexAttr.protocol);
	    if(result != 0)
        {
            if (result == ENOSYS)
                RvMutexTrySettingProtocol = RV_FALSE; /* Not supported - don't try anymore */
            else
                return RvMutexErrorCode(RV_ERROR_UNKNOWN);
        }
    }
	if(pthread_mutexattr_setpshared(&ma, RvDefaultMutexAttr.pshared) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
	if(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	/* Linux only support one attribute */
	if(pthread_mutexattr_setkind_np(&ma, PTHREAD_MUTEX_RECURSIVE_NP) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
	if(pthread_mutex_init(mu, &ma) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
	if(pthread_mutexattr_destroy(&ma) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif /* Solaris & Linux */

#if (RV_MUTEX_TYPE == RV_MUTEX_VXWORKS)
	*mu = semMCreate(RvDefaultMutexAttr);
	if(*mu == NULL)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_PSOS)
	if(mu_create("rv", RvDefaultMutexAttr | MU_RECURSIVE, 0, mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_MUTEX)
	*mu = CreateMutex(NULL, FALSE, NULL);
	if(*mu == NULL)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_CRITICAL)
#if (_WIN32_WINNT >= 0x0500)
	if(InitializeCriticalSectionAndSpinCount(mu, RvDefaultMutexAttr) != 0) /* tune spincount for MP systems */
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#else
	InitializeCriticalSection(mu);
#endif
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	result = RvSemaphoreConstruct(&mu->lock, RvUint32Const(1));
	if(result != RV_OK)
		return result;
	result = RvSemaphoreConstruct(&mu->handle, RvUint32Const(0));
	if(result != RV_OK)
		return result;
	mu->count = RvUint32Const(0);
	mu->waiters = RvUint32Const(0);
#endif

	return RV_OK;
}

RVCOREAPI
RvStatus RVCALLCONV RvMutexDestruct(RvMutex *mu)
{
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	RvStatus result;
#endif

#if defined(RV_NULLCHECK)
	if(mu == NULL)
		return RvMutexErrorCode(RV_ERROR_NULLPTR);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS) || (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	if(pthread_mutex_destroy(mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_VXWORKS)
	if(semDelete(*mu) != OK)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_PSOS)
	if(mu_delete(*mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_MUTEX)
	if(CloseHandle(*mu) == 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_CRITICAL)
	DeleteCriticalSection(mu);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	result = RvSemaphoreDestruct(&mu->handle);
	if(result != RV_OK)
		return result;
	result = RvSemaphoreDestruct(&mu->lock);
	if(result != RV_OK)
		return result;
#endif
	return RV_OK;
}

/* Block until Mutex is aquired */
RVCOREAPI
RvStatus RVCALLCONV RvMutexLock(RvMutex *mu)
{
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	RvThreadId current;
#endif

#if defined(RV_NULLCHECK)
	if(mu == NULL)
		return RvMutexErrorCode(RV_ERROR_NULLPTR);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS) || (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	if(pthread_mutex_lock(mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_VXWORKS)
	if(semTake(*mu, WAIT_FOREVER) != OK)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_PSOS)
	if(mu_lock(*mu, MU_WAIT, 0) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_MUTEX)
	if(WaitForSingleObject(*mu, INFINITE) != WAIT_OBJECT_0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_CRITICAL)
	EnterCriticalSection(mu);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	current = RvThreadCurrentId();
	RvSemaphoreWait(&mu->lock);

	if(mu->count > RvUint32Const(0)) {
		if (RvThreadIdEqual(mu->owner, current) == RV_FALSE) {
			/* owned by someone else */
			mu->waiters += RvUint32Const(1);
			RvSemaphorePost(&mu->lock);
			RvSemaphoreWait(&mu->handle);	/* mu->lock is locked when we return */
			mu->waiters -= RvUint32Const(1);
		}
	}
	mu->owner = current;
	mu->count += RvUint32Const(1); 		
	RvSemaphorePost(&mu->lock);
#endif
	return RV_OK;
}

RVCOREAPI
RvStatus RVCALLCONV RvMutexUnlock(RvMutex *mu)
{
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	RvThreadId current;
#endif

#if defined(RV_NULLCHECK)
	if(mu == NULL)
		return RvMutexErrorCode(RV_ERROR_NULLPTR);
#endif

#if (RV_MUTEX_TYPE == RV_MUTEX_SOLARIS) || (RV_MUTEX_TYPE == RV_MUTEX_LINUX)
	if(pthread_mutex_unlock(mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_VXWORKS)
	if(semGive(*mu) != OK)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_PSOS)
	if(mu_unlock(*mu) != 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_MUTEX)
	if(ReleaseMutex(*mu) == 0)
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_WIN32_CRITICAL)
	LeaveCriticalSection(mu);
#endif
#if (RV_MUTEX_TYPE == RV_MUTEX_MANUAL)
	current = RvThreadCurrentId();
	RvSemaphoreWait(&mu->lock);

	/* Make sure unlocking thread is owner and count is not zero */
	if((RvThreadIdEqual(mu->owner, current) == RV_FALSE) || (mu->count == RvUint32Const(0)))
		return RvMutexErrorCode(RV_ERROR_UNKNOWN);

	mu->count -= RvUint32Const(1);
	if((mu->count == RvUint32Const(0)) && (mu->waiters > RvUint32Const(0))) {
		/* We're giving up the lock and somebody is waiting. The waiter */
		/* expects the mutex lock to be locked, so don't unlock it */
		RvSemaphorePost(&mu->handle);
	} else RvSemaphorePost(&mu->lock);
#endif
	return RV_OK;
}

RvStatus RvMutexSetAttr(RvMutexAttr *attr)
{
	if(attr != NULL) {
		memcpy(&RvDefaultMutexAttr, attr, sizeof(RvDefaultMutexAttr));
	}
	return RV_OK;
}

#endif /* NONE */

#if defined(RV_TEST_CODE)
#include "rvstdio.h"
#include "rvmemory.h"

#define RvMutexPrintError(_r) RvPrintf("Error %d/%d/%d\n",  RvErrorGetLib((_r)), RvErrorGetModule((_r)), RvErrorGetCode((_r)))

void RvMutexTestThread(RvThread *th, void *data)
{
	RvMutex *mu;
	RvStatus result;

	mu = (RvMutex *)data;

	RvPrintf("Thread started.\n");

	RvPrintf("Thread: Trying to lock...\n");
	result = RvMutexLock(mu);
	if(result != RV_OK) {
		RvPrintf("Thread Lock ");
		RvMutexPrintError(result);
	} else RvPrintf("Thread RvMutexLock OK\n");

	RvPrintf("Thread: Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("Thread: RvMutexLock: ");
	result = RvMutexLock(mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("Thread: Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("Thread: RvMutexUnlock: ");
	result = RvMutexUnlock(mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("Thread: Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("Thread: RvMutexUnlock: ");
	result = RvMutexUnlock(mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");
	
	RvPrintf("Thread exiting.\n");
}

void RvMutexTest(void)
{
	RvStatus result;
	RvMutex mu;
	RvThread th;

	/* Initialize other needed modules */
	RvSemaphoreInit();
	RvLockInit();
	RvMemoryInit();
	RvThreadInit();

	RvPrintf("RvMutexInit: ");
	result = RvMutexInit();
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexConstruct: ");
	result = RvMutexConstruct(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexLock: ");
	result = RvMutexLock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexLock: ");
	result = RvMutexLock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexUnlock: ");
	result = RvMutexUnlock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexUnlock: ");
	result = RvMutexUnlock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	/* Check between threads */

	RvPrintf("RvMutexLock: ");
	result = RvMutexLock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");
	
	RvThreadConstruct(&th, RvMutexTestThread, &mu);
	RvThreadCreate(&th);
	RvThreadStart(&th);

	RvPrintf("Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("RvMutexLock: ");
	result = RvMutexLock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("RvMutexUnlock: ");
	result = RvMutexUnlock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("RvMutexUnlock: ");
	result = RvMutexUnlock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");
	
	RvPrintf("Waiting for 5 seconds.\n");
	RvThreadNanosleep(RvInt64Const(5000000000));

	RvPrintf("Trying to Lock ...\n");
	result = RvMutexLock(&mu);
	if(result != RV_OK) {
		RvPrintf("  RvMutexLock: ");
		RvMutexPrintError(result);
	} else RvPrintf("  RvMutexLock: OK\n");

	RvPrintf("RvMutexUnlock: ");
	result = RvMutexUnlock(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvThreadDestruct(&th);

	RvPrintf("RvMutexDestruct: ");
	result = RvMutexDestruct(&mu);
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvPrintf("RvMutexEnd: ");
	result = RvMutexEnd();
	if(result != RV_OK) {
		RvMutexPrintError(result);
	} else RvPrintf("OK\n");

	RvThreadEnd();
	RvMemoryEnd();
	RvLockEnd();
	RvSemaphoreEnd();
}
#endif /* RV_TEST_CODE */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区大片| 色综合天天性综合| 性久久久久久久久| 夜夜爽夜夜爽精品视频| 中文字幕在线视频一区| 中文字幕二三区不卡| 久久精品欧美一区二区三区不卡| 欧美一区二区三区成人| 精品乱人伦小说| 26uuu精品一区二区在线观看| 日韩欧美亚洲国产精品字幕久久久| 91精品国产91热久久久做人人| 欧美日韩午夜在线视频| 欧美一级黄色大片| 精品人在线二区三区| 日本一区免费视频| 亚洲人成网站精品片在线观看| 亚洲一区二区三区视频在线| 天堂影院一区二区| 国产一区啦啦啦在线观看| 成人亚洲精品久久久久软件| 91丨九色porny丨蝌蚪| 欧美精品aⅴ在线视频| 26uuu亚洲婷婷狠狠天堂| 国产精品久久久久久久久久免费看| 亚洲欧美综合在线精品| 三级影片在线观看欧美日韩一区二区| 日本中文字幕不卡| 成人永久免费视频| 欧美日韩免费高清一区色橹橹| 欧美白人最猛性xxxxx69交| 日本一区二区高清| 亚洲成人激情自拍| 成人在线视频一区二区| 91麻豆精品国产91久久久资源速度| 国产亚洲欧美在线| 午夜影院久久久| 波多野结衣中文字幕一区| 91精品国产全国免费观看| 国产精品国产三级国产有无不卡| 亚洲成人自拍一区| 成人性生交大片免费看在线播放 | 日韩欧美国产三级| 国产欧美日韩在线看| 午夜欧美视频在线观看| 成人免费看片app下载| 欧美日韩高清一区| 一区二区三区在线免费观看| 国产乱子轮精品视频| 精品视频在线免费观看| 日本一区二区免费在线观看视频 | 精品在线一区二区| 欧美性猛片aaaaaaa做受| 中文字幕精品三区| 国产精品香蕉一区二区三区| 51午夜精品国产| 一区二区三区国产精华| 成人免费视频免费观看| 久久亚洲春色中文字幕久久久| 性感美女久久精品| 色综合久久88色综合天天免费| 精品国产乱码久久久久久1区2区 | 亚洲黄色av一区| 亚洲色图视频免费播放| 国产精品911| 日韩欧美中文一区| 日韩激情视频在线观看| 欧美日韩午夜精品| 亚洲在线一区二区三区| 日本福利一区二区| 亚洲欧美电影院| 色悠悠亚洲一区二区| 综合精品久久久| 91视频在线观看| 一区二区三区四区在线| 91搞黄在线观看| 亚洲高清一区二区三区| 欧美日韩免费不卡视频一区二区三区| 亚洲福利一区二区| 日韩一区二区三区高清免费看看| 亚洲bt欧美bt精品777| 欧美一级电影网站| 看片网站欧美日韩| 精品国产一区a| 成人小视频免费观看| 日韩伦理免费电影| 在线看日本不卡| 日韩黄色在线观看| 久久这里只精品最新地址| 国产99久久久国产精品免费看| 国产欧美一区二区三区鸳鸯浴| 国产风韵犹存在线视精品| 中文字幕一区二区三区视频| 色94色欧美sute亚洲线路一ni| 天堂久久久久va久久久久| 337p亚洲精品色噜噜噜| 国产成人亚洲精品青草天美| 亚洲婷婷国产精品电影人久久| 欧美午夜宅男影院| 久久9热精品视频| 国产精品福利在线播放| 欧日韩精品视频| 精油按摩中文字幕久久| 亚洲欧美另类综合偷拍| 欧美卡1卡2卡| www.日韩精品| 亚洲无线码一区二区三区| 在线观看av不卡| 久久99精品久久久| 国产精品国产三级国产aⅴ原创| 日本高清免费不卡视频| 美女网站在线免费欧美精品| 国产欧美一区二区精品性| 欧美午夜精品一区| 国产一区不卡视频| 一区二区日韩电影| 国产午夜亚洲精品理论片色戒| 91在线云播放| 国产在线播精品第三| 亚洲黄色av一区| 国产欧美一区二区三区在线看蜜臀| 欧美日韩精品久久久| 成人av先锋影音| 极品少妇一区二区| 亚洲成人tv网| 亚洲欧美怡红院| 精品欧美一区二区在线观看| 欧美网站一区二区| www.欧美日韩| 国产福利精品一区二区| 久久99国产精品成人| 亚洲小说欧美激情另类| ●精品国产综合乱码久久久久| 精品国免费一区二区三区| 欧美久久久久久久久| 99精品国产热久久91蜜凸| 国产乱子轮精品视频| 欧美a一区二区| 日韩精品一级二级| 亚洲影视在线观看| 亚洲精品久久久久久国产精华液| 国产欧美一区视频| 国产日韩欧美制服另类| 亚洲精品一区二区在线观看| 日韩欧美一区二区不卡| 在线播放中文一区| 欧美午夜精品一区二区三区| 色综合天天狠狠| 日本精品视频一区二区三区| 不卡一区二区三区四区| 国产成人在线观看免费网站| 国产另类ts人妖一区二区| 日本三级韩国三级欧美三级| 图片区小说区国产精品视频| 亚洲高清免费观看高清完整版在线观看| 一区二区三区欧美日| 亚洲激情欧美激情| 一区二区三区视频在线观看| 亚洲精品国产无天堂网2021| 夜夜精品视频一区二区| 亚洲一区二区视频| 日韩精品色哟哟| 日本最新不卡在线| 韩国v欧美v日本v亚洲v| 国产a精品视频| 国产精品乱子久久久久| 这里只有精品99re| 91麻豆精品国产91久久久资源速度 | 九九视频精品免费| 国产福利一区二区三区视频| 国产91精品精华液一区二区三区| 国产91精品入口| 在线观看亚洲成人| 欧美精品1区2区3区| 精品国产乱码久久久久久免费| 久久久久久97三级| 国产午夜精品久久久久久久| 国产婷婷一区二区| 成人欧美一区二区三区黑人麻豆| 亚洲一区在线电影| 久久爱www久久做| 色综合网站在线| 91精品在线观看入口| 久久久www成人免费无遮挡大片| 中文字幕巨乱亚洲| 亚洲一区二区成人在线观看| 伦理电影国产精品| www.成人在线| 日韩欧美在线一区二区三区| 国产精品免费av| 亚洲一区二区三区四区在线免费观看 | 日韩小视频在线观看专区| 欧美经典一区二区三区| 亚洲精选视频免费看| 玉足女爽爽91| 日韩一区精品视频| 美腿丝袜一区二区三区| eeuss鲁片一区二区三区| 6080午夜不卡| 亚洲麻豆国产自偷在线|