summary refs log tree commit diff
path: root/shared/nm-default.h
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2016-10-01 00:33:49 +0200
committerMichael Biebl <biebl@debian.org>2016-10-01 00:33:49 +0200
commit270c4830551c9810ad4e83f9a1db2b1cb946208c (patch)
tree5df09188f7e43b70896efb7b6e942e0b130d75d3 /shared/nm-default.h
parent7514efc2f38c9ace4557d4e69d68e7d380389030 (diff)
New upstream version 1.4.2 upstream/1.4.2
Diffstat (limited to 'shared/nm-default.h')
-rw-r--r--shared/nm-default.h61
1 files changed, 57 insertions, 4 deletions
diff --git a/shared/nm-default.h b/shared/nm-default.h
index e3e3ea44..9e2377cf 100644
--- a/shared/nm-default.h
+++ b/shared/nm-default.h
@@ -52,15 +52,68 @@
 #define NM_VERSION_MAX_ALLOWED   NM_VERSION_NEXT_STABLE
 #define NM_VERSION_MIN_REQUIRED  NM_VERSION_0_9_8
 
+#ifndef NM_MORE_ASSERTS
+#define NM_MORE_ASSERTS 0
+#endif
+
+#if NM_MORE_ASSERTS == 0
+/* The cast macros like NM_TYPE() are implemented via G_TYPE_CHECK_INSTANCE_CAST()
+ * and _G_TYPE_CIC(). The latter, by default performs runtime checks of the type
+ * by calling g_type_check_instance_cast().
+ * This check has a certain overhead without being helpful.
+ *
+ * Example 1:
+ *     static void foo (NMType *obj)
+ *     {
+ *         access_obj_without_check (obj);
+ *     }
+ *     foo ((NMType *) obj);
+ *     // There is no runtime check and passing an invalid pointer
+ *     // leads to a crash.
+ *
+ * Example 2:
+ *     static void foo (NMType *obj)
+ *     {
+ *         access_obj_without_check (obj);
+ *     }
+ *     foo (NM_TYPE (obj));
+ *     // There is a runtime check which prints a g_warning(), but that doesn't
+ *     // avoid the crash as NM_TYPE() cannot do anything then passing on the
+ *     // invalid pointer.
+ *
+ * Example 3:
+ *     static void foo (NMType *obj)
+ *     {
+ *         g_return_if_fail (NM_IS_TYPE (obj));
+ *         access_obj_without_check (obj);
+ *     }
+ *     foo ((NMType *) obj);
+ *     // There is a runtime check which prints a g_critical() which also avoids
+ *     // the crash. That is actually helpful to catch bugs and avoid crashes.
+ *
+ * Example 4:
+ *     static void foo (NMType *obj)
+ *     {
+ *         g_return_if_fail (NM_IS_TYPE (obj));
+ *         access_obj_without_check (obj);
+ *     }
+ *     foo (NM_TYPE (obj));
+ *     // The runtime check is performed twice, with printing a g_warning() and
+ *     // a g_critical() and avoiding the crash.
+ *
+ * Example 3 is how it should be done. Type checks in NM_TYPE() are pointless.
+ * Disable them for our production builds.
+ */
+#ifndef G_DISABLE_CAST_CHECKS
+#define G_DISABLE_CAST_CHECKS
+#endif
+#endif
+
 #include <stdlib.h>
 #include <glib.h>
 
 /*****************************************************************************/
 
-#ifndef NM_MORE_ASSERTS
-#define NM_MORE_ASSERTS 0
-#endif
-
 #if NM_MORE_ASSERTS == 0
 
 /* glib assertions (g_return_*(), g_assert*()) contain a textual representation