***************************************************************************
Copyright 2021-2023,2024 Thomas E. Dickey *
Copyright 2008-2015,2017 Free Software Foundation, Inc. *
*
Permission is hereby granted, free of charge, to any person obtaining a *
copy of this software and associated documentation files (the *
"Software"), to deal in the Software without restriction, including *
without limitation the rights to use, copy, modify, merge, publish, *
distribute, distribute with modifications, sublicense, and/or sell *
copies of the Software, and to permit persons to whom the Software is *
furnished to do so, subject to the following conditions: *
*
The above copyright notice and this permission notice shall be included *
in all copies or substantial portions of the Software. *
*
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
*
Except as contained in this notice, the name(s) of the above copyright *
holders shall not be used in advertising or otherwise to promote the *
sale, use or other dealings in this Software without prior written *
authorization. *
***************************************************************************
$Id: curs_threads.3x,v 1.56 2024/03/16 15:35:01 tom Exp $
#include <curses.h>/* data types */ typedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *); typedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *);
int get_escdelay(void); int set_escdelay(int ms); int set_tabsize(int cols);
int use_screen(SCREEN *scr, NCURSES_SCREEN_CB func, void *data); int use_window(WINDOW *win, NCURSES_WINDOW_CB func, void *data);
Instead of modifying the programming interface (API) to make \%ncurses functions expect an additional argument specifying a thread, the library adds functions, usable in any configuration, that hide the mutexes (mutual exclusion locks) needed to prevent concurrent access to variables shared by multiple threads of execution.
\%ncurses threading support requires the use of functions to access members of the \%WINDOW structure (see curs_opaque(3X)). It further makes functions of the common global variables \%COLORS, \%COLOR_PAIRS, \%COLS, \%ESCDELAY, \%LINES, \%TABSIZE, \%curscr, \%newscr, and \%ttytype, maintaining them as as read-only values in the SCREEN structure.
Even this is not enough to make an application using curses thread-safe. We would expect a multi-threaded application to have threads updating separate windows (on the same device), and separate screens (on different devices). Further, applications expect a few of the global variables to be writable. The functions described here address these special situations.
The \%ESCDELAY and \%TABSIZE global variables are modified by some applications. To modify them in any configuration, use the \%set_escdelay or \%set_tabsize functions. Other global variables are not modifiable. get_escdelay retrieves \%ESCDELAY's value.
The use_window and use_screen functions provide
coarse-grained mutexes for their respective \%WINDOW and
SCREEN parameters;
they call a user-supplied function,
pass it a data parameter,
and return the value from the user-supplied function to the application.
***************************************************************************
The following table lists the scope of each symbol in the \%ncurses library when configured to support multi-threaded applications.
Symbol Scope |
BC global |
COLORS screen (read-only) |
COLOR_PAIR reentrant |
COLOR_PAIRS screen (read-only) |
COLS screen (read-only) |
ESCDELAY screen (read-only; see set_escdelay) |
LINES screen (read-only) |
PAIR_NUMBER reentrant |
PC global |
SP global |
TABSIZE screen (read-only; see set_tabsize) |
UP global |
acs_map screen (read-only) |
add_wch window (stdscr) |
add_wchnstr window (stdscr) |
add_wchstr window (stdscr) |
addch window (stdscr) |
addchnstr window (stdscr) |
addchstr window (stdscr) |
addnstr window (stdscr) |
addnwstr window (stdscr) |
addstr window (stdscr) |
addwstr window (stdscr) |
assume_default_colors screen |
attr_get window (stdscr) |
attr_off window (stdscr) |
attr_on window (stdscr) |
attr_set window (stdscr) |
attroff window (stdscr) |
attron window (stdscr) |
attrset window (stdscr) |
baudrate screen |
beep screen |
bkgd window (stdscr) |
bkgdset window (stdscr) |
bkgrnd window (stdscr) |
bkgrndset window (stdscr) |
boolcodes global (read-only) |
boolfnames global (read-only) |
boolnames global (read-only) |
border window (stdscr) |
border_set window (stdscr) |
box window (stdscr) |
box_set window (stdscr) |
can_change_color terminal |
cbreak screen |
chgat window (stdscr) |
clear window (stdscr) |
clearok window |
clrtobot window (stdscr) |
clrtoeol window (stdscr) |
color_content screen |
color_set window (stdscr) |
copywin window (locks source, target) |
cur_term terminal |
curs_set screen |
curscr screen (read-only) |
curses_version global (read-only) |
def_prog_mode terminal |
def_shell_mode terminal |
define_key screen |
del_curterm screen |
delay_output screen |
delch window (stdscr) |
deleteln window (stdscr) |
delscreen global (locks screen list, screen) |
delwin global (locks window list) |
derwin screen |
doupdate screen |
dupwin screen (locks window) |
echo screen |
echo_wchar window (stdscr) |
echochar window (stdscr) |
endwin screen |
erase window (stdscr) |
erasechar window (stdscr) |
erasewchar window (stdscr) |
filter global |
flash terminal |
flushinp screen |
get_wch screen (input operation) |
get_wstr screen (input operation) |
getattrs window |
getbegx window |
getbegy window |
getbkgd window |
getbkgrnd window |
getcchar reentrant |
getch screen (input operation) |
getcurx window |
getcury window |
getmaxx window |
getmaxy window |
getmouse screen (input operation) |
getn_wstr screen (input operation) |
getnstr screen (input operation) |
getparx window |
getpary window |
getstr screen (input operation) |
getwin screen (input operation) |
halfdelay screen |
has_colors terminal |
has_ic terminal |
has_il terminal |
has_key screen |
hline window (stdscr) |
hline_set window (stdscr) |
idcok window |
idlok window |
immedok window |
in_wch window (stdscr) |
in_wchnstr window (stdscr) |
in_wchstr window (stdscr) |
inch window (stdscr) |
inchnstr window (stdscr) |
inchstr window (stdscr) |
init_color screen |
init_pair screen |
initscr global (locks screen list) |
innstr window (stdscr) |
innwstr window (stdscr) |
ins_nwstr window (stdscr) |
ins_wch window (stdscr) |
ins_wstr window (stdscr) |
insch window (stdscr) |
insdelln window (stdscr) |
insertln window (stdscr) |
insnstr window (stdscr) |
insstr window (stdscr) |
instr window (stdscr) |
intrflush terminal |
inwstr window (stdscr) |
is_cleared window |
is_idcok window |
is_idlok window |
is_immedok window |
is_keypad window |
is_leaveok window |
is_linetouched window |
is_nodelay window |
is_notimeout window |
is_scrollok window |
is_syncok window |
is_term_resized terminal |
is_wintouched window |
isendwin screen |
key_defined screen |
key_name global (static data) |
keybound screen |
keyname global (static data) |
keyok screen |
keypad window |
killchar terminal |
killwchar terminal |
leaveok window |
longname screen |
mcprint terminal |
meta screen |
mouse_trafo window (stdscr) |
mouseinterval screen |
mousemask screen |
move window (stdscr) |
mvadd_wch window (stdscr) |
mvadd_wchnstr window (stdscr) |
mvadd_wchstr window (stdscr) |
mvaddch window (stdscr) |
mvaddchnstr window (stdscr) |
mvaddchstr window (stdscr) |
mvaddnstr window (stdscr) |
mvaddnwstr window (stdscr) |
mvaddstr window (stdscr) |
mvaddwstr window (stdscr) |
mvchgat window (stdscr) |
mvcur screen |
mvdelch window (stdscr) |
mvderwin window (stdscr) |
mvget_wch screen (input operation) |
mvget_wstr screen (input operation) |
mvgetch screen (input operation) |
mvgetn_wstr screen (input operation) |
mvgetnstr screen (input operation) |
mvgetstr screen (input operation) |
mvhline window (stdscr) |
mvhline_set window (stdscr) |
mvin_wch window (stdscr) |
mvin_wchnstr window (stdscr) |
mvin_wchstr window (stdscr) |
mvinch window (stdscr) |
mvinchnstr window (stdscr) |
mvinchstr window (stdscr) |
mvinnstr window (stdscr) |
mvinnwstr window (stdscr) |
mvins_nwstr window (stdscr) |
mvins_wch window (stdscr) |
mvins_wstr window (stdscr) |
mvinsch window (stdscr) |
mvinsnstr window (stdscr) |
mvinsstr window (stdscr) |
mvinstr window (stdscr) |
mvinwstr window (stdscr) |
mvprintw window (stdscr) |
mvscanw screen |
mvvline window (stdscr) |
mvvline_set window (stdscr) |
mvwadd_wch window |
mvwadd_wchnstr window |
mvwadd_wchstr window |
mvwaddch window |
mvwaddchnstr window |
mvwaddchstr window |
mvwaddnstr window |
mvwaddnwstr window |
mvwaddstr window |
mvwaddwstr window |
mvwchgat window |
mvwdelch window |
mvwget_wch screen (input operation) |
mvwget_wstr screen (input operation) |
mvwgetch screen (input operation) |
mvwgetn_wstr screen (input operation) |
mvwgetnstr screen (input operation) |
mvwgetstr screen (input operation) |
mvwhline window |
mvwhline_set window |
mvwin window |
mvwin_wch window |
mvwin_wchnstr window |
mvwin_wchstr window |
mvwinch window |
mvwinchnstr window |
mvwinchstr window |
mvwinnstr window |
mvwinnwstr window |
mvwins_nwstr window |
mvwins_wch window |
mvwins_wstr window |
mvwinsch window |
mvwinsnstr window |
mvwinsstr window |
mvwinstr window |
mvwinwstr window |
mvwprintw window |
mvwscanw screen |
mvwvline window |
mvwvline_set window |
napms reentrant |
newpad global (locks window list) |
newscr screen (read-only) |
newterm global (locks screen list) |
newwin global (locks window list) |
nl screen |
nocbreak screen |
nodelay window |
noecho screen |
nofilter global |
nonl screen |
noqiflush terminal |
noraw screen |
notimeout window |
numcodes global (read-only) |
numfnames global (read-only) |
numnames global (read-only) |
ospeed global |
overlay window (locks source, target) |
overwrite window (locks source, target) |
pair_content screen |
pecho_wchar screen |
pechochar screen |
pnoutrefresh screen |
prefresh screen |
printw window |
putp global |
putwin window |
qiflush terminal |
raw screen |
redrawwin window |
refresh screen |
reset_prog_mode screen |
reset_shell_mode screen |
resetty terminal |
resize_term screen (locks window list) |
resizeterm screen |
restartterm screen |
ripoffline global (static data) |
savetty terminal |
scanw screen |
scr_dump screen |
scr_init screen |
scr_restore screen |
scr_set screen |
scrl window (stdscr) |
scroll window |
scrollok window |
set_curterm screen |
set_escdelay screen |
set_tabsize screen |
set_term global (locks screen list, screen) |
setcchar reentrant |
setscrreg window (stdscr) |
setupterm global |
slk_attr screen |
slk_attr_off screen |
slk_attr_on screen |
slk_attr_set screen |
slk_attroff screen |
slk_attron screen |
slk_attrset screen |
slk_clear screen |
slk_color screen |
slk_init screen |
slk_label screen |
slk_noutrefresh screen |
slk_refresh screen |
slk_restore screen |
slk_set screen |
slk_touch screen |
slk_wset screen |
standend window |
standout window |
start_color screen |
stdscr screen (read-only) |
strcodes global (read-only) |
strfnames global (read-only) |
strnames global (read-only) |
subpad window |
subwin window |
syncok window |
term_attrs screen |
termattrs screen |
termname terminal |
tgetent global |
tgetflag global |
tgetnum global |
tgetstr global |
tgoto global |
tigetflag terminal |
tigetnum terminal |
tigetstr terminal |
timeout window (stdscr) |
touchline window |
touchwin window |
tparm global (static data) |
tputs screen |
trace global (static data) |
ttytype screen (read-only) |
typeahead screen |
unctrl screen |
unget_wch screen (input operation) |
ungetch screen (input operation) |
ungetmouse screen (input operation) |
untouchwin window |
use_default_colors screen |
use_env global (static data) |
use_extended_names global (static data) |
use_legacy_coding screen |
use_screen global (locks screen list, screen) |
use_window global (locks window list, window) |
vid_attr screen |
vid_puts screen |
vidattr screen |
vidputs screen |
vline window (stdscr) |
vline_set window (stdscr) |
vw_printw window |
vw_scanw screen |
vwprintw window |
vwscanw screen |
wadd_wch window |
wadd_wchnstr window |
wadd_wchstr window |
waddch window |
waddchnstr window |
waddchstr window |
waddnstr window |
waddnwstr window |
waddstr window |
waddwstr window |
wattr_get window |
wattr_off window |
wattr_on window |
wattr_set window |
wattroff window |
wattron window |
wattrset window |
wbkgd window |
wbkgdset window |
wbkgrnd window |
wbkgrndset window |
wborder window |
wborder_set window |
wchgat window |
wclear window |
wclrtobot window |
wclrtoeol window |
wcolor_set window |
wcursyncup screen (affects window plus parents) |
wdelch window |
wdeleteln window |
wecho_wchar window |
wechochar window |
wenclose window |
werase window |
wget_wch screen (input operation) |
wget_wstr screen (input operation) |
wgetbkgrnd window |
wgetch screen (input operation) |
wgetdelay window |
wgetn_wstr screen (input operation) |
wgetnstr screen (input operation) |
wgetparent window |
wgetscrreg window |
wgetstr screen (input operation) |
whline window |
whline_set window |
win_wch window |
win_wchnstr window |
win_wchstr window |
winch window |
winchnstr window |
winchstr window |
winnstr window |
winnwstr window |
wins_nwstr window |
wins_wch window |
wins_wstr window |
winsch window |
winsdelln window |
winsertln window |
winsnstr window |
winsstr window |
winstr window |
winwstr window |
wmouse_trafo window |
wmove window |
wnoutrefresh screen |
wprintw window |
wredrawln window |
wrefresh screen |
wresize window (locks window list) |
wscanw screen |
wscrl window |
wsetscrreg window |
wstandend window |
wstandout window |
wsyncdown screen (affects window plus parents) |
wsyncup screen (affects window plus parents) |
wtimeout window |
wtouchln window |
wunctrl global (static data) |
wvline window |
wvline_set window |