[cogl/wip/unref-virtual: 2/4] object: Remove the type member of CoglObjectClass



commit 1224c2a15e57556c33caa376bff790148a97356e
Author: Neil Roberts <neil linux intel com>
Date:   Tue Jan 24 16:24:26 2012 +0000

    object: Remove the type member of CoglObjectClass
    
    Unlike in GObject the type number for a CoglObject is entirely an
    internal implementation detail so there is no need to make a GQuark to
    make it safe to export out of the library. Instead we can just
    directly use a fixed pointer address as the identifier for the type.
    This patch makes it use the address of the class struct of the
    identifier. This should make it faster to do type checks because it
    does not need to call a function every time it wants to get the type
    number.

 cogl/cogl-atlas-texture-private.h             |    3 -
 cogl/cogl-buffer-private.h                    |    5 +-
 cogl/cogl-buffer.c                            |    7 +--
 cogl/cogl-framebuffer.c                       |    6 +-
 cogl/cogl-object-private.h                    |   62 +++++++++----------------
 cogl/cogl-onscreen-private.h                  |    4 +-
 cogl/cogl-pixel-buffer-private.h              |    3 -
 cogl/cogl-sub-texture-private.h               |    3 -
 cogl/cogl-texture-2d-private.h                |    3 -
 cogl/cogl-texture-2d-sliced-private.h         |    3 -
 cogl/cogl-texture-3d-private.h                |    3 -
 cogl/cogl-texture-private.h                   |    8 +--
 cogl/cogl-texture-rectangle-private.h         |    3 -
 cogl/cogl-texture.c                           |    7 +--
 cogl/winsys/cogl-texture-pixmap-x11-private.h |    3 -
 15 files changed, 37 insertions(+), 86 deletions(-)
---
diff --git a/cogl/cogl-atlas-texture-private.h b/cogl/cogl-atlas-texture-private.h
index b7f7b03..541cd3d 100644
--- a/cogl/cogl-atlas-texture-private.h
+++ b/cogl/cogl-atlas-texture-private.h
@@ -55,9 +55,6 @@ struct _CoglAtlasTexture
   CoglHandle            sub_texture;
 };
 
-GQuark
-_cogl_handle_atlas_texture_get_type (void);
-
 CoglHandle
 _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
                                      CoglTextureFlags flags,
diff --git a/cogl/cogl-buffer-private.h b/cogl/cogl-buffer-private.h
index ed324f9..93c1c06 100644
--- a/cogl/cogl-buffer-private.h
+++ b/cogl/cogl-buffer-private.h
@@ -102,13 +102,12 @@ struct _CoglBuffer
 /* This is used to register a type to the list of handle types that
    will be considered a texture in cogl_is_texture() */
 void
-_cogl_buffer_register_buffer_type (GQuark type);
+_cogl_buffer_register_buffer_type (const CoglObjectClass *klass);
 
 #define COGL_BUFFER_DEFINE(TypeName, type_name)                         \
   COGL_OBJECT_DEFINE_WITH_CODE                                          \
   (TypeName, type_name,                                                 \
-   _cogl_buffer_register_buffer_type (_cogl_object_                     \
-                                      ## type_name ## _get_type ()))
+   _cogl_buffer_register_buffer_type (&_cogl_##type_name##_class))
 
 void
 _cogl_buffer_initialize (CoglBuffer          *buffer,
diff --git a/cogl/cogl-buffer.c b/cogl/cogl-buffer.c
index cb7d0a0..9b7f676 100644
--- a/cogl/cogl-buffer.c
+++ b/cogl/cogl-buffer.c
@@ -78,12 +78,11 @@
  */
 
 void
-_cogl_buffer_register_buffer_type (GQuark type)
+_cogl_buffer_register_buffer_type (const CoglObjectClass *klass)
 {
   _COGL_GET_CONTEXT (ctx, NO_RETVAL);
 
-  ctx->buffer_types = g_slist_prepend (ctx->buffer_types,
-                                       GINT_TO_POINTER (type));
+  ctx->buffer_types = g_slist_prepend (ctx->buffer_types, (void *) klass);
 }
 
 gboolean
@@ -98,7 +97,7 @@ cogl_is_buffer (const void *object)
     return FALSE;
 
   for (l = ctx->buffer_types; l; l = l->next)
-    if (GPOINTER_TO_INT (l->data) == obj->klass->type)
+    if (l->data == obj->klass)
       return TRUE;
 
   return FALSE;
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index 829b5c2..2e63681 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -109,7 +109,7 @@ typedef struct _CoglFramebufferStackEntry
   CoglFramebuffer *read_buffer;
 } CoglFramebufferStackEntry;
 
-extern GQuark _cogl_object_onscreen_get_type (void);
+extern CoglObjectClass _cogl_onscreen_class;
 
 static void _cogl_offscreen_free (CoglOffscreen *offscreen);
 
@@ -136,8 +136,8 @@ _cogl_is_framebuffer (void *object)
   if (obj == NULL)
     return FALSE;
 
-  return obj->klass->type == _cogl_object_onscreen_get_type ()
-    || obj->klass->type == _cogl_object_offscreen_get_type ();
+  return (obj->klass == &_cogl_onscreen_class ||
+          obj->klass == &_cogl_offscreen_class);
 }
 
 void
diff --git a/cogl/cogl-object-private.h b/cogl/cogl-object-private.h
index 52fa956..d335589 100644
--- a/cogl/cogl-object-private.h
+++ b/cogl/cogl-object-private.h
@@ -51,8 +51,8 @@ typedef void (*CoglUserDataDestroyInternalCallback) (void *user_data,
 
 typedef struct _CoglObjectClass
 {
-  GQuark   type;
-  void    *virt_free;
+  const char *name;
+  void *virt_free;
 } CoglObjectClass;
 
 #define COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES 2
@@ -95,18 +95,18 @@ struct _CoglObject
 #define _COGL_OBJECT_DEBUG_REF(type_name, object)       G_STMT_START {  \
   CoglObject *__obj = (CoglObject *)object;                             \
   COGL_NOTE (HANDLE, "COGL %s REF %p %i",                               \
-             g_quark_to_string ((__obj)->klass->type),                  \
+             (__obj)->klass->name,                                      \
              (__obj), (__obj)->ref_count);              } G_STMT_END
 
 #define _COGL_OBJECT_DEBUG_UNREF(type_name, object)     G_STMT_START {  \
   CoglObject *__obj = (CoglObject *)object;                             \
   COGL_NOTE (HANDLE, "COGL %s UNREF %p %i",                             \
-             g_quark_to_string ((__obj)->klass->type),                  \
+             (__obj)->klass->name,                                      \
              (__obj), (__obj)->ref_count - 1);          } G_STMT_END
 
 #define COGL_OBJECT_DEBUG_FREE(obj)                                     \
   COGL_NOTE (HANDLE, "COGL %s FREE %p",                                 \
-             g_quark_to_string ((obj)->klass->type), (obj))
+             (obj)->klass->name, (obj))
 
 #else /* !COGL_OBJECT_DEBUG */
 
@@ -125,7 +125,7 @@ struct _CoglObject
 
 #define COGL_OBJECT_COMMON_DEFINE_WITH_CODE(TypeName, type_name, code)  \
                                                                         \
-static CoglObjectClass _cogl_##type_name##_class;                       \
+CoglObjectClass _cogl_##type_name##_class;                              \
 static unsigned long _cogl_object_##type_name##_count;                  \
                                                                         \
 static inline void                                                      \
@@ -147,34 +147,6 @@ _cogl_object_##type_name##_indirect_free (CoglObject *obj)              \
   _cogl_object_##type_name##_dec ();                                    \
 }                                                                       \
                                                                         \
-GQuark                                                                  \
-_cogl_object_##type_name##_get_type (void)                              \
-{                                                                       \
-  static GQuark type = 0;                                               \
-  if (!type)                                                            \
-    {                                                                   \
-      type = g_quark_from_static_string ("Cogl"#TypeName);              \
-      _cogl_object_##type_name##_count = 0;                             \
-                                                                        \
-      if (_cogl_debug_instances == NULL)                                \
-        _cogl_debug_instances =                                         \
-          g_hash_table_new (g_str_hash, g_str_equal);                   \
-                                                                        \
-      g_hash_table_insert (_cogl_debug_instances,                       \
-                           "Cogl"#TypeName,                             \
-                           &_cogl_object_##type_name##_count);          \
-                                                                        \
-      { code; }                                                         \
-    }                                                                   \
-  return type;                                                          \
-}                                                                       \
-                                                                        \
-GQuark                                                                  \
-_cogl_handle_##type_name##_get_type (void)                              \
-{                                                                       \
-  return _cogl_object_##type_name##_get_type ();                        \
-}                                                                       \
-                                                                        \
 static Cogl##TypeName *                                                 \
 _cogl_##type_name##_object_new (Cogl##TypeName *new_obj)                \
 {                                                                       \
@@ -185,11 +157,23 @@ _cogl_##type_name##_object_new (Cogl##TypeName *new_obj)                \
   obj->user_data_array = NULL;                                          \
                                                                         \
   obj->klass = &_cogl_##type_name##_class;                              \
-  if (!obj->klass->type)                                                \
+  if (!obj->klass->virt_free)                                           \
     {                                                                   \
-      obj->klass->type = _cogl_object_##type_name##_get_type ();        \
+      _cogl_object_##type_name##_count = 0;                             \
+                                                                        \
+      if (_cogl_debug_instances == NULL)                                \
+        _cogl_debug_instances =                                         \
+          g_hash_table_new (g_str_hash, g_str_equal);                   \
+                                                                        \
       obj->klass->virt_free =                                           \
         _cogl_object_##type_name##_indirect_free;                       \
+      obj->klass->name = "Cogl"#TypeName,                               \
+                                                                        \
+      g_hash_table_insert (_cogl_debug_instances,                       \
+                           (void *) obj->klass->name,                   \
+                           &_cogl_object_##type_name##_count);          \
+                                                                        \
+      { code; }                                                         \
     }                                                                   \
                                                                         \
   _cogl_object_##type_name##_inc ();                                    \
@@ -215,8 +199,7 @@ cogl_is_##type_name (void *object)                                      \
   if (object == NULL)                                                   \
     return FALSE;                                                       \
                                                                         \
-  return (obj->klass->type ==                                           \
-          _cogl_object_##type_name##_get_type ());                      \
+  return obj->klass == &_cogl_##type_name##_class;                      \
 }
 
 #define COGL_OBJECT_INTERNAL_DEFINE_WITH_CODE(TypeName, type_name, code) \
@@ -231,8 +214,7 @@ _cogl_is_##type_name (void *object)                                     \
   if (object == NULL)                                                   \
     return FALSE;                                                       \
                                                                         \
-  return (obj->klass->type ==                                           \
-          _cogl_object_##type_name##_get_type ());                      \
+  return obj->klass == &_cogl_##type_name##_class;                      \
 }
 
 #define COGL_OBJECT_DEFINE_DEPRECATED_REF_COUNTING(type_name)   \
diff --git a/cogl/cogl-onscreen-private.h b/cogl/cogl-onscreen-private.h
index be789a5..25d2235 100644
--- a/cogl/cogl-onscreen-private.h
+++ b/cogl/cogl-onscreen-private.h
@@ -50,6 +50,7 @@ struct _CoglOnscreen
 
   void *winsys;
 };
+
 CoglOnscreen *
 _cogl_onscreen_new (void);
 
@@ -57,7 +58,4 @@ void
 _cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
                                       int width, int height);
 
-GQuark
-_cogl_object_onscreen_get_type (void);
-
 #endif /* __COGL_ONSCREEN_PRIVATE_H */
diff --git a/cogl/cogl-pixel-buffer-private.h b/cogl/cogl-pixel-buffer-private.h
index bccfb4b..6d79870 100644
--- a/cogl/cogl-pixel-buffer-private.h
+++ b/cogl/cogl-pixel-buffer-private.h
@@ -47,9 +47,6 @@ struct _CoglPixelBuffer
   unsigned int          stride;
 };
 
-GQuark
-_cogl_handle_pixel_buffer_get_type (void);
-
 G_END_DECLS
 
 #endif /* __COGL_PIXEL_BUFFER_PRIVATE_H__ */
diff --git a/cogl/cogl-sub-texture-private.h b/cogl/cogl-sub-texture-private.h
index b3fb761..3b66e3b 100644
--- a/cogl/cogl-sub-texture-private.h
+++ b/cogl/cogl-sub-texture-private.h
@@ -54,7 +54,4 @@ struct _CoglSubTexture
   int         sub_height;
 };
 
-GQuark
-_cogl_handle_sub_texture_get_type (void);
-
 #endif /* __COGL_SUB_TEXTURE_PRIVATE_H */
diff --git a/cogl/cogl-texture-2d-private.h b/cogl/cogl-texture-2d-private.h
index 97fee07..701cec0 100644
--- a/cogl/cogl-texture-2d-private.h
+++ b/cogl/cogl-texture-2d-private.h
@@ -52,9 +52,6 @@ struct _CoglTexture2D
   CoglTexturePixel first_pixel;
 };
 
-GQuark
-_cogl_handle_texture_2d_get_type (void);
-
 CoglHandle
 _cogl_texture_2d_new_from_bitmap (CoglBitmap      *bmp,
                                   CoglTextureFlags flags,
diff --git a/cogl/cogl-texture-2d-sliced-private.h b/cogl/cogl-texture-2d-sliced-private.h
index 1cd09fe..0a388ee 100644
--- a/cogl/cogl-texture-2d-sliced-private.h
+++ b/cogl/cogl-texture-2d-sliced-private.h
@@ -43,9 +43,6 @@ struct _CoglTexture2DSliced
   int               height;
 };
 
-GQuark
-_cogl_handle_texture_2d_sliced_get_type (void);
-
 CoglTexture2DSliced *
 _cogl_texture_2d_sliced_new_from_foreign (GLuint           gl_handle,
                                           GLenum           gl_target,
diff --git a/cogl/cogl-texture-3d-private.h b/cogl/cogl-texture-3d-private.h
index 7fa29ae..b6c9923 100644
--- a/cogl/cogl-texture-3d-private.h
+++ b/cogl/cogl-texture-3d-private.h
@@ -58,9 +58,6 @@ struct _CoglTexture3D
   CoglTexturePixel first_pixel;
 };
 
-GQuark
-_cogl_handle_texture_3d_get_type (void);
-
 /*
  * cogl_texture_3d_new_from_bitmap:
  * @bmp_handle: A #CoglHandle to a bitmap.
diff --git a/cogl/cogl-texture-private.h b/cogl/cogl-texture-private.h
index 1ca0561..1048b21 100644
--- a/cogl/cogl-texture-private.h
+++ b/cogl/cogl-texture-private.h
@@ -168,19 +168,17 @@ _cogl_texture_free (CoglTexture *texture);
 /* This is used to register a type to the list of handle types that
    will be considered a texture in cogl_is_texture() */
 void
-_cogl_texture_register_texture_type (GQuark type);
+_cogl_texture_register_texture_type (const CoglObjectClass *klass);
 
 #define COGL_TEXTURE_DEFINE(TypeName, type_name)                        \
   COGL_HANDLE_DEFINE_WITH_CODE                                          \
   (TypeName, type_name,                                                 \
-   _cogl_texture_register_texture_type (_cogl_handle_                   \
-                                        ## type_name ## _get_type ()))
+   _cogl_texture_register_texture_type (&_cogl_##type_name##_class))
 
 #define COGL_TEXTURE_INTERNAL_DEFINE(TypeName, type_name)               \
   COGL_HANDLE_INTERNAL_DEFINE_WITH_CODE                                 \
   (TypeName, type_name,                                                 \
-   _cogl_texture_register_texture_type (_cogl_handle_                   \
-                                        ## type_name ## _get_type ()))
+   _cogl_texture_register_texture_type (&_cogl_##type_name##_class))
 
 gboolean
 _cogl_texture_can_hardware_repeat (CoglTexture *texture);
diff --git a/cogl/cogl-texture-rectangle-private.h b/cogl/cogl-texture-rectangle-private.h
index dde9109..21bcf3f 100644
--- a/cogl/cogl-texture-rectangle-private.h
+++ b/cogl/cogl-texture-rectangle-private.h
@@ -47,9 +47,6 @@ struct _CoglTextureRectangle
   gboolean        is_foreign;
 };
 
-GQuark
-_cogl_handle_texture_rectangle_get_type (void);
-
 CoglTextureRectangle *
 _cogl_texture_rectangle_new_from_bitmap (CoglBitmap      *bmp,
                                          CoglTextureFlags flags,
diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
index a072d91..bb8930a 100644
--- a/cogl/cogl-texture.c
+++ b/cogl/cogl-texture.c
@@ -70,12 +70,11 @@ cogl_texture_error_quark (void)
  */
 
 void
-_cogl_texture_register_texture_type (GQuark type)
+_cogl_texture_register_texture_type (const CoglObjectClass *klass)
 {
   _COGL_GET_CONTEXT (ctxt, NO_RETVAL);
 
-  ctxt->texture_types = g_slist_prepend (ctxt->texture_types,
-                                         GINT_TO_POINTER (type));
+  ctxt->texture_types = g_slist_prepend (ctxt->texture_types, (void *) klass);
 }
 
 gboolean
@@ -90,7 +89,7 @@ cogl_is_texture (void *object)
     return FALSE;
 
   for (l = ctxt->texture_types; l; l = l->next)
-    if (GPOINTER_TO_INT (l->data) == obj->klass->type)
+    if (l->data == obj->klass)
       return TRUE;
 
   return FALSE;
diff --git a/cogl/winsys/cogl-texture-pixmap-x11-private.h b/cogl/winsys/cogl-texture-pixmap-x11-private.h
index 60c11b9..699baf7 100644
--- a/cogl/winsys/cogl-texture-pixmap-x11-private.h
+++ b/cogl/winsys/cogl-texture-pixmap-x11-private.h
@@ -81,7 +81,4 @@ struct _CoglTexturePixmapX11
   gboolean use_winsys_texture;
 };
 
-GQuark
-_cogl_handle_texture_pixmap_x11_get_type (void);
-
 #endif /* __COGL_TEXTURE_PIXMAP_X11_PRIVATE_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]