separate thread and process ID's for sockets.

git-svn-id: svn://kolibrios.org@3264 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-02-23 16:38:26 +00:00
parent 75968b0534
commit 6b57089391

View File

@ -26,7 +26,8 @@ struct SOCKET
mutex MUTEX mutex MUTEX
PID dd ? ; application process id PID dd ? ; process ID
TID dd ? ; thread ID
Domain dd ? ; INET/LOCAL/.. Domain dd ? ; INET/LOCAL/..
Type dd ? ; RAW/STREAM/DGRAP Type dd ? ; RAW/STREAM/DGRAP
Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP
@ -682,10 +683,10 @@ SOCKET_accept:
; Ok, we got a socket ptr ; Ok, we got a socket ptr
mov eax, [esi] mov eax, [esi]
; Change PID to that of the current process ; Change thread ID to that of the current thread
mov ebx, [TASK_BASE] mov ebx, [TASK_BASE]
mov ebx, [ebx + TASKDATA.pid] mov ebx, [ebx + TASKDATA.pid]
mov [eax + SOCKET.PID], ebx mov [eax + SOCKET.TID], ebx
; Convert it to a socket number ; Convert it to a socket number
call SOCKET_ptr_to_num call SOCKET_ptr_to_num
@ -717,22 +718,18 @@ SOCKET_close:
call SOCKET_num_to_ptr call SOCKET_num_to_ptr
jz s_error jz s_error
mov dword [esp+32], 0 ; The socket exists, so we will succeed in closing it.
.socket:
cmp [eax + SOCKET.Domain], AF_INET4 cmp [eax + SOCKET.Domain], AF_INET4
jne s_error jne .free
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
je .free
cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP
je .free
cmp [eax + SOCKET.Protocol], IP_PROTO_IP
je .free
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp je .tcp
jmp s_error .free:
call SOCKET_free
ret
.tcp: .tcp:
cmp [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED ; state must be LISTEN, SYN_SENT or CLOSED cmp [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED ; state must be LISTEN, SYN_SENT or CLOSED
@ -741,15 +738,6 @@ SOCKET_close:
call TCP_usrclosed call TCP_usrclosed
call TCP_output ;;;; Fixme: is this nescessary?? call TCP_output ;;;; Fixme: is this nescessary??
;;; TODO: wait for successfull termination if blocking socket
mov dword [esp+32], 0
ret
.free:
call SOCKET_free
mov dword [esp+32], 0
ret ret
@ -838,6 +826,7 @@ SOCKET_receive_local:
mov ebx, [TASK_BASE] mov ebx, [TASK_BASE]
mov ebx, [ebx + TASKDATA.pid] mov ebx, [ebx + TASKDATA.pid]
mov [eax + SOCKET.PID], ebx mov [eax + SOCKET.PID], ebx
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :(
@@: @@:
mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream
@ -972,6 +961,7 @@ SOCKET_send_local:
mov ebx, [TASK_BASE] mov ebx, [TASK_BASE]
mov ebx, [ebx + TASKDATA.pid] mov ebx, [ebx + TASKDATA.pid]
mov [eax + SOCKET.PID], ebx mov [eax + SOCKET.PID], ebx
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :(
@@: @@:
mov [eax + SOCKET.snd_proc], SOCKET_send_local_ mov [eax + SOCKET.snd_proc], SOCKET_send_local_
@ -1608,8 +1598,12 @@ SOCKET_block:
; Suspend the thread ; Suspend the thread
push edx push edx
mov edx, [TASK_BASE] mov edx, [TASK_BASE]
DEBUGF 1,"SOCKET_block: suspending PID: %u\n", [edx + TASKDATA.pid]
mov [edx + TASKDATA.state], 1 ; Suspended mov [edx + TASKDATA.state], 1 ; Suspended
; Remember the thread ID so we can wake it up again
mov edx, [edx + TASKDATA.pid]
DEBUGF 1,"SOCKET_block: suspending thread: %u\n", edx
mov [eax + SOCKET.TID], edx
pop edx pop edx
call change_task call change_task
@ -1649,7 +1643,7 @@ SOCKET_notify:
; socket exists and is of non blocking type. ; socket exists and is of non blocking type.
; We'll try to flag an event to the thread ; We'll try to flag an event to the thread
mov eax, [eax + SOCKET.PID] mov eax, [eax + SOCKET.TID]
test eax, eax test eax, eax
jz .done jz .done
mov ecx, 1 mov ecx, 1
@ -1680,7 +1674,7 @@ SOCKET_notify:
and [eax + SOCKET.state], not SS_BLOCKED and [eax + SOCKET.state], not SS_BLOCKED
; Find the thread's TASK_DATA ; Find the thread's TASK_DATA
mov eax, [eax + SOCKET.PID] mov eax, [eax + SOCKET.TID]
test eax, eax test eax, eax
jz .error jz .error
xor ecx, ecx xor ecx, ecx
@ -1769,6 +1763,7 @@ SOCKET_alloc:
mov ebx, [TASK_BASE] mov ebx, [TASK_BASE]
mov ebx, [ebx + TASKDATA.pid] mov ebx, [ebx + TASKDATA.pid]
mov [eax + SOCKET.PID], ebx mov [eax + SOCKET.PID], ebx
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :(
; init mutex ; init mutex
pusha pusha
@ -2057,40 +2052,27 @@ SOCKET_check_owner:
align 4 align 4
SOCKET_process_end: SOCKET_process_end:
DEBUGF 1,"SOCKET_process_end: %x\n", edx DEBUGF 1, "SOCKET_process_end: %x\n", edx
push ebx push ebx
mov ebx, net_sockets mov ebx, net_sockets
.next_socket: .next_socket:
mov ebx, [ebx + SOCKET.NextPtr] mov ebx, [ebx + SOCKET.NextPtr]
.test_socket:
test ebx, ebx test ebx, ebx
jz .done jz .done
cmp [ebx + SOCKET.PID], edx cmp [ebx + SOCKET.PID], edx
jne .next_socket jne .next_socket
DEBUGF 1,"SOCKET_process_end: killing socket %x\n", ebx DEBUGF 1, "SOCKET_process_end: killing socket %x\n", ebx
mov [ebx + SOCKET.PID], 0 mov [ebx + SOCKET.PID], 0
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
; The socket is stateless, just kill it right away!
mov eax, ebx mov eax, ebx
mov ebx, [ebx + SOCKET.NextPtr] pusha
call SOCKET_free call SOCKET_close.socket
jmp .test_socket popa
jmp .next_socket
.tcp:
push [ebx + SOCKET.NextPtr]
mov eax, ebx
call TCP_disconnect
pop ebx
jmp .test_socket
.done: .done:
pop ebx pop ebx