Skip to content

增加UDP Agent #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 81 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
070771e
HP-Socket v 3.1.1
ldcsaa Dec 24, 2013
a11bde2
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
b47b51e
HP-Socket v3.1.1 Released
ldcsaa Dec 24, 2013
a634d16
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
b32bd41
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
be8bfc8
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Jan 13, 2014
e599eb9
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
d9d1271
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
5dc9362
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Dec 24, 2013
5ee0c2a
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Jan 14, 2014
5612564
HP-Socket v3.1.3
ldcsaa Mar 29, 2014
6447166
Merge branch 'master' of github.com:ldcsaa/HP-Socket
ldcsaa Mar 29, 2014
83eef40
clear old other language demo
ldcsaa Apr 17, 2014
0bedf04
0417
ldcsaa Apr 17, 2014
d7c3d00
0407
ldcsaa Apr 17, 2014
b81e191
0417
ldcsaa Apr 17, 2014
7b7d7f6
0417
ldcsaa Apr 17, 2014
6e8b82d
20140427
ldcsaa Apr 26, 2014
0660e92
20140427
ldcsaa Apr 26, 2014
91e7108
20140427
ldcsaa Apr 26, 2014
55489c2
20140427
ldcsaa Apr 26, 2014
4fcd78e
20140427
ldcsaa Apr 26, 2014
4d35e50
20140427
ldcsaa Apr 26, 2014
660e980
20040427
ldcsaa Apr 27, 2014
6f7595b
20040427
ldcsaa Apr 27, 2014
078861c
20140428
ldcsaa Apr 28, 2014
dee1c00
20140507
ldcsaa May 6, 2014
d07938e
delete
ldcsaa May 11, 2014
5d1ba7d
20140511
ldcsaa May 11, 2014
bbab911
20140511
ldcsaa May 11, 2014
474885c
20140526
ldcsaa May 25, 2014
c171507
20140604
ldcsaa Jun 4, 2014
96032d0
20140604
ldcsaa Jun 4, 2014
6b0e640
20140604
ldcsaa Jun 6, 2014
d731b01
20140707
ldcsaa Jul 6, 2014
d2c5ea3
20140707
ldcsaa Jul 6, 2014
d6251b0
20140707
ldcsaa Jul 7, 2014
d3e903a
20140708
ldcsaa Jul 8, 2014
20d5bca
20140708
ldcsaa Jul 8, 2014
0c478d0
20140812
ldcsaa Aug 12, 2014
455edce
20140812
ldcsaa Aug 12, 2014
2f89905
20140812
ldcsaa Aug 12, 2014
919a6c3
20140812
ldcsaa Aug 13, 2014
668dd66
20140812
ldcsaa Aug 13, 2014
9a2f863
20140812
ldcsaa Aug 13, 2014
c724890
20140812
ldcsaa Aug 13, 2014
1019f46
20141208
ldcsaa Dec 7, 2014
b95bb5f
20141208
ldcsaa Dec 7, 2014
534126a
20141208
ldcsaa Dec 7, 2014
34f9fe3
20141208
ldcsaa Dec 8, 2014
975112d
20141227
ldcsaa Dec 27, 2014
37f51ff
20141227
ldcsaa Dec 28, 2014
193f979
20150125
ldcsaa Jan 25, 2015
a46b530
20151028
ldcsaa Jan 28, 2015
2cdb396
20150129
ldcsaa Jan 29, 2015
21412dc
20150202
ldcsaa Feb 2, 2015
08fa5ca
20150203
ldcsaa Feb 3, 2015
cf7d517
20150205
ldcsaa Feb 5, 2015
a1207e2
20150209
ldcsaa Feb 9, 2015
e14ed68
20151130
Nov 30, 2015
74f6824
20151130
Nov 30, 2015
ded870d
20151130
Nov 30, 2015
c4eba2d
20151201
Dec 1, 2015
6476ca2
20160327
ldcsaa Mar 27, 2016
8bbd5be
20160327
ldcsaa Mar 27, 2016
005e154
20160401
ldcsaa Mar 31, 2016
6c78a87
20160402
ldcsaa Apr 1, 2016
1106c9c
20160409
Apr 9, 2016
587689c
20160409
Apr 9, 2016
5f312bc
20160409
Apr 9, 2016
5c46195
20160409
ldcsaa Apr 9, 2016
e3f2803
20160410
ldcsaa Apr 9, 2016
b615862
20160420
Apr 20, 2016
df83997
20160420
Apr 20, 2016
198c03e
20160421
Apr 21, 2016
0b211d4
20160421
Apr 21, 2016
7450e29
20160421
Apr 21, 2016
498460d
20160421
Apr 21, 2016
b77aee1
20160421
ldcsaa Apr 21, 2016
b78174e
1. added UDP Agent support.
hezlog Apr 25, 2016
6c4c72e
1.修正 UDP Agent 接口;
hezlog Apr 28, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
20160401
  • Loading branch information
ldcsaa committed Mar 31, 2016
commit 005e154022846cc8b63b79f858a8c18c2abb4b47
2 changes: 1 addition & 1 deletion ChangeLog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ v3.4.1
1��Tcp Pack ϵ�������֤ÿ�� OnReceive �¼�����Ӧ�ó����ṩһ���������ݰ�
2��Tcp Pack ϵ������� PUSH/PULL ģʽ�Ľ���壬Ӧ�ó��򲻱ش����ְ����磺PUSH��������ץȡ���磺PULL��
3��Tcp Pack ϵ������ṩ Get/SetMaxPackSize() �� Get/SetPackHeaderFlag() ���������������������Ͱ�ͷ��ʶ
2��CTcpPackServer ʵ�� ITcpServer �ӿڣ�CTcpPackAgent ʵ�� ITcpAgent �ӿڣ�CTcpPackClient ʵ�� ITcpClient �ӿ�
4��CTcpPackServer ʵ�� ITcpServer �ӿڣ�CTcpPackAgent ʵ�� ITcpAgent �ӿڣ�CTcpPackClient ʵ�� ITcpClient �ӿ�

> ����ӿڵ�����
-----------------
Expand Down
1 change: 1 addition & 0 deletions Common/ChangeLog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ v2.3.10
==========================================================================================

1���޸� RWLock.h/.cpp������ Slim Lock ʵ�������д�� CSlimRWLock
2���޸� RingBuffer.h������ CRingPool �� CCASQueue

==========================================================================================
v2.3.9 ���£�
Expand Down
2 changes: 1 addition & 1 deletion Common/Src/FuncHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ void WriteLog(LPCTSTR pszLogFileName, LPCTSTR pszLog)

#ifdef _UNICODE
LPSTR lpszLog = T2A((LPTSTR)(LPCTSTR)strLog);
::WriteFile(hLogFile, lpszLog, strlen(lpszLog), &dwSize, nullptr);
::WriteFile(hLogFile, lpszLog, (DWORD)::strlen(lpszLog), &dwSize, nullptr);
#else
::WriteFile(hLogFile, strLog, strLog.GetLength(), &dwSize, nullptr);
#endif
Expand Down
356 changes: 352 additions & 4 deletions Common/Src/RingBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,11 +412,359 @@ template <class T, class _PutGuard = CCriSec, class _GetGuard = CCriSec> class C
char pack3[PACK_SIZE_OF(_GetGuard)];
};

#if !defined (_WIN64)
#pragma pack(pop)
#endif

typedef CRingBuffer<void, CCriSec, CCriSec> CCSRingBuffer;
typedef CRingBuffer<void, CInterCriSec, CInterCriSec> CICSRingBuffer;
typedef CRingBuffer<void, CSpinGuard, CSpinGuard> CSGRingBuffer;
typedef CRingBuffer<void, CFakeGuard, CFakeGuard> CFKRingBuffer;

template <class T> class CRingPool
{
private:
typedef T* TPTR;
typedef volatile T* VTPTR;

static TPTR const E_EMPTY;
static TPTR const E_LOCKED;
static TPTR const E_RELEASED;
static TPTR const E_OCCUPIED;
static TPTR const E_MAX_STATUS;
public:

BOOL TryPut(TPTR pElement)
{
ASSERT(pElement != nullptr);

BOOL isOK = FALSE;

while(true)
{
BOOL bOccupy = FALSE;
DWORD seqPut = m_seqPut;

if(!HasPutSpace(seqPut))
break;

DWORD dwIndex = seqPut % m_dwSize;
VTPTR& pValue = *(m_pv + dwIndex);

if(pValue == E_RELEASED)
{
if(::InterlockedCompareExchangePointer((volatile PVOID*)&pValue, E_OCCUPIED, E_RELEASED) == E_RELEASED)
bOccupy = TRUE;
else
continue;
}

if(pValue == E_EMPTY || bOccupy)
{
if(::InterlockedCompareExchange(&m_seqPut, seqPut + 1, seqPut) == seqPut)
{
pValue = pElement;
isOK = TRUE;

break;
}
}
else if(pValue == E_LOCKED)
break;
}

return isOK;
}

BOOL TryGet(TPTR* ppElement)
{
ASSERT(ppElement != nullptr);

BOOL isOK = FALSE;

while(true)
{
DWORD seqGet = m_seqGet;

if(!HasGetSpace(seqGet))
break;

DWORD dwIndex = seqGet % m_dwSize;
VTPTR& pValue = *(m_pv + dwIndex);

if(pValue == E_LOCKED)
break;
else if(pValue != E_EMPTY && pValue != E_RELEASED && pValue != E_OCCUPIED)
{
if(::InterlockedCompareExchange(&m_seqGet, seqGet + 1, seqGet) == seqGet)
{
ASSERT(pValue > E_MAX_STATUS);

*(ppElement) = (TPTR)pValue;
pValue = E_EMPTY;
isOK = TRUE;

break;
}
}
}

return isOK;
}

BOOL TryLock(TPTR* ppElement, DWORD& dwIndex)
{
ASSERT(ppElement != nullptr);

BOOL isOK = FALSE;

while(true)
{
DWORD seqGet = m_seqGet;

if(!HasGetSpace(seqGet))
break;

dwIndex = seqGet % m_dwSize;
VTPTR& pValue = *(m_pv + dwIndex);

if(pValue == E_LOCKED)
break;
else if(pValue != E_EMPTY && pValue != E_RELEASED && pValue != E_OCCUPIED)
{
if(::InterlockedCompareExchange(&m_seqGet, seqGet + 1, seqGet) == seqGet)
{
ASSERT(pValue > E_MAX_STATUS);

*(ppElement) = (TPTR)pValue;
pValue = E_LOCKED;
isOK = TRUE;

break;
}
}
}

return isOK;
}

void ReleaseLock(TPTR pElement, DWORD dwIndex)
{
ASSERT(dwIndex < m_dwSize);
ASSERT(pElement == nullptr || (UINT_PTR)pElement > (UINT_PTR)E_MAX_STATUS);

VTPTR& pValue = *(m_pv + dwIndex);
VERIFY(pValue == E_LOCKED);

if(pElement != nullptr)
{
for(DWORD i = 0; ; i++)
{
if(TryPut(pElement))
break;

DWORD dwPutIndex = m_seqPut % m_dwSize;

if(dwIndex == dwPutIndex)
{
pValue = pElement;
::InterlockedIncrement(&m_seqPut);

return;
}

CSpinGuard::Pause(i);
}
}

pValue = E_RELEASED;
}

public:

void Reset(DWORD dwSize = 0)
{
if(IsValid())
Destroy();
if(dwSize > 0)
Create(dwSize);
}

DWORD Size() {return m_dwSize;}
DWORD Elements() {return m_seqPut - m_seqGet;}
BOOL IsFull() {return Elements() == Size();}
BOOL IsEmpty() {return Elements() == 0;}
BOOL IsValid() {return m_pv != nullptr;}

private:

BOOL HasPutSpace(DWORD seqPut)
{
return (seqPut - m_seqGet < m_dwSize);
}

BOOL HasGetSpace(DWORD seqGet)
{
return (m_seqPut - seqGet > 0);
}

void Create(DWORD dwSize)
{
ASSERT(!IsValid() && dwSize > 0);

m_seqPut = 0;
m_seqGet = 0;
m_dwSize = dwSize;
m_pv = (VTPTR*)malloc(m_dwSize * sizeof(TPTR));

::memset(m_pv, (int)E_EMPTY, m_dwSize * sizeof(TPTR));
}

void Destroy()
{
ASSERT(IsValid());

free((void*)m_pv);
m_pv = nullptr;
m_dwSize = 0;
m_seqPut = 0;
m_seqGet = 0;
}


public:
CRingPool(DWORD dwSize = 0)
: m_pv(nullptr)
, m_dwSize(0)
, m_seqPut(0)
, m_seqGet(0)
{
Reset(dwSize);
}

~CRingPool()
{
Reset(0);
}

private:
CRingPool(const CRingPool&);
CRingPool operator = (const CRingPool&);

private:
DWORD m_dwSize;
VTPTR* m_pv;
char pack1[PACK_SIZE_OF(VTPTR*)];
volatile DWORD m_seqPut;
char pack4[PACK_SIZE_OF(DWORD)];
volatile DWORD m_seqGet;
char pack5[PACK_SIZE_OF(DWORD)];
};

template <class T> T* const CRingPool<T>::E_EMPTY = (T*)0x00;
template <class T> T* const CRingPool<T>::E_LOCKED = (T*)0x01;
template <class T> T* const CRingPool<T>::E_RELEASED = (T*)0x02;
template <class T> T* const CRingPool<T>::E_OCCUPIED = (T*)0x03;
template <class T> T* const CRingPool<T>::E_MAX_STATUS = (T*)0x0F;

template <class T> class CCASQueue
{
private:
struct Node;
typedef Node* NPTR;
typedef volatile Node* VNPTR;
typedef volatile ULONG VLONG;

struct Node
{
T* pValue;
VNPTR pNext;

Node(T* val, NPTR next = nullptr)
: pValue(val), pNext(next)
{

}
};

public:

void PushBack(T* pVal)
{
ASSERT(pVal != nullptr);

VNPTR pTail = nullptr;
NPTR pNode = new Node(pVal);

while(true)
{
pTail = m_pTail;

if(::InterlockedCompareExchangePointer((volatile PVOID*)&m_pTail->pNext, pNode, nullptr) == nullptr)
break;
}

::InterlockedCompareExchangePointer((volatile PVOID*)&m_pTail, pNode, (PVOID)pTail);
::InterlockedIncrement(&m_lSize);
}

BOOL PopFront(T** ppVal)
{
ASSERT(ppVal != nullptr);

BOOL isOK = FALSE;
VNPTR pNext = nullptr;

while(true)
{
pNext = m_pHead->pNext;

if(pNext == nullptr)
break;

if(::InterlockedCompareExchangePointer((volatile PVOID*)&m_pHead->pNext, (PVOID)pNext->pNext, (PVOID)pNext) == pNext)
{
*ppVal = pNext->pValue;
isOK = TRUE;

::InterlockedDecrement(&m_lSize);
delete pNext;

break;
}
}

return isOK;
}

public:

ULONG Size() {return m_lSize;}
BOOL IsEmpty() {return m_lSize == 0;}

public:

CCASQueue() : m_lSize(0)
{
NPTR pHead = new Node(nullptr);
m_pHead = m_pTail = pHead;
}

~CCASQueue()
{
ASSERT(m_pHead != nullptr);

while(m_pHead != nullptr)
{
VNPTR pNode = m_pHead->pNext;

delete m_pHead;
m_pHead = pNode;
}
}

private:
VLONG m_lSize;
VNPTR m_pHead;
VNPTR m_pTail;
};

#if !defined (_WIN64)
#pragma pack(pop)
#endif
Loading