inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

session의 생명주기 관련 질문입니다.

417

snu

작성한 질문수 34

0

안녕하세요 Session#1 강의를 듣다가 질문드립니다.

1. Session의 생명주기를 정리해봤는데 선생님께서 의도하신 세션 생명주기와 일치하는지 질문드립니다.

2. RegisterRecv() 하여 REFCOUNT= 4; 가 되었을 때 다음 동작으로

bool IocpCore::Distpatch(uint32 timeoutMs) or void Listener::RegisterAccept(AcceptEvent * acceptEvent)

둘 중 어느 함수가 먼저 호출될지 상황마다 다른건지 궁금합니다.

Dispatch 함수가 먼저 호출될 경우는 REFCOUNT =5 가 되었다가 RegisterAccept에서 세션 교체에 의해 다시 4가 될것이고 RegisterAccept 먼저 호출시에는 REFCOUNT가 3으로 먼저 깎일 수 있기 때문입니다.

3. 디버깅 해보니 AcceptEx나 WSARecv에서 Overlapped 인자로 이벤트 인자를 넘기는데, 이 이벤트 객체의 Reference 카운트가 GetQueuedCompletionStatus 함수에서 꺼내올 때 그대로 유지되는거 같은데 GetQueuedCompletionStatus  전에 누가 Reference 카운트를 1감소 시키면 1감소된 만큼 GetQueuedCompletionStatus 에서 복원될까요?

-----------------------------------------------------------------------------------------

Listener::RegisterAccept() 함수

 

SessionRef session = _service->CreateSession(); //+1

REFCOUNT = 1

acceptEvent->session = session; //+1

REFCOUNT = 2

SessionRef session = _service->CreateSession(); Register Accept 리턴시 session 지역변수 소멸, -1

REFCOUNT = 1

-----------------------------------------------------------------------------------------

Listener::ProcessAccept() 함수

 

SessionRef session = acceptEvent->session; //+1

REFCOUNT = 2

-----------------------------------------------------------------------------------------

void Session::ProcessConnect() 함수

 

GetService()->AddSession(GetSessionRef()); // +1

REFCOUNT = 3

-----------------------------------------------------------------------------------------

void Session::RegisterRecv() 함수

 

_recvEvent.owner = shared_from_this(); // ADD_REF //+1

REFCOUNT = 4;

-----------------------------------------------------------------------------------------

void Listener::RegisterAccept(AcceptEvent* acceptEvent)

 

acceptEvent->session = session; // 세션 교체

REFCOUNT = 3;

-----------------------------------------------------------------------------------------

Listener::ProcessAccept() 함수

 

SessionRef session = acceptEvent->session;  // ProcessAccept 함수 소멸시 session 지역변수 소멸,-1

REFCOUNT = 2

-----------------------------------------------------------------------------------------

bool IocpCore::Dispatch(uint32 timeoutMs)

 

IocpObjectRef iocpObject = iocpEvent->owner; // RegisterRecv IOCP 값으로 owner session 일 경우 +1

REFCOUNT = 3

-----------------------------------------------------------------------------------------

void Session::ProcessRecv(int32 numOfBytes)

 

_recvEvent.owner = nullptr; // RELEASE_REF ,-1

REFCOUNT = 2

 

if (numOfBytes == 0) 일경우

GetService()->ReleaseSession(GetSessionRef()); //-1

REFCOUNT = 1

-----------------------------------------------------------------------------------------

bool IocpCore::Dispatch(uint32 timeoutMs)

 

IocpObjectRef iocpObject = iocpEvent->owner; // Dispatch 리턴시 iocpObject 지역 변수 소멸, -1

REFCOUNT = 0

 

 

 

network MMORPG windows-server

답변 1

1

Rookiss

RefCount는 관리되고 있다는 사실이 중요하지,
누가 어떻게 어느 순서로 줄이고 늘이는지는 관심을 둘 필요 없습니다.
나중에 가면 Session또한 컨텐츠 코드에서 (SessionManager 등)
들고 있기 때문에 더 늘어날 수도 있습니다.

3. 디버깅 해보니 AcceptEx나 WSARecv에서 Overlapped 인자로 이벤트 인자를 넘기는데, 이 이벤트 객체의 Reference 카운트가 GetQueuedCompletionStatus 함수에서 꺼내올 때 그대로 유지되는거 같은데 GetQueuedCompletionStatus  전에 누가 Reference 카운트를 1감소 시키면 1감소된 만큼 GetQueuedCompletionStatus 에서 복원될까요?

GQCS에 넘겨준건 단순히 주소일 뿐이고,
여기에다 우리가 무엇을 해준 것은 아니기에
'당연히' GQCS 이후 외부에서 누가 건드리지 않는다면, RefCount는 그대로 유지됩니다.
GQCS 전에 누가 RefCount를 조작하면, 최종 결과 수치를 가진 객체로 복원됩니다.

Memory Pool에서 오버플로우 질문입니다.

0

63

2

포토폴리오 및 진로 관련하여 고민입니다.

0

112

1

포토폴리오 관련 고민입니다.

0

62

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

82

2

성능 테스트 결과

0

103

2

게임 서버 Stateful, Stateless 진로 고민

0

121

1

WaitOnAddress와 Sleep의 차이 질문

0

83

1

궁금한거 있습니다.

0

82

2

JobTimer 구동 스레드

0

107

2

TryPop() 동작 관련 질문

0

81

1

로드맵 C#서버 C++서버 방향성 질문

0

148

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

73

1

생명주기를 위한 의도적 복사

0

86

2

락프리의 실무에서 사용 질문

0

139

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

101

2

mutex와 sleep 차이점

0

117

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

152

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

96

1

공부법 관련해서

0

183

2

MakeShared 함수 관련

0

114

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

144

2

운영체제관련 질문입니다

0

131

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

117

2

메모리 풀 질문있습니다.

0

124

1