Make RB_PEEK_DATA return the address of the data

This makes it a little more generally useful.
This commit is contained in:
Bill Currie 2021-01-22 18:29:35 +09:00
parent 07b869d1bf
commit e6704b85e1
3 changed files with 83 additions and 82 deletions

View file

@ -154,21 +154,22 @@
rb->tail = (t + c) % RB_buffer_size (rb); \
})
/** Read a single item from the buffer without affecting buffer state.
/** Access a single item from the buffer without affecting buffer state.
*
* \note Does NOT affect buffer state.
*
* \note Does NOT check that the data is available. It is the caller's
* responsitiblity to do so using RB_DATA_AVAILABLE().
*
* \param ring_buffer The ring buffer from which to read the object.
* \param ahead The tail-relative index of the object to read from
* \param ring_buffer The ring buffer from which to access the object.
* \param ahead The tail-relative index of the object to access from
* the buffer. Valid range is 0 to
* `RB_DATA_AVAILABLE() - 1`
* \return Address of the accessed element
*/
#define RB_PEEK_DATA(ring_buffer, ahead) \
({ __auto_type rb = &(ring_buffer); \
rb->buffer[(rb->tail + ahead) % RB_buffer_size (rb)]; \
&rb->buffer[(rb->tail + ahead) % RB_buffer_size (rb)]; \
})
/** WRite a single item to the buffer without affecting buffer state.

View file

@ -273,7 +273,7 @@ qwaq_wait_result (qwaq_resources_t *res, int *result, int cmd, unsigned len)
{
pthread_mutex_lock (&res->results_cond.mut);
while (RB_DATA_AVAILABLE (res->results) < len
|| RB_PEEK_DATA (res->results, 0) != cmd) {
|| *RB_PEEK_DATA (res->results, 0) != cmd) {
pthread_cond_wait (&res->results_cond.rcond,
&res->results_cond.mut);
}
@ -285,7 +285,7 @@ qwaq_wait_result (qwaq_resources_t *res, int *result, int cmd, unsigned len)
static void
cmd_syncprint (qwaq_resources_t *res)
{
int string_id = RB_PEEK_DATA (res->command_queue, 2);
int string_id = *RB_PEEK_DATA (res->command_queue, 2);
Sys_Printf ("%s\n", res->strings[string_id].str);
release_string (res, string_id);
@ -294,10 +294,10 @@ cmd_syncprint (qwaq_resources_t *res)
static void
cmd_newwin (qwaq_resources_t *res)
{
int xpos = RB_PEEK_DATA (res->command_queue, 2);
int ypos = RB_PEEK_DATA (res->command_queue, 3);
int xlen = RB_PEEK_DATA (res->command_queue, 4);
int ylen = RB_PEEK_DATA (res->command_queue, 5);
int xpos = *RB_PEEK_DATA (res->command_queue, 2);
int ypos = *RB_PEEK_DATA (res->command_queue, 3);
int xlen = *RB_PEEK_DATA (res->command_queue, 4);
int ylen = *RB_PEEK_DATA (res->command_queue, 5);
window_t *window = window_new (res);
window->win = newwin (ylen, xlen, ypos, xpos);
@ -311,7 +311,7 @@ cmd_newwin (qwaq_resources_t *res)
static void
cmd_delwin (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
window_t *window = get_window (res, __FUNCTION__, window_id);
delwin (window->win);
@ -321,7 +321,7 @@ cmd_delwin (qwaq_resources_t *res)
static void
cmd_getwrect (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int xpos, ypos;
int xlen, ylen;
@ -339,7 +339,7 @@ cmd_getwrect (qwaq_resources_t *res)
static void
cmd_new_panel (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
window_t *window = get_window (res, __FUNCTION__, window_id);
panel_t *panel = panel_new (res);
@ -354,7 +354,7 @@ cmd_new_panel (qwaq_resources_t *res)
static void
cmd_del_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
del_panel (panel->panel);
@ -364,7 +364,7 @@ cmd_del_panel (qwaq_resources_t *res)
static void
cmd_hide_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
hide_panel (panel->panel);
@ -373,7 +373,7 @@ cmd_hide_panel (qwaq_resources_t *res)
static void
cmd_show_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
show_panel (panel->panel);
@ -382,7 +382,7 @@ cmd_show_panel (qwaq_resources_t *res)
static void
cmd_top_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
top_panel (panel->panel);
@ -391,7 +391,7 @@ cmd_top_panel (qwaq_resources_t *res)
static void
cmd_bottom_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
bottom_panel (panel->panel);
@ -400,9 +400,9 @@ cmd_bottom_panel (qwaq_resources_t *res)
static void
cmd_move_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
move_panel (panel->panel, y, x);
@ -411,7 +411,7 @@ cmd_move_panel (qwaq_resources_t *res)
static void
cmd_panel_window (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
@ -423,8 +423,8 @@ cmd_panel_window (qwaq_resources_t *res)
static void
cmd_replace_panel (qwaq_resources_t *res)
{
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = RB_PEEK_DATA (res->command_queue, 3);
int panel_id = *RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 3);
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
window_t *window = get_window (res, __FUNCTION__, window_id);
@ -447,10 +447,10 @@ cmd_doupdate (qwaq_resources_t *res)
static void
cmd_mvwaddstr (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int string_id = RB_PEEK_DATA (res->command_queue, 5);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
int string_id = *RB_PEEK_DATA (res->command_queue, 5);
window_t *window = get_window (res, __FUNCTION__, window_id);
mvwaddstr (window->win, y, x, res->strings[string_id].str);
@ -460,8 +460,8 @@ cmd_mvwaddstr (qwaq_resources_t *res)
static void
cmd_waddstr (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int string_id = RB_PEEK_DATA (res->command_queue, 3);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int string_id = *RB_PEEK_DATA (res->command_queue, 3);
window_t *window = get_window (res, __FUNCTION__, window_id);
waddstr (window->win, res->strings[string_id].str);
@ -471,10 +471,10 @@ cmd_waddstr (qwaq_resources_t *res)
static void
cmd_mvwaddch (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int ch = RB_PEEK_DATA (res->command_queue, 5);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
int ch = *RB_PEEK_DATA (res->command_queue, 5);
window_t *window = get_window (res, __FUNCTION__, window_id);
mvwaddch (window->win, y, x, ch);
@ -483,8 +483,8 @@ cmd_mvwaddch (qwaq_resources_t *res)
static void
cmd_waddch (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int ch = RB_PEEK_DATA (res->command_queue, 3);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int ch = *RB_PEEK_DATA (res->command_queue, 3);
window_t *window = get_window (res, __FUNCTION__, window_id);
waddch (window->win, ch);
@ -493,7 +493,7 @@ cmd_waddch (qwaq_resources_t *res)
static void
cmd_wrefresh (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
window_t *window = get_window (res, __FUNCTION__, window_id);
wrefresh (window->win);
@ -502,9 +502,9 @@ cmd_wrefresh (qwaq_resources_t *res)
static void
cmd_init_pair (qwaq_resources_t *res)
{
int pair = RB_PEEK_DATA (res->command_queue, 2);
int f = RB_PEEK_DATA (res->command_queue, 3);
int b = RB_PEEK_DATA (res->command_queue, 4);
int pair = *RB_PEEK_DATA (res->command_queue, 2);
int f = *RB_PEEK_DATA (res->command_queue, 3);
int b = *RB_PEEK_DATA (res->command_queue, 4);
init_pair (pair, f, b);
}
@ -512,8 +512,8 @@ cmd_init_pair (qwaq_resources_t *res)
static void
cmd_wbkgd (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int ch = RB_PEEK_DATA (res->command_queue, 3);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int ch = *RB_PEEK_DATA (res->command_queue, 3);
window_t *window = get_window (res, __FUNCTION__, window_id);
wbkgd (window->win, ch);
@ -522,7 +522,7 @@ cmd_wbkgd (qwaq_resources_t *res)
static void
cmd_werase (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
window_t *window = get_window (res, __FUNCTION__, window_id);
werase (window->win);
@ -531,8 +531,8 @@ cmd_werase (qwaq_resources_t *res)
static void
cmd_scrollok (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int flag = RB_PEEK_DATA (res->command_queue, 3);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int flag = *RB_PEEK_DATA (res->command_queue, 3);
window_t *window = get_window (res, __FUNCTION__, window_id);
scrollok (window->win, flag);
@ -541,8 +541,8 @@ cmd_scrollok (qwaq_resources_t *res)
static void
cmd_move (qwaq_resources_t *res)
{
int x = RB_PEEK_DATA (res->command_queue, 2);
int y = RB_PEEK_DATA (res->command_queue, 3);
int x = *RB_PEEK_DATA (res->command_queue, 2);
int y = *RB_PEEK_DATA (res->command_queue, 3);
move (y, x);
}
@ -550,7 +550,7 @@ cmd_move (qwaq_resources_t *res)
static void
cmd_curs_set (qwaq_resources_t *res)
{
int visibility = RB_PEEK_DATA (res->command_queue, 2);
int visibility = *RB_PEEK_DATA (res->command_queue, 2);
curs_set (visibility);
}
@ -558,15 +558,15 @@ cmd_curs_set (qwaq_resources_t *res)
static void
cmd_wborder (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int ls = RB_PEEK_DATA (res->command_queue, 3);
int rs = RB_PEEK_DATA (res->command_queue, 4);
int ts = RB_PEEK_DATA (res->command_queue, 5);
int bs = RB_PEEK_DATA (res->command_queue, 6);
int tl = RB_PEEK_DATA (res->command_queue, 7);
int tr = RB_PEEK_DATA (res->command_queue, 8);
int bl = RB_PEEK_DATA (res->command_queue, 9);
int br = RB_PEEK_DATA (res->command_queue, 10);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int ls = *RB_PEEK_DATA (res->command_queue, 3);
int rs = *RB_PEEK_DATA (res->command_queue, 4);
int ts = *RB_PEEK_DATA (res->command_queue, 5);
int bs = *RB_PEEK_DATA (res->command_queue, 6);
int tl = *RB_PEEK_DATA (res->command_queue, 7);
int tr = *RB_PEEK_DATA (res->command_queue, 8);
int bl = *RB_PEEK_DATA (res->command_queue, 9);
int br = *RB_PEEK_DATA (res->command_queue, 10);
window_t *window = get_window (res, __FUNCTION__, window_id);
wborder (window->win, ls, rs, ts, bs, tl, tr, bl, br);
@ -575,11 +575,11 @@ cmd_wborder (qwaq_resources_t *res)
static void
cmd_mvwblit_line (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int chs_id = RB_PEEK_DATA (res->command_queue, 5);
int len = RB_PEEK_DATA (res->command_queue, 6);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
int chs_id = *RB_PEEK_DATA (res->command_queue, 5);
int len = *RB_PEEK_DATA (res->command_queue, 6);
int *chs = (int *) res->strings[chs_id].str;
int save_x;
int save_y;
@ -598,9 +598,9 @@ cmd_mvwblit_line (qwaq_resources_t *res)
static void
cmd_wresize (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int width = RB_PEEK_DATA (res->command_queue, 3);
int height = RB_PEEK_DATA (res->command_queue, 4);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int width = *RB_PEEK_DATA (res->command_queue, 3);
int height = *RB_PEEK_DATA (res->command_queue, 4);
window_t *window = get_window (res, __FUNCTION__, window_id);
wresize (window->win, height, width);
@ -609,8 +609,8 @@ cmd_wresize (qwaq_resources_t *res)
static void
cmd_resizeterm (qwaq_resources_t *res)
{
int width = RB_PEEK_DATA (res->command_queue, 2);
int height = RB_PEEK_DATA (res->command_queue, 3);
int width = *RB_PEEK_DATA (res->command_queue, 2);
int height = *RB_PEEK_DATA (res->command_queue, 3);
resizeterm (height, width);
}
@ -618,11 +618,11 @@ cmd_resizeterm (qwaq_resources_t *res)
static void
cmd_mvwhline (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int ch = RB_PEEK_DATA (res->command_queue, 5);
int n = RB_PEEK_DATA (res->command_queue, 6);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
int ch = *RB_PEEK_DATA (res->command_queue, 5);
int n = *RB_PEEK_DATA (res->command_queue, 6);
window_t *window = get_window (res, __FUNCTION__, window_id);
mvwhline (window->win, y, x, ch, n);
@ -631,11 +631,11 @@ cmd_mvwhline (qwaq_resources_t *res)
static void
cmd_mvwvline (qwaq_resources_t *res)
{
int window_id = RB_PEEK_DATA (res->command_queue, 2);
int x = RB_PEEK_DATA (res->command_queue, 3);
int y = RB_PEEK_DATA (res->command_queue, 4);
int ch = RB_PEEK_DATA (res->command_queue, 5);
int n = RB_PEEK_DATA (res->command_queue, 6);
int window_id = *RB_PEEK_DATA (res->command_queue, 2);
int x = *RB_PEEK_DATA (res->command_queue, 3);
int y = *RB_PEEK_DATA (res->command_queue, 4);
int ch = *RB_PEEK_DATA (res->command_queue, 5);
int n = *RB_PEEK_DATA (res->command_queue, 6);
window_t *window = get_window (res, __FUNCTION__, window_id);
mvwvline (window->win, y, x, ch, n);
@ -645,13 +645,13 @@ static void
dump_command (qwaq_resources_t *res, int len)
{
if (0) {
qwaq_commands cmd = RB_PEEK_DATA (res->command_queue, 0);
qwaq_commands cmd = *RB_PEEK_DATA (res->command_queue, 0);
Sys_Printf ("%s[%d]", qwaq_command_names[cmd], len);
if (cmd == qwaq_cmd_syncprint) {
Sys_Printf (" ");
} else {
for (int i = 2; i < len; i++) {
Sys_Printf (" %d", RB_PEEK_DATA (res->command_queue, i));
Sys_Printf (" %d", *RB_PEEK_DATA (res->command_queue, i));
}
Sys_Printf ("\n");
}
@ -692,10 +692,10 @@ process_commands (qwaq_resources_t *res)
// as the mutex is not released until after the data has been written to
// the buffer.
while ((avail = RB_DATA_AVAILABLE (res->command_queue)) >= 2
&& avail >= (len = RB_PEEK_DATA (res->command_queue, 1))) {
&& avail >= (len = *RB_PEEK_DATA (res->command_queue, 1))) {
pthread_mutex_unlock (&res->command_cond.mut);
dump_command (res, len);
qwaq_commands cmd = RB_PEEK_DATA (res->command_queue, 0);
qwaq_commands cmd = *RB_PEEK_DATA (res->command_queue, 0);
switch (cmd) {
case qwaq_cmd_syncprint:
cmd_syncprint (res);

View file

@ -185,7 +185,7 @@ qwaq_add_event (qwaq_resources_t *res, qwaq_event_t *event)
pthread_mutex_lock (&res->event_cond.mut);
unsigned last = RB_DATA_AVAILABLE (res->event_queue);
if (event->what == qe_mousemove && last > 1
&& RB_PEEK_DATA(res->event_queue, last - 1).what == qe_mousemove) {
&& RB_PEEK_DATA(res->event_queue, last - 1)->what == qe_mousemove) {
RB_POKE_DATA(res->event_queue, last - 1, *event);
merged = 1;
pthread_cond_broadcast (&res->event_cond.rcond);