diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index 890e248cd23c347726b4d9e4ce4120ab33990ca9..c31b15dec99b72b65d98fa17caa2492d7c8aacf1 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -67,6 +67,24 @@ static int dbg_pthread_mutex_trylock(pthread_mutex_t *lptr, unsigned line) #define pthread_mutex_unlock(a) dbg_pthread_mutex_unlock(a, __LINE__) #define pthread_mutex_trylock(a) dbg_pthread_trymutex_lock(a, __LINE__) +#else +#ifndef NDEBUG +#define pthread_mutex_lock(a) assert(pthread_mutex_lock(a) == 0) +#define pthread_mutex_unlock(a) assert(pthread_mutex_unlock(a) == 0) +#define pthread_mutex_trylock(a) assert(pthread_mutex_trylock(a) == 0) +#endif +#endif + +#ifdef NDEBUG +#define do_rwlock_rdlock(lk) rwlock_rdlock(lk) +#define do_rwlock_wrlock(lk) rwlock_wrlock(lk) +#define do_rwlock_unlock(lk) rwlock_unlock(lk) +#define do_rwlock_init(lk) rwlock_init(lk) +#else +#define do_rwlock_rdlock(lk) assert(rwlock_rdlock(lk)) +#define do_rwlock_wrlock(lk) assert(rwlock_wrlock(lk)) +#define do_rwlock_unlock(lk) assert(rwlock_unlock(lk)) +#define do_rwlock_init(lk) assert(rwlock_init(lk)) #endif /* Structs */ @@ -390,7 +408,7 @@ static void cb_drawrect(struct rectlist *data) * 4) If vstat.curs_blinks is false, the cursor does not blink. * 5) When blinking, the cursor is shown when vstat.blink is true. */ - rwlock_rdlock(&vstatlock); + do_rwlock_rdlock(&vstatlock); curs_start = vstat.curs_start; curs_end = vstat.curs_end; curs_row = vstat.curs_row; @@ -398,7 +416,7 @@ static void cb_drawrect(struct rectlist *data) charheight = vstat.charheight; charwidth = vstat.charwidth; if (cursor_visible_locked()) { - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); cv = color_value(ciolib_fg); for (y = curs_start; y <= curs_end; y++) { pixel = &data->data[((curs_row - 1) * charheight + y) * data->rect.width + (curs_col - 1) * charwidth]; @@ -408,7 +426,7 @@ static void cb_drawrect(struct rectlist *data) } } else - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); pthread_mutex_lock(&callbacks.lock); callbacks.drawrect(data); callbacks.rects++; @@ -422,9 +440,9 @@ static void request_redraw_locked(void) static void request_redraw(void) { - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); request_redraw_locked(); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } /* @@ -908,10 +926,10 @@ static int check_redraw(void) { int ret; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); ret = force_redraws; force_redraws = 0; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return ret; } @@ -936,7 +954,7 @@ bpid = pthread_self(); SLEEP(10); count++; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); if (count==25) { curs_changed = cursor_visible_locked(); if(vstat.curs_blink) @@ -962,7 +980,7 @@ bpid = pthread_self(); lfc = force_cursor; force_cursor = 0; blink = vstat.blink; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); if (check_redraw()) { if (update_from_vmem(TRUE)) @@ -1081,15 +1099,15 @@ static int update_from_vmem(int force) if(!bitmap_initialized) return(-1); - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); if (vstat.vmem == NULL) { - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return -1; } if(vstat.vmem->vmem == NULL) { - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return -1; } @@ -1100,7 +1118,7 @@ static int update_from_vmem(int force) vs.cols = 0; vs.rows = 0; free(bitmap_drawn); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return -1; } bitmap_drawn = newl; @@ -1165,7 +1183,7 @@ static int update_from_vmem(int force) } release_vmem(vmem_ptr); vs = vstat; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return(0); } @@ -1197,7 +1215,7 @@ int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill) return(0); } - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); vmem_ptr = get_vmem(&vstat); for (y = sy - 1; y < ey; y++) { for (x = sx - 1; x < ex; x++) { @@ -1205,7 +1223,7 @@ int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill) } } release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return ret; } @@ -1214,9 +1232,9 @@ bitmap_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) { int ret; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); ret = bitmap_vmem_puttext_locked(sx, sy, ex, ey, fill); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return ret; } @@ -1240,7 +1258,7 @@ int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) return(0); } - rwlock_rdlock(&vstatlock); + do_rwlock_rdlock(&vstatlock); vmem_ptr = get_vmem(&vstat); for(y=sy-1;y<ey;y++) { struct vmem_cell *vc = vmem_cell_ptr(vmem_ptr, sx - 1, y); @@ -1250,7 +1268,7 @@ int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) } } release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return(1); } @@ -1259,7 +1277,7 @@ void bitmap_gotoxy(int x, int y) if(!bitmap_initialized) return; /* Move cursor location */ - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); if (vstat.curs_col != x + cio_textinfo.winleft - 1 || vstat.curs_row != y + cio_textinfo.wintop - 1) { cio_textinfo.curx=x; cio_textinfo.cury=y; @@ -1268,14 +1286,14 @@ void bitmap_gotoxy(int x, int y) if (cursor_visible_locked()) force_cursor = 1; } - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } void bitmap_setcursortype(int type) { if(!bitmap_initialized) return; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); switch(type) { case _NOCURSOR: vstat.curs_start=0xff; @@ -1292,7 +1310,7 @@ void bitmap_setcursortype(int type) force_cursor = 1; break; } - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } int bitmap_setfont(int font, int force, int font_num) @@ -1320,7 +1338,7 @@ int bitmap_setfont(int font, int force, int font_num) else if(conio_fontdata[font].eight_by_eight!=NULL) newmode=C80X50; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); switch(vstat.charheight) { case 8: if(conio_fontdata[font].eight_by_eight==NULL) { @@ -1378,7 +1396,7 @@ int bitmap_setfont(int font, int force, int font_num) new=malloc(ti.screenwidth*ti.screenheight*sizeof(*new)); if(!new) { free(old); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 0; } pold=old; @@ -1424,11 +1442,11 @@ int bitmap_setfont(int font, int force, int font_num) } } bitmap_loadfont_locked(NULL); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return(1); error_return: - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return(0); } @@ -1450,9 +1468,9 @@ int bitmap_loadfont(const char *filename) { int ret; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); ret = bitmap_loadfont_locked(filename); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return ret; } @@ -1556,7 +1574,7 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) int oheight = height; bool oscrolldown = scrolldown; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); vmem_ptr = get_vmem(&vstat); if (width == vstat.cols && height > vstat.rows / 2 && toy == 1) { vmem_ptr->top_row += (y - toy); @@ -1594,7 +1612,7 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) bitmap_movetext_screen(vmem_ptr, x, oy, tox, otoy, oscrolldown ? -1 : 1, oheight, width); release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return(1); } @@ -1610,13 +1628,13 @@ void bitmap_clreol(void) return; row = cio_textinfo.cury + cio_textinfo.wintop - 1; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); vmem_ptr = get_vmem(&vstat); for(x=cio_textinfo.curx+cio_textinfo.winleft-2; x<cio_textinfo.winright; x++) { set_vmem_cell(vmem_ptr, x, row - 1, fill, ciolib_fg, ciolib_bg); } release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } void bitmap_clrscr(void) @@ -1628,7 +1646,7 @@ void bitmap_clrscr(void) if(!bitmap_initialized) return; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); vmem_ptr = get_vmem(&vstat); rows = vstat.rows; cols = vstat.cols; @@ -1638,12 +1656,12 @@ void bitmap_clrscr(void) } } release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v) { - rwlock_rdlock(&vstatlock); + do_rwlock_rdlock(&vstatlock); if(s) *s=vstat.curs_start; if(e) @@ -1654,14 +1672,14 @@ void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v) *b=vstat.curs_blinks; if(v) *v=vstat.curs_visible; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } void bitmap_setcustomcursor(int s, int e, int r, int b, int v) { double ratio; - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); if(r==0) ratio=0; else @@ -1675,7 +1693,7 @@ void bitmap_setcustomcursor(int s, int e, int r, int b, int v) if(v>=0) vstat.curs_visible=v; force_cursor = 1; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } static void @@ -1698,14 +1716,12 @@ setvideoflags_from_vstat(void) int bitmap_getvideoflags(void) { - int flags=0; - return protected_int32_value(videoflags); } void bitmap_setvideoflags(int flags) { - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); protected_int32_set(&videoflags, flags); if(flags & CIOLIB_VIDEO_BGBRIGHT) vstat.bright_background=1; @@ -1731,16 +1747,16 @@ void bitmap_setvideoflags(int flags) vstat.blink_altcharset=1; else vstat.blink_altcharset=0; - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); } int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) { int ret; - rwlock_rdlock(&vstatlock); + do_rwlock_rdlock(&vstatlock); ret = bitmap_attr2palette_locked(attr, fgp, bgp); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return ret; } @@ -1748,7 +1764,7 @@ int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) { update_from_vmem(FALSE); - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); struct vstat_vmem *vmem_ptr = get_vmem(&vstat); struct vmem_cell *vc = vmem_cell_ptr(vmem_ptr, x / vstat.charwidth, y / vstat.charheight); vc->bg |= 0x04000000; @@ -1769,7 +1785,7 @@ int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) } } pthread_mutex_unlock(&screenlock); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 1; } @@ -1806,12 +1822,12 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ } update_from_vmem(FALSE); - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); struct vstat_vmem *vmem_ptr = get_vmem(&vstat); pthread_mutex_lock(&screenlock); if (ex > screena.screenwidth || ey > screena.screenheight) { pthread_mutex_unlock(&screenlock); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 0; } @@ -1875,7 +1891,7 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ } pthread_mutex_unlock(&screenlock); release_vmem(vmem_ptr); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 1; } @@ -1936,17 +1952,17 @@ struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, ui int bitmap_get_modepalette(uint32_t p[16]) { - rwlock_rdlock(&vstatlock); + do_rwlock_rdlock(&vstatlock); memcpy(p, vstat.palette, sizeof(vstat.palette)); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 1; } int bitmap_set_modepalette(uint32_t p[16]) { - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); memcpy(vstat.palette, p, sizeof(vstat.palette)); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); return 1; } @@ -2317,17 +2333,17 @@ int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) | CONIO_OPT_BLOCKY_SCALING; protected_int32_init(&videoflags, 0); pthread_mutex_init(&callbacks.lock, NULL); - rwlock_init(&vstatlock); + do_rwlock_init(&vstatlock); pthread_mutex_init(&screenlock, NULL); pthread_mutex_init(&free_rect_lock, NULL); - rwlock_wrlock(&vstatlock); + do_rwlock_wrlock(&vstatlock); vstat.flags = VIDMODES_FLAG_PALETTE_VMEM; pthread_mutex_lock(&screenlock); for (i = 0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) { palette[i] = (0xffU << 24) | (dac_default[i].red << 16) | (dac_default[i].green << 8) | dac_default[i].blue; } pthread_mutex_unlock(&screenlock); - rwlock_unlock(&vstatlock); + do_rwlock_unlock(&vstatlock); callbacks.drawrect=drawrect_cb; callbacks.flush=flush_cb;