Release screen mutex if thread dies
We did not setup a thread cleanup procedure which resulted in calcurse freezing if a thread tried to draw on the screen after another thread was canceled while locking the screen. Note that this kind of cleanup handlers should be added to other mutexes as well. This patch just removes the most common case of triggering a deadlock. Also note that we cannot move pthread_cleanup_push() and pthread_cleanup_pop() into the locking/unlocking functions since both pthread_cleanup_push() and pthread_cleanup_pop() may be implemented as macros that must be used in pairs within the same lexical scope. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
@@ -297,7 +297,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
|
||||
c_day_1 = (int)((ymd_to_scalar(yr, mo, 1 + sunday_first) - (long)1) % 7L);
|
||||
|
||||
/* Write the current month and year on top of the calendar */
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw(cwin->p, ofs_y,
|
||||
(SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2,
|
||||
@@ -311,7 +311,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
|
||||
mvwaddstr(cwin->p, ofs_y, ofs_x + 4 * j, _(daynames[1 + j - sunday_first]));
|
||||
}
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
|
||||
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
|
||||
|
||||
@@ -329,7 +329,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
|
||||
ofs_x = OFFX - day_1_sav - 4 * c_day;
|
||||
}
|
||||
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
if (c_day == current_day->dd
|
||||
&& current_day->mm == slctd_day.mm
|
||||
&& current_day->yyyy == slctd_day.yyyy
|
||||
@@ -355,7 +355,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
|
||||
mvwprintw(cwin->p, ofs_y + 1,
|
||||
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", c_day);
|
||||
}
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -459,11 +459,11 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
|
||||
|
||||
/* Print the week number. */
|
||||
weeknum = ISO8601weeknum(&t);
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
mvwprintw(cwin->p, 2, cwin->w - 9, "(# %02d)", weeknum);
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
|
||||
/* Now draw calendar view. */
|
||||
for (j = 0; j < WEEKINDAYS; j++) {
|
||||
@@ -495,28 +495,28 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
|
||||
else
|
||||
attr = 0;
|
||||
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
if (attr)
|
||||
custom_apply_attr(cwin->p, attr);
|
||||
mvwprintw(cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", t.tm_mday);
|
||||
if (attr)
|
||||
custom_remove_attr(cwin->p, attr);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
|
||||
/* Draw slices indicating appointment times. */
|
||||
memset(slices, 0, DAYSLICESNO * sizeof *slices);
|
||||
if (day_chk_busy_slices(date, DAYSLICESNO, slices)) {
|
||||
for (i = 0; i < DAYSLICESNO; i++) {
|
||||
if (j != WEEKINDAYS - 1 && i != DAYSLICESNO - 1) {
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
mvwhline(cwin->p, OFFY + 2 + i, OFFX + 3 + 4 * j, ACS_S9, 2);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
}
|
||||
if (slices[i]) {
|
||||
int highlight;
|
||||
|
||||
highlight = (t.tm_mday == slctd_day.dd) ? 1 : 0;
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
if (highlight)
|
||||
custom_apply_attr(cwin->p, attr);
|
||||
wattron(cwin->p, A_REVERSE);
|
||||
@@ -525,7 +525,7 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
|
||||
wattroff(cwin->p, A_REVERSE);
|
||||
if (highlight)
|
||||
custom_remove_attr(cwin->p, attr);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -535,13 +535,13 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
|
||||
}
|
||||
|
||||
/* Draw marks to indicate midday on the sides of the calendar. */
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
custom_apply_attr(cwin->p, ATTR_HIGHEST);
|
||||
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1);
|
||||
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2,
|
||||
OFFX + WCALWIDTH - 3, ACS_S9, 1);
|
||||
custom_remove_attr(cwin->p, ATTR_HIGHEST);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
|
||||
#undef DAYSLICESNO
|
||||
}
|
||||
@@ -554,10 +554,10 @@ void calendar_update_panel(struct window *cwin)
|
||||
|
||||
calendar_store_current_date(¤t_day);
|
||||
|
||||
wins_calendar_lock();
|
||||
WINS_CALENDAR_LOCK;
|
||||
erase_window_part(cwin->p, 1, 3, cwin->w - 2, cwin->h - 2);
|
||||
mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2);
|
||||
wins_calendar_unlock();
|
||||
WINS_CALENDAR_UNLOCK;
|
||||
|
||||
sunday_first = calendar_week_begins_on_monday()? 0 : 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user