메모리풀

castle_ticket·2022년 10월 11일

개발 시 주의 사항.

Memory Pool 개발 자체는 로직은 모두 RL를 참고해서 만들면 된다.
Allocate 요청 하는 부분은 MakeRLData 부분에서 모두 해서 패스에 넣어준 된다. 하지만 삭제 처리 부분을 처리할 때 아래 상황을 반드시 체크하자.
AllPathDelete 처리 부분(이탈 뿐만 아니라 사전송출 패스 삭제, updateDeviateion 에서 이탈 처리되는 부분이 있는지 Check 하고 , 로그 기반 패스 생성이 삭제 될때도 체크하자)
MainPath 후방 삭제
SubPath 삭제
b.c 개발 할때는 실수가 잘 나오지 않는다 너무 뻔하기 때문에 ^^

개발 방법은 아래와 같다.

사실상 포인터들을 더블캐스팅 하는 과정 및 여러가지가 필요하지만 거품 다 걷어내고 쉽게 가자.

내가 기억할 건 Index/Value 두 가지 밖에 없다. 여기서 필요한 변수들을 세팅해보자.

RI_RoadLink g_lstRoadLink[ROAD_LINK_ARRAY_SIZE] = { 0, }; //125

mUInt32 g_unBlockCountCanAllocate = 0u; // 앞으로 할당할수있는 갯수
mUInt64 g_unBlockIdToAllocate = 0u; // 할당되어야하는 블록 ID
RI_RoadLink *g_ucpPage = NULL; // Header 고정!

1.할당 요청이 들어왔다.

해더 요청 부분의 주솟값을 리턴해준다. 그리고 이동해야할 위치는 한칸 이동한다.( 해더가 가르키고 있는 Value 값이 이동해야할 인덱스다)
g_unBlockIdToAllocate 여기 값을 내가 가야할 인덱스로 바꿔주는 것이다.

  1. 삭제 요청이 왔다.

삭제 요청이 오면 받았던 RL링크의 주소값의 일단 위치를 알아야하니까, g_unBlockIdToAllocate 해당 값을 MemoryPool Index에 값을 옮겨준다. (사실상 내가 마지막 어디로 할당을 하려고 했는지) 위치를 다시 기억하는 것이다.
할당이 요청이 들어온 주소값 부터 해더 값을 빼면 할당이 반납이 어디서 왔는지 알 수 있고 그 거리만큼을 g_unBlockIdToAllocate에 값으로 옮겨준다. 즉, 다음 할당이 들어오면 여기다가 채우라는 말이 된다. (빈공간이 됐으니까)

g_unBlockIdToAllocate 여기 변수의 값 위치에 할당하고 반납은 여기 g_unBlockIdToAllocate 값에 Offset을 채워준다.

profile
나만의 개발 공책

0개의 댓글