From: Yasushi Shoji <yashi / yashi.com>
Subject: [ruby-ext:00753] Re: Gtk::GL
Date: Sat, 18 Dec 1999 06:52:11 -0500

> で、どうしましょう、これ。Mesaがどれくらいの間隔で releaseされてるかとか
> 全然知らないんですけど、3.1って出たばっかりですよね‥。

さすがに leakさせる訳にはいかないのでちょっと書いてみました。

やってる事は、変数 glu_Nurbs{Curve,Surface}で作った GLfloatの arrayの
pointerを 変数 gmsに入れておいて glu_End{Curve,Surface}で freeしてます。
が、こんな事して良いのか良くわかってません。(^^;  どなたか見ていただける
と幸いです。

# ばかな事してたら、ずばっと言ってください。m(__)m

p.s. topで見ながら、再描画させまくると sizeが大きくなっていくようです。
     が、どこで leakしてるか分らない‥。


--- glu.c 1999/12/13 05:27:48 1.3 +++ glu.c 1999/12/18 17:27:09 @@ -6,6 +6,15 @@ #include "GL/glu.h" #include "rbogl.h" +#ifdef MESA +struct glu_MesaStack { + int len; + GLfloat **ptr; +}; + +static struct glu_MesaStack gms = {0, NULL}; +#endif + struct nurbsdata { GLUnurbsObj *nobj; }; @@ -155,6 +164,13 @@ struct nurbsdata *ndata; GetNURBS(arg1, ndata); gluEndCurve(ndata->nobj); + /* hack for Mesa 3.1 */ +#ifdef MESA + for (gms.len;gms.len>0;gms.len--) + free(gms.ptr[gms.len-1]); + free(gms.ptr); + gms.ptr = NULL; +#endif return Qnil; } static VALUE @@ -212,8 +228,17 @@ } GetNURBS(args[0], ndata); gluNurbsCurve(ndata->nobj, uknot_count, uknot, u_stride, ctlarray, uorder, type); +/* as of Mesa 3.1, Mesa assumes all data that following pointers + points to is valid at gluEndCurve. so, free them in + glu_EndCurve() */ +#ifdef MESA + gms.ptr = REALLOC_N(gms.ptr, GLfloat*, gms.len+=2); + gms.ptr[gms.len - 2] = uknot; + gms.ptr[gms.len - 1] = ctlarray; +#else free(uknot); free(ctlarray); +#endif return Qnil; } static VALUE @@ -232,6 +257,13 @@ struct nurbsdata *ndata; GetNURBS(arg1, ndata); gluEndSurface(ndata->nobj); + /* hack for Mesa 3.1 */ +#ifdef MESA + for(gms.len; gms.len>0; gms.len--) + free(gms.ptr[gms.len-1]); + free(gms.ptr); + gms.ptr = NULL; +#endif return Qnil; } @@ -305,9 +337,20 @@ GetNURBS(args[0], ndata); gluNurbsSurface(ndata->nobj, sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctlarray, sorder, torder, type); + +/* as of Mesa 3.1, Mesa assumes all data that following pointers + points to is valid at gluEndSurface. so, free them in + glu_EndSurface() */ +#ifdef MESA + gms.ptr = REALLOC_N(gms.ptr, GLfloat*, gms.len+=3); + gms.ptr[gms.len-3] = sknot; + gms.ptr[gms.len-2] = tknot; + gms.ptr[gms.len-1] = ctlarray; +#else free(sknot); free(tknot); free(ctlarray); +#endif return Qnil; } static VALUE @@ -1036,7 +1079,9 @@ rb_define_const(mGLU, "TESS_ERROR6", INT2NUM(GLU_TESS_ERROR6)); rb_define_const(mGLU, "TESS_ERROR7", INT2NUM(GLU_TESS_ERROR7)); rb_define_const(mGLU, "TESS_ERROR8", INT2NUM(GLU_TESS_ERROR8)); +#ifndef MESA /* for Mesa 3.1 */ rb_define_const(mGLU, "TESS_ERROR9", INT2NUM(GLU_TESS_ERROR9)); +#endif