Changeset 8279aab in mainline


Ignore:
Timestamp:
2025-01-07T12:26:56Z (2 weeks ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
4e1221c
Parents:
12dd36c
git-author:
Jiri Svoboda <jiri@…> (2025-01-06 19:26:42)
git-committer:
Jiri Svoboda <jiri@…> (2025-01-07 12:26:56)
Message:

ui_lock() needs to lock display

If ui_lock() is used to lock UI while destroying a window in a separate
fibril, we need to make sure we cannot get display events for
that destroyed window.

Location:
uspace/lib
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/include/display.h

    r12dd36c r8279aab  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848extern errno_t display_open(const char *, display_t **);
    4949extern void display_close(display_t *);
     50extern void display_lock(display_t *);
     51extern void display_unlock(display_t *);
    5052extern errno_t display_get_info(display_t *, display_info_t *);
    5153
  • uspace/lib/display/src/display.c

    r12dd36c r8279aab  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    138138}
    139139
     140/*
     141 * Lock display.
     142 *
     143 * While display is locked, display event handlers will not be called.
     144 *
     145 * @param display Display
     146 */
     147void display_lock(display_t *display)
     148{
     149        fibril_mutex_lock(&display->lock);
     150}
     151
     152/*
     153 * Unlock display.
     154 *
     155 * @param display Display
     156 */
     157void display_unlock(display_t *display)
     158{
     159        fibril_mutex_unlock(&display->lock);
     160}
     161
    140162/** Initialize window parameters structure.
    141163 *
     
    700722        display_wnd_ev_t event;
    701723
     724        display_lock(display);
     725
    702726        while (true) {
    703                 fibril_mutex_lock(&display->lock);
    704 
    705727                if (display->sess != NULL)
    706728                        rc = display_get_event(display, &window, &event);
    707729                else
    708730                        rc = ENOENT;
    709 
    710                 fibril_mutex_unlock(&display->lock);
    711731
    712732                if (rc != EOK)
     
    752772        }
    753773
     774        display_unlock(display);
    754775        async_answer_0(icall, EOK);
    755776}
  • uspace/lib/ui/src/ui.c

    r12dd36c r8279aab  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    568568void ui_lock(ui_t *ui)
    569569{
     570        if (ui->display != NULL)
     571                display_lock(ui->display);
    570572        fibril_mutex_lock(&ui->lock);
    571573}
     
    582584{
    583585        fibril_mutex_unlock(&ui->lock);
     586        if (ui->display != NULL)
     587                display_unlock(ui->display);
    584588}
    585589
  • uspace/lib/ui/src/window.c

    r12dd36c r8279aab  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    978978        ui_t *ui = window->ui;
    979979
    980         ui_lock(ui);
     980        fibril_mutex_lock(&ui->lock);
    981981        ui_window_send_close(window);
    982         ui_unlock(ui);
     982        fibril_mutex_unlock(&ui->lock);
    983983}
    984984
     
    989989        ui_t *ui = window->ui;
    990990
    991         ui_lock(ui);
     991        fibril_mutex_lock(&ui->lock);
    992992        (void)nfocus;
    993993
     
    998998
    999999        ui_window_send_focus(window, nfocus);
    1000         ui_unlock(ui);
     1000        fibril_mutex_unlock(&ui->lock);
    10011001}
    10021002
     
    10071007        ui_t *ui = window->ui;
    10081008
    1009         ui_lock(ui);
     1009        fibril_mutex_lock(&ui->lock);
    10101010        ui_window_send_kbd(window, kbd_event);
    1011         ui_unlock(ui);
     1011        fibril_mutex_unlock(&ui->lock);
    10121012}
    10131013
     
    10231023                return;
    10241024
    1025         ui_lock(ui);
     1025        fibril_mutex_lock(&ui->lock);
    10261026
    10271027        claim = ui_wdecor_pos_event(window->wdecor, event);
    10281028        if (claim == ui_claimed) {
    1029                 ui_unlock(ui);
     1029                fibril_mutex_unlock(&ui->lock);
    10301030                return;
    10311031        }
    10321032
    10331033        ui_window_send_pos(window, event);
    1034         ui_unlock(ui);
     1034        fibril_mutex_unlock(&ui->lock);
    10351035}
    10361036
     
    10481048                return;
    10491049
    1050         ui_lock(ui);
     1050        fibril_mutex_lock(&ui->lock);
    10511051        (void) ui_window_resize(window, rect);
    10521052        ui_window_send_resize(window);
    1053         ui_unlock(ui);
     1053        fibril_mutex_unlock(&ui->lock);
    10541054}
    10551055
     
    10601060        ui_t *ui = window->ui;
    10611061
    1062         ui_lock(ui);
     1062        fibril_mutex_lock(&ui->lock);
    10631063
    10641064        if (window->wdecor != NULL && nfocus == 0) {
     
    10681068
    10691069        ui_window_send_unfocus(window, nfocus);
    1070         ui_unlock(ui);
     1070        fibril_mutex_unlock(&ui->lock);
    10711071}
    10721072
Note: See TracChangeset for help on using the changeset viewer.