sessionFactory 관련 질문드립니다!
330
작성한 질문수 23
강의에서 functional 헤더를 끌고와서 sessionFactory를 사용해주셨는데요! _sessionFactory가 결국 void를 받아서 SessionRef를 리턴해주는 함수인 것은 알겠는데, 메모리 할당이 어떻게 되는건지 모르겠습니다.
애초에 이게 궁금했던 이유가,
SendBufferChunkRef SendBufferManager::Pop() 에서 return값으로 주는 SendBufferChunkRef(xnew<SendBufferChunk>(), PushGlobal)과 형태가 달라서였기 때문인데요
chunkref의 경우 xnew로 생성하기 때문에 우리가 설정한 PoolAllocator 정책에 따라 메모리풀에서 가져다 쓸텐데, 위의 SessionRef session의 경우에 우리가 xnew로 호출한 것이 아니라 _sessionFactory()의 리턴값을 넣어주게되는데, 이게 세션팩토리가 메모리를 어떻게 할당하겠다고는 전혀 선언한 바가 없기 때문에 new SessionRef를 하는지 xnew<SessionRef>를 하는지를 모르겠습니다. 아마 그냥 new SessionRef를 할 것 같다고 추측만 하고 있습니다.
어찌어찌 이를 좀 더 알아보기 위해서 GetImpl까지 들어왔고 _MyStorage._Ptrs 를 호출하는것까지는 봤는데 여기서 더 이상 진행이 안 되네요ㅠ 짧은생각에 추측하기로 그냥 new로 때릴 것 같깉한데 _MyStorage._Ptr 에서 끝나버려서 잘 모르겠습니다..!
사실 그냥 new여도 크게 상관은 없어보이는데 복습하다가 잘 이해가 안 가서 질문드렸습니다! 인터넷으로 검색도 해보긴했는데, 제가 뭘 모르는지 모르는 초보 수준이라 c++ function default allocator, std::function return value 이런식으로 찾아봤는데 잘 못 찾겠더라구요ㅠ
답변 1
1
_sessionFactory가 결국 void를 받아서 SessionRef를 리턴해주는 함수인 것은 알겠는데
_sessionFactory가 void를 받아서 SessionRef를 리턴해주는 함수인 것은 아니고,
정확히는 그런 함수를 저장할 수 있는 변수에 불과합니다.
즉 일종의 함수 포인터라고 생각하면 됩니다.
_sessionFactory에다가 어떤 함수를 지정해줘야 하는데,
그 부분은 Service 쪽에서 해주고 있고
실제 컨텐츠 코드에서 함수를 지정해주는 겁니다.
MakeShared<GameSession>을 세션 생성 함수로 지정했으니
_sessionFactory가 호출되면, MakeShared<GameSession>가 실행되는 것이죠.
그런데 왜 굳이 함수 포인터를 사용했을까요?
즉 ServerCore에서 MakeShared<Session>을 하지 않은 이유가 있을까요?
~에 대해서 잘 생각해보실 필요가 있습니다.
Session은 아직 미완성인 class이고 나중에 컨텐츠 단에서는
GameSession처럼 Session을 상속 받아서 기능을 추가할 필요가 생기는데,
MakeShared<Session>으로 ServerCore에서 바로 만들어 버리면
이를 확장성 있게 사용할 수 없기에
Session 생성하는 함수 자체를 컨텐츠 코드에서 지정하는 것이죠.
0
팩토리는 결국 기본 클래스인 Session이 아니라 확장클래스인 GameSession ClientSession 등등의 shared_ptr을 뱉어내야하기 때문에 함수포인터로 넘겨주고 서비스에서 세션을 생성할 때 _sessionFactory()를 호출해서 전달받은 함수포인터 실행 >> MakeShared<GameSession>() 실행.
서비스에서 factory 지정해주는 것까지 분명히 흐름은 알고 있었는데
따로 떼놓고 _sessionFactory() 코드를 보는 순간 컨텐츠단에서 serviceref 생성자에서 매개변수로 밀어넣어준 과정들은 다 까먹어버리고 바로 무지성이 되버리네요ㅠㅜ 감사합니당!
writeLock을 잡을때 꼭 empty 상태여야하는 이유?
0
63
2
Memory Pool에서 오버플로우 질문입니다.
0
94
2
포토폴리오 및 진로 관련하여 고민입니다.
0
169
1
포토폴리오 관련 고민입니다.
0
91
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
107
2
성능 테스트 결과
0
117
2
게임 서버 Stateful, Stateless 진로 고민
0
147
1
WaitOnAddress와 Sleep의 차이 질문
0
98
1
궁금한거 있습니다.
0
92
2
JobTimer 구동 스레드
0
116
2
TryPop() 동작 관련 질문
0
86
1
로드맵 C#서버 C++서버 방향성 질문
0
162
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
81
1
생명주기를 위한 의도적 복사
0
94
2
락프리의 실무에서 사용 질문
0
154
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
109
2
mutex와 sleep 차이점
0
133
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
167
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
102
1
공부법 관련해서
0
190
2
MakeShared 함수 관련
0
119
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
152
2
운영체제관련 질문입니다
0
144
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
125
2





