22,7 → 22,7 |
PrevPtr dd ? ; pointer to previous socket in list |
Number dd ? ; socket number |
|
lock dd ? ; lock mutex |
mutex MUTEX |
|
PID dd ? ; application process id |
Domain dd ? ; INET/UNIX/.. |
450,8 → 450,10 |
|
align 4 |
.udp: |
lea ebx, [eax + SOCKET.lock] |
call wait_mutex |
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |
popa |
|
pushw [edx + 2] |
pop [eax + UDP_SOCKET.RemotePort] |
470,14 → 472,18 |
init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
pop eax |
|
mov [eax + SOCKET.lock], 0 |
lea ecx, [eax + SOCKET.mutex] |
call mutex_unlock |
|
mov dword [esp+32], 0 |
ret |
|
align 4 |
.tcp: |
lea ebx, [eax + SOCKET.lock] |
call wait_mutex |
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |
popa |
|
pushw [edx + 2] |
pop [eax + TCP_SOCKET.RemotePort] |
509,7 → 515,10 |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_create |
|
mov [ebx + SOCKET.lock], 0 |
pusha |
lea ecx, [ebx + SOCKET.mutex] |
call mutex_unlock |
popa |
|
mov eax, ebx |
call TCP_output |
519,8 → 528,10 |
|
align 4 |
.ip: |
lea ebx, [eax + SOCKET.lock] |
call wait_mutex |
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |
popa |
|
pushd [edx + 4] |
pop [eax + IP_SOCKET.RemoteIP] |
529,7 → 540,9 |
init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
pop eax |
|
mov [eax + SOCKET.lock], 0 |
lea ecx, [eax + SOCKET.mutex] |
call mutex_unlock |
|
mov dword [esp+32], 0 |
ret |
|
1051,12 → 1064,22 |
|
DEBUGF 1,"SOCKET_input: queued packet successfully\n" |
add esp, sizeof.socket_queue_entry |
mov [eax + SOCKET.lock], 0 |
|
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_unlock |
popa |
|
jmp SOCKET_notify_owner |
|
.full: |
DEBUGF 2,"SOCKET_input: socket %x is full!\n", eax |
mov [eax + SOCKET.lock], 0 |
|
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_unlock |
popa |
|
call kernel_free |
add esp, 8 |
|
1364,11 → 1387,18 |
|
test ebx, ebx |
jz @f |
add ebx, SOCKET.lock ; lock the next socket |
call wait_mutex |
sub ebx, SOCKET.lock |
|
pusha |
lea ecx, [ebx + SOCKET.mutex] |
call mutex_lock |
popa |
|
mov [ebx + SOCKET.PrevPtr], eax |
mov [ebx + SOCKET.lock], 0 ; and unlock it again |
|
pusha |
lea ecx, [ebx + SOCKET.mutex] |
call mutex_unlock |
popa |
@@: |
|
mov [net_sockets + SOCKET.NextPtr], eax |
1398,9 → 1428,12 |
jz .error |
|
push ebx |
lea ebx, [eax + SOCKET.lock] |
call wait_mutex |
|
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |
popa |
|
DEBUGF 1, "SOCKET_free: freeing socket..\n" |
|
cmp [eax + SOCKET.Domain], AF_INET4 |