jcs
/wallops
/amendments
/72
chatter: Sprinkle locking
jcs made amendment 72 2 months ago
--- chatter.c Sun Sep 8 21:51:58 2024
+++ chatter.c Mon Sep 9 16:18:36 2024
@@ -189,14 +189,18 @@ chatter_layout(struct chatter *chatter, bool init, Rec
InsetRect(&inset_bounds, 3, 1);
inset_bounds.right = win_bounds->right * 2;
chatter->input_te = TENew(&inset_bounds, &bounds);
+ HLock(chatter->input_te);
(*(chatter->input_te))->crOnly = -1;
+ HUnlock(chatter->input_te);
TEAutoView(true, chatter->input_te);
TEActivate(chatter->input_te);
} else {
+ HLock(chatter->input_te);
(*(chatter->input_te))->viewRect = bounds;
InsetRect(&bounds, 3, 1);
(*(chatter->input_te))->destRect = bounds;
TECalText(chatter->input_te);
+ HUnlock(chatter->input_te);
}
if (init) {
@@ -279,8 +283,10 @@ chatter_layout_tab(struct chatter *chatter, struct cha
if (!tab->nick_list)
panic("Can't create nick list");
LAddColumn(1, 0, tab->nick_list);
+ HLock(tab->nick_list);
(*(tab->nick_list))->selFlags = lOnlyOne | lNoNilHilite;
} else {
+ HLock(tab->nick_list);
(*(tab->nick_list))->rView = bounds;
LSize(bounds.right - bounds.left, bounds.bottom - bounds.top,
tab->nick_list);
@@ -299,6 +305,7 @@ chatter_layout_tab(struct chatter *chatter, struct cha
tab->messages_scroller = NewControl(chatter->win, &bounds,
"\p", true, 1, 1, 1, scrollBarProc, 0L);
else {
+ HLock(tab->messages_scroller);
MoveControl(tab->messages_scroller, bounds.left, bounds.top);
SizeControl(tab->messages_scroller, bounds.right - bounds.left,
bounds.bottom - bounds.top);
@@ -319,10 +326,16 @@ chatter_layout_tab(struct chatter *chatter, struct cha
chatter_autoscroll(chatter, tab->messages_te,
tab->messages_scroller);
} else {
+ HLock(tab->messages_te);
(*(tab->messages_te))->viewRect = bounds;
(*(tab->messages_te))->destRect = inset_bounds;
TECalText(tab->messages_te);
}
+
+ HUnlock(tab->messages_te);
+ HUnlock(tab->messages_scroller);
+ if (tab->channel)
+ HUnlock(tab->nick_list);
}
void
@@ -339,6 +352,8 @@ chatter_focus_tab(struct chatter *chatter, struct chat
* Doing the HideControl takes out the top line of our tab bar,
* so clip to just above it
*/
+ HLock(chatter->current_tab->messages_scroller);
+ HLock(chatter->current_tab->nick_list);
GetClip(clip = NewRgn());
r.left = 0;
r.top = 0;
@@ -349,6 +364,8 @@ chatter_focus_tab(struct chatter *chatter, struct chat
else
r.right = (*(chatter->current_tab->messages_scroller))->contrlRect.right;
ClipRect(&r);
+ HUnlock(chatter->current_tab->nick_list);
+ HUnlock(chatter->current_tab->messages_scroller);
EraseRect(&r);
TEDeactivate(chatter->current_tab->messages_te);
@@ -366,16 +383,24 @@ chatter_focus_tab(struct chatter *chatter, struct chat
chatter->current_tab = tab;
+ HLock(tab->messages_te);
EraseRect(&(*(tab->messages_te))->viewRect);
TEActivate(tab->messages_te);
TEUpdate(&(*(tab->messages_te))->viewRect, tab->messages_te);
+ HUnlock(tab->messages_te);
ShowControl(tab->messages_scroller);
if (tab->nick_list) {
+ HLock(tab->nick_list);
EraseRect(&(*(tab->nick_list))->rView);
LDoDraw(true, tab->nick_list);
LUpdate(chatter->win->visRgn, tab->nick_list);
+ HUnlock(tab->nick_list);
}
+ HLock(chatter->input_te);
+ TEUpdate(&(*(chatter->input_te))->viewRect, chatter->input_te);
+ HUnlock(chatter->input_te);
+
DrawControls(chatter->win);
chatter_draw_tab_bar(chatter);
@@ -514,22 +539,28 @@ chatter_update(struct focusable *focusable, EventRecor
EraseRect(&chatter->win->portRect);
if (tab->nick_list) {
+ HLock(tab->nick_list);
r = (*(tab->nick_list))->rView;
+ HUnlock(tab->nick_list);
LUpdate(chatter->win->visRgn, tab->nick_list);
InsetRect(&r, -1, -1);
FrameRect(&r);
}
+ HLock(tab->messages_te);
r = (*(tab->messages_te))->viewRect;
InsetRect(&r, -1, -1);
FrameRect(&r);
TEUpdate(&(*(tab->messages_te))->viewRect, tab->messages_te);
-
+ HUnlock(tab->messages_te);
+
+ HLock(chatter->input_te);
r = (*(chatter->input_te))->viewRect;
InsetRect(&r, -1, -1);
FrameRect(&r);
TEUpdate(&(*(chatter->input_te))->viewRect, chatter->input_te);
-
+ HUnlock(chatter->input_te);
+
DrawControls(chatter->win);
chatter_draw_tab_bar(chatter);
@@ -670,9 +701,11 @@ chatter_draw_tab_bar(struct chatter *chatter)
SetPortBits(&cur_bits);
+ HLock(chatter->input_te);
r = chatter->tab_bar.bounds;
r.bottom = (*(chatter->input_te))->viewRect.top;
r.top += r.bottom - TAB_BAR_HEIGHT;
+ HUnlock(chatter->input_te);
SLIST_FOREACH(tab, &chatter->tabs_list, list) {
tab->label_rect.top += r.top;
@@ -768,6 +801,7 @@ chatter_mouse_down(struct focusable *focusable, EventR
}
}
+ HLock(tab->messages_te);
r = (*(tab->messages_te))->viewRect;
if (PtInRect(p, &r)) {
TEClick(p, ((event->modifiers & shiftKey) != 0), tab->messages_te);
@@ -778,7 +812,9 @@ chatter_mouse_down(struct focusable *focusable, EventR
HUnlock(tab->messages_te);
return;
}
+ HUnlock(tab->messages_te);
+ HLock(chatter->input_te);
r = (*(chatter->input_te))->viewRect;
if (PtInRect(p, &r)) {
TEClick(p, ((event->modifiers & shiftKey) != 0),
@@ -790,6 +826,7 @@ chatter_mouse_down(struct focusable *focusable, EventR
HUnlock(chatter->input_te);
return;
}
+ HUnlock(chatter->input_te);
SLIST_FOREACH(ttab, &chatter->tabs_list, list) {
if (PtInRect(p, &ttab->label_rect)) {
@@ -863,7 +900,9 @@ chatter_resize(struct focusable *focusable, EventRecor
continue;
chatter_layout_tab(chatter, ttab, NULL, false);
+ HLock(ttab->messages_te);
TEUpdate(&(*(ttab->messages_te))->viewRect, ttab->messages_te);
+ HUnlock(ttab->messages_te);
TEPinScroll(0, INT_MAX, ttab->messages_te);
/* this will scroll back down */
chatter_autoscroll(chatter, ttab->messages_te,
@@ -872,8 +911,10 @@ chatter_resize(struct focusable *focusable, EventRecor
/* update the current tab as-is */
chatter_layout(chatter, false, NULL);
+ HLock(chatter->current_tab->messages_te);
TEUpdate(&(*(chatter->current_tab->messages_te))->viewRect,
chatter->current_tab->messages_te);
+ HUnlock(chatter->current_tab->messages_te);
TEPinScroll(0, INT_MAX, chatter->current_tab->messages_te);
chatter_autoscroll(chatter, chatter->current_tab->messages_te,
chatter->current_tab->messages_scroller);
@@ -1035,6 +1076,7 @@ chatter_printf(struct chatter *chatter, struct irc_con
had_activity = tab->have_activity;
+ HLock(tab->messages_te);
if ((*(tab->messages_te))->teLength > 0) {
buf[0] = '\r';
len++;
@@ -1113,11 +1155,10 @@ chatter_printf(struct chatter *chatter, struct irc_con
if (!buf_out_len) {
HUnlock(scrp_rec_h);
+ HUnlock(tab->messages_te);
return 0;
}
- HLock(tab->messages_te);
-
/* check for TE overflow */
/* too many lines */
@@ -1204,8 +1245,7 @@ chatter_clear_messages(struct chatter *chatter, struct
GetClip(savergn);
ClipRect(&zerorect);
- TESetSelect(0, SHRT_MAX, tab->messages_te);
- TEDelete(tab->messages_te);
+ TESetText(NULL, 0, tab->messages_te);
/* scroll up, causing a repaint */
TEPinScroll(0, INT_MAX, tab->messages_te);