Changeset 5f5d375 in mainline


Ignore:
Timestamp:
2024-10-08T15:12:03Z (3 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
5e0acaa
Parents:
c7ecd290
git-author:
Jiri Svoboda <jiri@…> (2024-10-07 18:11:43)
git-committer:
Jiri Svoboda <jiri@…> (2024-10-08 15:12:03)
Message:

Split read/write lock in remcons

We do not want waiting for event to block output.

Location:
uspace/srv/hid/remcons
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/remcons/remcons.c

    rc7ecd290 r5f5d375  
    540540                    "failed: %s.", APP_GETTERM, user->service_name, APP_SHELL,
    541541                    str_error(rc));
    542                 fibril_mutex_lock(&user->guard);
     542                fibril_mutex_lock(&user->recv_lock);
    543543                user->task_finished = true;
    544544                user->srvs.aborted = true;
    545545                fibril_condvar_signal(&user->refcount_cv);
    546                 fibril_mutex_unlock(&user->guard);
     546                fibril_mutex_unlock(&user->recv_lock);
    547547                return EOK;
    548548        }
    549549
    550         fibril_mutex_lock(&user->guard);
     550        fibril_mutex_lock(&user->recv_lock);
    551551        user->task_id = task;
    552         fibril_mutex_unlock(&user->guard);
     552        fibril_mutex_unlock(&user->recv_lock);
    553553
    554554        task_exit_t task_exit;
     
    560560
    561561        /* Announce destruction. */
    562         fibril_mutex_lock(&user->guard);
     562        fibril_mutex_lock(&user->recv_lock);
    563563        user->task_finished = true;
    564564        user->srvs.aborted = true;
    565565        fibril_condvar_signal(&user->refcount_cv);
    566         fibril_mutex_unlock(&user->guard);
     566        fibril_mutex_unlock(&user->recv_lock);
    567567
    568568        return EOK;
     
    728728
    729729        /* Wait for all clients to exit. */
    730         fibril_mutex_lock(&user->guard);
     730        fibril_mutex_lock(&user->recv_lock);
    731731        while (!user_can_be_destroyed_no_lock(user)) {
    732732                if (user->task_finished) {
     
    740740                        }
    741741                }
    742                 fibril_condvar_wait_timeout(&user->refcount_cv, &user->guard, 1000);
    743         }
    744         fibril_mutex_unlock(&user->guard);
     742                fibril_condvar_wait_timeout(&user->refcount_cv, &user->recv_lock, 1000);
     743        }
     744        fibril_mutex_unlock(&user->recv_lock);
    745745
    746746        rc = loc_service_unregister(remcons_srv, user->service_id);
  • uspace/srv/hid/remcons/user.c

    rc7ecd290 r5f5d375  
    9797
    9898        fibril_condvar_initialize(&user->refcount_cv);
    99         fibril_mutex_initialize(&user->guard);
     99        fibril_mutex_initialize(&user->send_lock);
     100        fibril_mutex_initialize(&user->recv_lock);
    100101        user->task_finished = false;
    101102        user->socket_closed = false;
     
    151152
    152153        telnet_user_t *tmp = user;
    153         fibril_mutex_lock(&tmp->guard);
     154        fibril_mutex_lock(&tmp->recv_lock);
    154155        user->locsrv_connection_count++;
    155156
     
    163164        }
    164165
    165         fibril_mutex_unlock(&tmp->guard);
     166        fibril_mutex_unlock(&tmp->recv_lock);
    166167
    167168        fibril_mutex_unlock(&users_guard);
     
    176177void telnet_user_notify_client_disconnected(telnet_user_t *user)
    177178{
    178         fibril_mutex_lock(&user->guard);
     179        fibril_mutex_lock(&user->recv_lock);
    179180        assert(user->locsrv_connection_count > 0);
    180181        user->locsrv_connection_count--;
    181182        fibril_condvar_signal(&user->refcount_cv);
    182         fibril_mutex_unlock(&user->guard);
     183        fibril_mutex_unlock(&user->recv_lock);
    183184}
    184185
     
    189190bool telnet_user_is_zombie(telnet_user_t *user)
    190191{
    191         fibril_mutex_lock(&user->guard);
     192        fibril_mutex_lock(&user->recv_lock);
    192193        bool zombie = user->socket_closed || user->task_finished;
    193         fibril_mutex_unlock(&user->guard);
     194        fibril_mutex_unlock(&user->recv_lock);
    194195
    195196        return zombie;
     
    401402{
    402403        uint8_t *bp = (uint8_t *)buf;
    403         fibril_mutex_lock(&user->guard);
     404        fibril_mutex_lock(&user->recv_lock);
    404405
    405406        assert(size > 0);
     
    417418                            &next_byte);
    418419                        if (rc != EOK) {
    419                                 fibril_mutex_unlock(&user->guard);
     420                                fibril_mutex_unlock(&user->recv_lock);
    420421                                return rc;
    421422                        }
     
    453454        } while (size > 0 && (telnet_user_byte_avail(user) || *nread == 0));
    454455
    455         fibril_mutex_unlock(&user->guard);
     456        fibril_mutex_unlock(&user->recv_lock);
    456457        return EOK;
    457458}
     
    534535    size_t size)
    535536{
    536         fibril_mutex_lock(&user->guard);
     537        fibril_mutex_lock(&user->send_lock);
    537538
    538539        errno_t rc = telnet_user_send_data_locked(user, data, size);
    539540
    540         fibril_mutex_unlock(&user->guard);
     541        fibril_mutex_unlock(&user->send_lock);
    541542
    542543        return rc;
     
    552553    size_t size)
    553554{
    554         fibril_mutex_lock(&user->guard);
     555        fibril_mutex_lock(&user->send_lock);
    555556
    556557        errno_t rc = telnet_user_send_raw_locked(user, data, size);
    557558
    558         fibril_mutex_unlock(&user->guard);
     559        fibril_mutex_unlock(&user->send_lock);
    559560
    560561        return rc;
     
    577578        errno_t rc;
    578579
    579         fibril_mutex_lock(&user->guard);
     580        fibril_mutex_lock(&user->send_lock);
    580581        rc = telnet_user_flush_locked(user);
    581         fibril_mutex_unlock(&user->guard);
     582        fibril_mutex_unlock(&user->send_lock);
    582583        return rc;
    583584}
     
    592593void telnet_user_update_cursor_x(telnet_user_t *user, int new_x)
    593594{
    594         fibril_mutex_lock(&user->guard);
     595        fibril_mutex_lock(&user->send_lock);
    595596        if (user->cursor_x - 1 == new_x) {
    596597                char data = '\b';
     
    599600        }
    600601        user->cursor_x = new_x;
    601         fibril_mutex_unlock(&user->guard);
     602        fibril_mutex_unlock(&user->send_lock);
    602603
    603604}
  • uspace/srv/hid/remcons/user.h

    rc7ecd290 r5f5d375  
    5252/** Representation of a connected (human) user. */
    5353typedef struct {
    54         /** Mutex guarding the whole structure. */
    55         fibril_mutex_t guard;
     54        /** Synchronize send operations */
     55        fibril_mutex_t send_lock;
     56        /** Synchronize receive operations */
     57        fibril_mutex_t recv_lock;
    5658        /** Callback functions */
    5759        telnet_cb_t *cb;
Note: See TracChangeset for help on using the changeset viewer.