wsfont & free(9) sizes

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

wsfont & free(9) sizes

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 -0000 1.55
+++ dev/wsfont/wsfont.c 23 Jun 2019 00:17:43 -0000
@@ -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, &fontlist, 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(&fontlist, 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(&list, ent, chain);
- free(ent, M_DEVBUF, 0);
+ TAILQ_REMOVE(&fontlist, 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.
  */

Reply | Threaded
Open this post in threaded view
|

Re: wsfont & free(9) sizes

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 -0000 1.55
+++ dev/wsfont/wsfont.c 10 Jul 2019 17:23:30 -0000
@@ -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(&list, 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.

Reply | Threaded
Open this post in threaded view
|

Re: wsfont & free(9) sizes

Jan Klemkow
In reply to this post by Martin Pieuchot
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 -0000 1.55
> +++ dev/wsfont/wsfont.c 23 Jun 2019 00:17:43 -0000
> @@ -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, &fontlist, 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(&fontlist, 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(&list, ent, chain);
> - free(ent, M_DEVBUF, 0);
> + TAILQ_REMOVE(&fontlist, 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.
>   */
>