Valid 3 code version

This commit is contained in:
TXuian
2024-10-31 12:42:45 +08:00
parent 7b6c93d391
commit 3e1479bdf0
34 changed files with 831 additions and 520 deletions
@@ -70,12 +70,12 @@ char* kalloc(uintptr_t size)
void* kalloc_by_ownership(TraceTag owner, uintptr_t size)
{
void* new_mem = kalloc(size);
if (!new_mem) {
if (NULL == new_mem) {
return NULL;
}
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
usage->mem_block_root = rbt_insert(usage->mem_block_root, (uintptr_t)new_mem, NULL);
assert(0 == rbt_insert(&usage->mem_block_map, (uintptr_t)new_mem, NULL));
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, new_mem);
return new_mem;
}
@@ -89,9 +89,9 @@ bool kfree_by_ownership(TraceTag owner, void* vaddr)
{
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, vaddr);
RbtNode* node = rbt_search(usage->mem_block_root, (uintptr_t)vaddr);
RbtNode* node = rbt_search(&usage->mem_block_map, (uintptr_t)vaddr);
assert(NULL != node);
usage->mem_block_root = rbt_delete(usage->mem_block_root, node);
assert(0 == rbt_delete(&usage->mem_block_map, node->key));
return kfree(vaddr);
}
@@ -110,11 +110,33 @@ char* raw_alloc(size_t size)
return mem_alloc;
}
void* raw_alloc_by_ownership(TraceTag owner, uintptr_t size)
{
void* new_mem = raw_alloc(size);
if (!new_mem) {
return NULL;
}
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
assert(0 == rbt_insert(&usage->mem_block_map, (uintptr_t)new_mem, NULL));
return new_mem;
}
bool raw_free(char* paddr)
{
return KBuddyFree(&user_phy_freemem_buddy, paddr);
}
bool raw_free_by_ownership(TraceTag owner, void* vaddr)
{
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
RbtNode* node = rbt_search(&usage->mem_block_map, (uintptr_t)vaddr);
assert(NULL != node);
assert(0 == rbt_delete(&usage->mem_block_map, node->key));
return raw_free(vaddr);
}
void show_phymem_info()
{
KFreePagesInfo(&user_phy_freemem_buddy);
@@ -161,7 +161,7 @@ static uintptr_t _resize_user_pgdir(struct MemSpace* pmemspace, uintptr_t old_si
uintptr_t size_needed = ALIGNUP(new_size, PAGE_SIZE) - cur_size;
// char* new_page = kalloc(size_needed);
char* new_page = kalloc_by_ownership(pmemspace->mem_usage.tag, size_needed);
char* new_page = kalloc_by_ownership(pmemspace->kernspace_mem_usage.tag, size_needed);
if (new_page == NULL) {
ERROR("No memory\n");
return cur_size;
@@ -213,6 +213,14 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
return NULL;
}
sem_id_t new_sem_id = ksemaphore_alloc(&xizi_task_manager.semaphore_pool, 0);
if (new_sem_id == INVALID_SEM_ID) {
ERROR("No memory to alloc sem\n");
slab_free(SessionAllocator(), session_backend);
return NULL;
}
session_backend->client_sem_to_wait = new_sem_id;
int true_capacity = ALIGNUP(capacity, PAGE_SIZE);
int nr_pages = true_capacity / PAGE_SIZE;
/* alloc free memory as share memory */
@@ -220,6 +228,7 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
if (UNLIKELY(kern_vaddr == (uintptr_t)NULL)) {
ERROR("No memory for session\n");
slab_free(SessionAllocator(), session_backend);
ksemaphore_free(&xizi_task_manager.semaphore_pool, new_sem_id);
return NULL;
}
@@ -229,6 +238,7 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
if (UNLIKELY(client_vaddr == (uintptr_t)NULL)) {
kfree((char*)kern_vaddr);
slab_free(SessionAllocator(), session_backend);
ksemaphore_free(&xizi_task_manager.semaphore_pool, new_sem_id);
return NULL;
}
@@ -238,6 +248,7 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
unmap_task_share_pages(client, client_vaddr, nr_pages);
kfree((char*)kern_vaddr);
slab_free(SessionAllocator(), session_backend);
ksemaphore_free(&xizi_task_manager.semaphore_pool, new_sem_id);
return NULL;
}
@@ -253,6 +264,7 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
session_backend->client_side.closed = false;
doubleListNodeInit(&session_backend->client_side.node);
doubleListAddOnBack(&session_backend->client_side.node, &client->cli_sess_listhead);
rbt_insert(&client->cli_sess_map, session_backend->session_id, &session_backend->client_side);
// init server side session struct
session_backend->server_side.buf_addr = server_vaddr;
session_backend->server_side.capacity = true_capacity;
@@ -261,6 +273,7 @@ struct session_backend* create_share_pages(struct Thread* client, struct Thread*
session_backend->server_side.closed = false;
doubleListNodeInit(&session_backend->server_side.node);
doubleListAddOnBack(&session_backend->server_side.node, &server->svr_sess_listhead);
rbt_insert(&server->svr_sess_map, session_backend->session_id, &session_backend->server_side);
server->memspace->mem_size += true_capacity;
client->memspace->mem_size += true_capacity;
@@ -306,6 +319,8 @@ int delete_share_pages(struct session_backend* session_backend)
slab_free(SessionAllocator(), (void*)session_backend);
}
ksemaphore_free(&xizi_task_manager.semaphore_pool, session_backend->client_sem_to_wait);
return 0;
}