Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/udp/udp.c

    ra8a13d0 raadf01e  
    418418        struct sockaddr * addr;
    419419        size_t addrlen;
     420        fibril_rwlock_t lock;
    420421        ipc_call_t answer;
    421422        int answer_count;
     
    432433
    433434        socket_cores_initialize(&local_sockets);
     435        fibril_rwlock_initialize(&lock);
    434436
    435437        while(keep_on_going){
     
    451453                                break;
    452454                        case NET_SOCKET:
     455                                fibril_rwlock_write_lock(&lock);
    453456                                *SOCKET_SET_SOCKET_ID(answer) = SOCKET_GET_SOCKET_ID(call);
    454457                                res = socket_create(&local_sockets, app_phone, NULL, SOCKET_SET_SOCKET_ID(answer));
     458                                fibril_rwlock_write_unlock(&lock);
    455459                                if(res == EOK){
    456460                                        if(tl_get_ip_packet_dimension(udp_globals.ip_phone, &udp_globals.dimensions, DEVICE_INVALID_ID, &packet_dimension) == EOK){
     
    465469                                res = data_receive((void **) &addr, &addrlen);
    466470                                if(res == EOK){
     471                                        fibril_rwlock_read_lock(&lock);
    467472                                        fibril_rwlock_write_lock(&udp_globals.lock);
    468473                                        res = socket_bind(&local_sockets, &udp_globals.sockets, SOCKET_GET_SOCKET_ID(call), addr, addrlen, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, udp_globals.last_used_port);
    469474                                        fibril_rwlock_write_unlock(&udp_globals.lock);
     475                                        fibril_rwlock_read_unlock(&lock);
    470476                                        free(addr);
    471477                                }
     
    474480                                res = data_receive((void **) &addr, &addrlen);
    475481                                if(res == EOK){
     482                                        fibril_rwlock_read_lock(&lock);
    476483                                        fibril_rwlock_write_lock(&udp_globals.lock);
    477484                                        res = udp_sendto_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), addr, addrlen, SOCKET_GET_DATA_FRAGMENTS(call), SOCKET_SET_DATA_FRAGMENT_SIZE(answer), SOCKET_GET_FLAGS(call));
     
    481488                                                answer_count = 2;
    482489                                        }
     490                                        fibril_rwlock_read_unlock(&lock);
    483491                                        free(addr);
    484492                                }
    485493                                break;
    486494                        case NET_SOCKET_RECVFROM:
     495                                fibril_rwlock_read_lock(&lock);
    487496                                fibril_rwlock_write_lock(&udp_globals.lock);
    488497                                res = udp_recvfrom_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_FLAGS(call), &addrlen);
    489498                                fibril_rwlock_write_unlock(&udp_globals.lock);
     499                                fibril_rwlock_read_unlock(&lock);
    490500                                if(res > 0){
    491501                                        *SOCKET_SET_READ_DATA_LENGTH(answer) = res;
     
    496506                                break;
    497507                        case NET_SOCKET_CLOSE:
     508                                fibril_rwlock_write_lock(&lock);
    498509                                fibril_rwlock_write_lock(&udp_globals.lock);
    499510                                res = socket_destroy(udp_globals.net_phone, SOCKET_GET_SOCKET_ID(call), &local_sockets, &udp_globals.sockets, NULL);
    500511                                fibril_rwlock_write_unlock(&udp_globals.lock);
     512                                fibril_rwlock_write_unlock(&lock);
    501513                                break;
    502514                        case NET_SOCKET_GETSOCKOPT:
     
    507519                }
    508520        }
    509 
    510         // release the application phone
    511         ipc_hangup(app_phone);
    512521
    513522        // release all local sockets
Note: See TracChangeset for help on using the changeset viewer.