Valid 3 code version
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user