Re: wsfont & free(9) sizes

2019-07-10 Thread Jan Klemkow
On Wed, Jul 10, 2019 at 12:59:41PM -0300, Martin Pieuchot wrote:
> Some free(9) sizes & fix to make wsfont_remove() compile.  This function
> is #ifndef for the moment.  That's mainly for coherency and to reduce
> grep noise.
> 
> ok?

ok jan
 
> Index: dev/wsfont/wsfont.c
> ===
> RCS file: /cvs/src/sys/dev/wsfont/wsfont.c,v
> retrieving revision 1.55
> diff -u -p -u -1 -0 -r1.55 wsfont.c
> --- dev/wsfont/wsfont.c   9 Jan 2019 11:23:32 -   1.55
> +++ dev/wsfont/wsfont.c   23 Jun 2019 00:17:43 -
> @@ -346,23 +346,23 @@ wsfont_rotate_ccw(struct wsdisplay_font 
>  }
>  
>  struct wsdisplay_font *
>  wsfont_rotate_internal(struct wsdisplay_font *font, int ccw)
>  {
>   int newstride;
>   struct wsdisplay_font *newfont;
>   char *newbits;
>  
>   /* Duplicate the existing font... */
> - newfont = malloc(sizeof *font, M_DEVBUF, M_WAITOK);
> + newfont = malloc(sizeof(*newfont), M_DEVBUF, M_WAITOK);
>  
> - bcopy(font, newfont, sizeof *font);
> + bcopy(font, newfont, sizeof(*font));
>   newfont->cookie = NULL;
>  
>   /* Allocate a buffer big enough for the rotated font. */
>   newstride = (font->fontheight + 7) / 8;
>   newbits = mallocarray(font->numchars, newstride * font->fontwidth,
>   M_DEVBUF, M_WAITOK | M_ZERO);
>  
>   if (ccw)
>   wsfont_rotate_ccw(font, newbits, newstride);
>   else
> @@ -374,22 +374,22 @@ wsfont_rotate_internal(struct wsdisplay_
>   newfont->stride = newstride;
>   newfont->fontwidth = font->fontheight;
>   newfont->fontheight = font->fontwidth;
>  
>   if (wsfont_add(newfont, 0) != 0) {
>   /*
>* If we seem to have rotated this font already, drop the
>* new one...
>*/
>   free(newbits, M_DEVBUF,
> - font->numchars * newstride * font->fontwidth);
> - free(newfont, M_DEVBUF, sizeof *font);
> + newfont->numchars * newfont->stride * newfont->fontwidth);
> + free(newfont, M_DEVBUF, sizeof(*newfont));
>   newfont = NULL;
>   }
>  
>   return (newfont);
>  }
>  
>  int
>  wsfont_rotate(int cookie, int ccw)
>  {
>   int s, ncookie;
> @@ -499,33 +499,32 @@ wsfont_add(struct wsdisplay_font *font, 
>   }
>  
>   TAILQ_FOREACH(ent, , chain)
>   fontc++;
>  
>   if (fontc >= WSDISPLAY_MAXFONTCOUNT) {
>   splx(s);
>   return (-1);
>   }
>  
> - ent = (struct font *)malloc(sizeof *ent, M_DEVBUF, M_WAITOK);
> + ent = malloc(sizeof(*ent), M_DEVBUF, M_WAITOK);
>  
>   ent->lockcount = 0;
>   ent->flg = 0;
>   ent->cookie = cookiegen++;
>  
>   /*
>* If we are coming from a WSDISPLAYIO_LDFONT ioctl, we need to
>* make a copy of the wsdisplay_font struct, but not of font->bits.
>*/
>   if (copy) {
> - ent->font = (struct wsdisplay_font *)malloc(sizeof *ent->font,
> - M_DEVBUF, M_WAITOK);
> + ent->font = malloc(sizeof(*ent->font), M_DEVBUF, M_WAITOK);
>   memcpy(ent->font, font, sizeof(*ent->font));
>   ent->flg = 0;
>   } else {
>   ent->font = font;
>   ent->flg = WSFONT_STATIC;
>   }
>  
>   /* Now link into the list and return */
>   TAILQ_INSERT_TAIL(, ent, chain);
>   splx(s);
> @@ -549,27 +548,31 @@ wsfont_remove(int cookie)
>   return (-1);
>   }
>  
>   if ((ent->flg & WSFONT_BUILTIN) != 0 || ent->lockcount != 0) {
>   splx(s);
>   return (-1);
>   }
>  
>   /* Don't free statically allocated font data */
>   if ((ent->flg & WSFONT_STATIC) != 0) {
> - free(ent->font->data, M_DEVBUF, 0);
> - free(ent->font, M_DEVBUF, 0);
> + struct wsdisplay_font *font = ent->font;
> +
> + free(font->data, M_DEVBUF,
> + font->numchars * font->stride * font->fontwidth);
> + free(font, M_DEVBUF, sizeof(*font));
> + ent->font = NULL;
>   }
>  
>   /* Remove from list, free entry */
> - TAILQ_REMOVE(, ent, chain);
> - free(ent, M_DEVBUF, 0);
> + TAILQ_REMOVE(, ent, chain);
> + free(ent, M_DEVBUF, sizeof(*ent));
>   splx(s);
>   return (0);
>  }
>  #endif
>  
>  /*
>   * Lock a given font and return new lockcount. This fails if the cookie
>   * is invalid, or if the font is already locked and the bit/byte order
>   * requested by the caller differs.
>   */
> 



Re: wsfont & free(9) sizes

2019-07-10 Thread Martin Pieuchot
On 10/07/19(Wed) 12:59, Martin Pieuchot wrote:
> Some free(9) sizes & fix to make wsfont_remove() compile.  This function
> is #ifndef for the moment.  That's mainly for coherency and to reduce
> grep noise.

Simpler approach that removed compiled-out wsfont_remove(), so we don't
have to keep track of the size separately from height & width since they
can be different & swapper.

Ok?

Index: dev/wsfont/wsfont.c
===
RCS file: /cvs/src/sys/dev/wsfont/wsfont.c,v
retrieving revision 1.55
diff -u -p -r1.55 wsfont.c
--- dev/wsfont/wsfont.c 9 Jan 2019 11:23:32 -   1.55
+++ dev/wsfont/wsfont.c 10 Jul 2019 17:23:30 -
@@ -533,42 +533,6 @@ wsfont_add(struct wsdisplay_font *font, 
 }
 
 /*
- * Remove a font.
- */
-#ifdef notyet
-int
-wsfont_remove(int cookie)
-{
-   struct font *ent;
-   int s;
-
-   s = splhigh();
-
-   if ((ent = wsfont_find0(cookie)) == NULL) {
-   splx(s);
-   return (-1);
-   }
-
-   if ((ent->flg & WSFONT_BUILTIN) != 0 || ent->lockcount != 0) {
-   splx(s);
-   return (-1);
-   }
-
-   /* Don't free statically allocated font data */
-   if ((ent->flg & WSFONT_STATIC) != 0) {
-   free(ent->font->data, M_DEVBUF, 0);
-   free(ent->font, M_DEVBUF, 0);
-   }
-
-   /* Remove from list, free entry */
-   TAILQ_REMOVE(, ent, chain);
-   free(ent, M_DEVBUF, 0);
-   splx(s);
-   return (0);
-}
-#endif
-
-/*
  * Lock a given font and return new lockcount. This fails if the cookie
  * is invalid, or if the font is already locked and the bit/byte order
  * requested by the caller differs.



wsfont & free(9) sizes

2019-07-10 Thread Martin Pieuchot
Some free(9) sizes & fix to make wsfont_remove() compile.  This function
is #ifndef for the moment.  That's mainly for coherency and to reduce
grep noise.

ok?

Index: dev/wsfont/wsfont.c
===
RCS file: /cvs/src/sys/dev/wsfont/wsfont.c,v
retrieving revision 1.55
diff -u -p -u -1 -0 -r1.55 wsfont.c
--- dev/wsfont/wsfont.c 9 Jan 2019 11:23:32 -   1.55
+++ dev/wsfont/wsfont.c 23 Jun 2019 00:17:43 -
@@ -346,23 +346,23 @@ wsfont_rotate_ccw(struct wsdisplay_font 
 }
 
 struct wsdisplay_font *
 wsfont_rotate_internal(struct wsdisplay_font *font, int ccw)
 {
int newstride;
struct wsdisplay_font *newfont;
char *newbits;
 
/* Duplicate the existing font... */
-   newfont = malloc(sizeof *font, M_DEVBUF, M_WAITOK);
+   newfont = malloc(sizeof(*newfont), M_DEVBUF, M_WAITOK);
 
-   bcopy(font, newfont, sizeof *font);
+   bcopy(font, newfont, sizeof(*font));
newfont->cookie = NULL;
 
/* Allocate a buffer big enough for the rotated font. */
newstride = (font->fontheight + 7) / 8;
newbits = mallocarray(font->numchars, newstride * font->fontwidth,
M_DEVBUF, M_WAITOK | M_ZERO);
 
if (ccw)
wsfont_rotate_ccw(font, newbits, newstride);
else
@@ -374,22 +374,22 @@ wsfont_rotate_internal(struct wsdisplay_
newfont->stride = newstride;
newfont->fontwidth = font->fontheight;
newfont->fontheight = font->fontwidth;
 
if (wsfont_add(newfont, 0) != 0) {
/*
 * If we seem to have rotated this font already, drop the
 * new one...
 */
free(newbits, M_DEVBUF,
-   font->numchars * newstride * font->fontwidth);
-   free(newfont, M_DEVBUF, sizeof *font);
+   newfont->numchars * newfont->stride * newfont->fontwidth);
+   free(newfont, M_DEVBUF, sizeof(*newfont));
newfont = NULL;
}
 
return (newfont);
 }
 
 int
 wsfont_rotate(int cookie, int ccw)
 {
int s, ncookie;
@@ -499,33 +499,32 @@ wsfont_add(struct wsdisplay_font *font, 
}
 
TAILQ_FOREACH(ent, , chain)
fontc++;
 
if (fontc >= WSDISPLAY_MAXFONTCOUNT) {
splx(s);
return (-1);
}
 
-   ent = (struct font *)malloc(sizeof *ent, M_DEVBUF, M_WAITOK);
+   ent = malloc(sizeof(*ent), M_DEVBUF, M_WAITOK);
 
ent->lockcount = 0;
ent->flg = 0;
ent->cookie = cookiegen++;
 
/*
 * If we are coming from a WSDISPLAYIO_LDFONT ioctl, we need to
 * make a copy of the wsdisplay_font struct, but not of font->bits.
 */
if (copy) {
-   ent->font = (struct wsdisplay_font *)malloc(sizeof *ent->font,
-   M_DEVBUF, M_WAITOK);
+   ent->font = malloc(sizeof(*ent->font), M_DEVBUF, M_WAITOK);
memcpy(ent->font, font, sizeof(*ent->font));
ent->flg = 0;
} else {
ent->font = font;
ent->flg = WSFONT_STATIC;
}
 
/* Now link into the list and return */
TAILQ_INSERT_TAIL(, ent, chain);
splx(s);
@@ -549,27 +548,31 @@ wsfont_remove(int cookie)
return (-1);
}
 
if ((ent->flg & WSFONT_BUILTIN) != 0 || ent->lockcount != 0) {
splx(s);
return (-1);
}
 
/* Don't free statically allocated font data */
if ((ent->flg & WSFONT_STATIC) != 0) {
-   free(ent->font->data, M_DEVBUF, 0);
-   free(ent->font, M_DEVBUF, 0);
+   struct wsdisplay_font *font = ent->font;
+
+   free(font->data, M_DEVBUF,
+   font->numchars * font->stride * font->fontwidth);
+   free(font, M_DEVBUF, sizeof(*font));
+   ent->font = NULL;
}
 
/* Remove from list, free entry */
-   TAILQ_REMOVE(, ent, chain);
-   free(ent, M_DEVBUF, 0);
+   TAILQ_REMOVE(, ent, chain);
+   free(ent, M_DEVBUF, sizeof(*ent));
splx(s);
return (0);
 }
 #endif
 
 /*
  * Lock a given font and return new lockcount. This fails if the cookie
  * is invalid, or if the font is already locked and the bit/byte order
  * requested by the caller differs.
  */