Implement ipc_netsockdelete() syscall and automatic dangling socket cleanup

This commit is contained in:
2025-10-29 21:21:35 +01:00
parent 7db6a8e130
commit 4417141216
12 changed files with 107 additions and 7 deletions

View File

@ -11,7 +11,7 @@ int32_t SYSCALL3(sys_ipc_netsockmake, net1, proto1, port1) {
uint16_t proto = proto1;
uint16_t port = port1;
IpcNetSock *netsock = ipc_netsockmake(net, proto, port);
IpcNetSock *netsock = ipc_netsockmake(net, proto, port, _caller_pid);
if (netsock == NULL) {
return E_NOMEMORY;
@ -82,3 +82,23 @@ int32_t SYSCALL1(sys_ipc_netsockpollev, socknum1) {
return (int32_t)ev;
}
int32_t SYSCALL1(sys_ipc_netsockdelete, socknum1) {
size_t socknum = socknum1;
spinlock_acquire(&IPC_NETSOCKS.spinlock);
size_t idx = 0;
IpcNetSock *ns, *nstmp;
LL_FOREACH_SAFE_IDX(IPC_NETSOCKS.netsocks, ns, nstmp, idx) {
if (idx == socknum) {
break;
}
}
spinlock_release(&IPC_NETSOCKS.spinlock);
if (ns == NULL) {
return E_NOENTRY;
}
return ipc_netsockdelete(ns);
}

View File

@ -8,5 +8,6 @@
int32_t SYSCALL3(sys_ipc_netsockmake, net1, proto1, port1);
int32_t SYSCALL2(sys_ipc_netsocklisten, socknum1, maxlisteners1);
int32_t SYSCALL1(sys_ipc_netsockpollev, socknum1);
int32_t SYSCALL1(sys_ipc_netsockdelete, socknum1);
#endif // SYSCALL_IPC_NETSOCK_H_

View File

@ -68,4 +68,5 @@ SyscallFn SYSCALL_TABLE[SYSCALLS_MAX] = {
[SYS_IPC_NETSOCKMAKE] = &sys_ipc_netsockmake,
[SYS_IPC_NETSOCKLISTEN] = &sys_ipc_netsocklisten,
[SYS_IPC_NETSOCKPOLLEV] = &sys_ipc_netsockpollev,
[SYS_IPC_NETSOCKDELETE] = &sys_ipc_netsockdelete,
};