Revert "gatomic: statically assert that our assumptions hold"
[platform/upstream/glib.git] / glib / ghook.h
index fe350e1..f0b6516 100644 (file)
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GLib Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */
 
 #ifndef __G_HOOK_H__
 #define __G_HOOK_H__
 
-#include <gmem.h>
+#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
+#error "Only <glib.h> can be included directly."
+#endif
+
+#include <glib/gmem.h>
 
 G_BEGIN_DECLS
 
+
+/* --- typedefs --- */
 typedef struct _GHook          GHook;
 typedef struct _GHookList      GHookList;
 
@@ -39,137 +43,160 @@ typedef gint              (*GHookCompareFunc)     (GHook          *new_hook,
 typedef gboolean       (*GHookFindFunc)        (GHook          *hook,
                                                 gpointer        data);
 typedef void           (*GHookMarshaller)      (GHook          *hook,
-                                                gpointer        data);
+                                                gpointer        marshal_data);
 typedef gboolean       (*GHookCheckMarshaller) (GHook          *hook,
-                                                gpointer        data);
+                                                gpointer        marshal_data);
 typedef void           (*GHookFunc)            (gpointer        data);
 typedef gboolean       (*GHookCheckFunc)       (gpointer        data);
-typedef void           (*GHookFreeFunc)        (GHookList      *hook_list,
+typedef void           (*GHookFinalizeFunc)    (GHookList      *hook_list,
                                                 GHook          *hook);
-
-/* Callback maintenance functions
- */
-#define G_HOOK_FLAG_USER_SHIFT (4)
 typedef enum
 {
-  G_HOOK_FLAG_ACTIVE   = 1 << 0,
-  G_HOOK_FLAG_IN_CALL  = 1 << 1,
-  G_HOOK_FLAG_MASK     = 0x0f
+  G_HOOK_FLAG_ACTIVE       = 1 << 0,
+  G_HOOK_FLAG_IN_CALL      = 1 << 1,
+  G_HOOK_FLAG_MASK         = 0x0f
 } GHookFlagMask;
+#define G_HOOK_FLAG_USER_SHIFT (4)
 
-#define        G_HOOK_DEFERRED_DESTROY ((GHookFreeFunc) 0x01)
 
+/* --- structures --- */
 struct _GHookList
 {
-  guint                 seq_id;
-  guint                 hook_size;
-  guint                 is_setup : 1;
-  GHook                *hooks;
-  GMemChunk    *hook_memchunk;
-  GHookFreeFunc         hook_free; /* virtual function */
-  GHookFreeFunc         hook_destroy; /* virtual function */
+  gulong           seq_id;
+  guint                    hook_size : 16;
+  guint                    is_setup : 1;
+  GHook                   *hooks;
+  gpointer         dummy3;
+  GHookFinalizeFunc finalize_hook;
+  gpointer         dummy[2];
 };
-
 struct _GHook
 {
   gpointer      data;
   GHook                *next;
   GHook                *prev;
   guint                 ref_count;
-  guint                 hook_id;
+  gulong        hook_id;
   guint                 flags;
   gpointer      func;
   GDestroyNotify destroy;
 };
 
-#define        G_HOOK_ACTIVE(hook)             ((((GHook*) hook)->flags & \
+
+/* --- macros --- */
+#define        G_HOOK(hook)                    ((GHook*) (hook))
+#define        G_HOOK_FLAGS(hook)              (G_HOOK (hook)->flags)
+#define        G_HOOK_ACTIVE(hook)             ((G_HOOK_FLAGS (hook) & \
                                          G_HOOK_FLAG_ACTIVE) != 0)
-#define        G_HOOK_IN_CALL(hook)            ((((GHook*) hook)->flags & \
+#define        G_HOOK_IN_CALL(hook)            ((G_HOOK_FLAGS (hook) & \
                                          G_HOOK_FLAG_IN_CALL) != 0)
-#define G_HOOK_IS_VALID(hook)          (((GHook*) hook)->hook_id != 0 && \
-                                        G_HOOK_ACTIVE (hook))
-#define G_HOOK_IS_UNLINKED(hook)       (((GHook*) hook)->next == NULL && \
-                                        ((GHook*) hook)->prev == NULL && \
-                                        ((GHook*) hook)->hook_id == 0 && \
-                                        ((GHook*) hook)->ref_count == 0)
-
+#define G_HOOK_IS_VALID(hook)          (G_HOOK (hook)->hook_id != 0 && \
+                                        (G_HOOK_FLAGS (hook) & \
+                                          G_HOOK_FLAG_ACTIVE))
+#define G_HOOK_IS_UNLINKED(hook)       (G_HOOK (hook)->next == NULL && \
+                                        G_HOOK (hook)->prev == NULL && \
+                                        G_HOOK (hook)->hook_id == 0 && \
+                                        G_HOOK (hook)->ref_count == 0)
+
+
+/* --- prototypes --- */
+/* callback maintenance functions */
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_init               (GHookList              *hook_list,
                                         guint                   hook_size);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_clear              (GHookList              *hook_list);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_alloc                   (GHookList              *hook_list);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_free                    (GHookList              *hook_list,
                                         GHook                  *hook);
-void    g_hook_ref                     (GHookList              *hook_list,
+GLIB_AVAILABLE_IN_ALL
+GHook *         g_hook_ref                     (GHookList              *hook_list,
                                         GHook                  *hook);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_unref                   (GHookList              *hook_list,
                                         GHook                  *hook);
+GLIB_AVAILABLE_IN_ALL
 gboolean g_hook_destroy                        (GHookList              *hook_list,
-                                        guint                   hook_id);
+                                        gulong                  hook_id);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_destroy_link            (GHookList              *hook_list,
                                         GHook                  *hook);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_prepend                 (GHookList              *hook_list,
                                         GHook                  *hook);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_insert_before           (GHookList              *hook_list,
                                         GHook                  *sibling,
                                         GHook                  *hook);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_insert_sorted           (GHookList              *hook_list,
                                         GHook                  *hook,
                                         GHookCompareFunc        func);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_get                     (GHookList              *hook_list,
-                                        guint                   hook_id);
+                                        gulong                  hook_id);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_find                    (GHookList              *hook_list,
                                         gboolean                need_valids,
                                         GHookFindFunc           func,
                                         gpointer                data);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_find_data               (GHookList              *hook_list,
                                         gboolean                need_valids,
                                         gpointer                data);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_find_func               (GHookList              *hook_list,
                                         gboolean                need_valids,
                                         gpointer                func);
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_find_func_data          (GHookList              *hook_list,
                                         gboolean                need_valids,
                                         gpointer                func,
                                         gpointer                data);
 /* return the first valid hook, and increment its reference count */
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_first_valid             (GHookList              *hook_list,
                                         gboolean                may_be_in_call);
 /* return the next valid hook with incremented reference count, and
  * decrement the reference count of the original hook
  */
+GLIB_AVAILABLE_IN_ALL
 GHook*  g_hook_next_valid              (GHookList              *hook_list,
                                         GHook                  *hook,
                                         gboolean                may_be_in_call);
-
 /* GHookCompareFunc implementation to insert hooks sorted by their id */
+GLIB_AVAILABLE_IN_ALL
 gint    g_hook_compare_ids             (GHook                  *new_hook,
                                         GHook                  *sibling);
-
 /* convenience macros */
 #define         g_hook_append( hook_list, hook )  \
      g_hook_insert_before ((hook_list), NULL, (hook))
-
 /* invoke all valid hooks with the (*GHookFunc) signature.
  */
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_invoke             (GHookList              *hook_list,
                                         gboolean                may_recurse);
 /* invoke all valid hooks with the (*GHookCheckFunc) signature,
  * and destroy the hook if FALSE is returned.
  */
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_invoke_check       (GHookList              *hook_list,
                                         gboolean                may_recurse);
 /* invoke a marshaller on all valid hooks.
  */
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_marshal            (GHookList              *hook_list,
                                         gboolean                may_recurse,
                                         GHookMarshaller         marshaller,
-                                        gpointer                data);
+                                        gpointer                marshal_data);
+GLIB_AVAILABLE_IN_ALL
 void    g_hook_list_marshal_check      (GHookList              *hook_list,
                                         gboolean                may_recurse,
                                         GHookCheckMarshaller    marshaller,
-                                        gpointer                data);
+                                        gpointer                marshal_data);
 
 G_END_DECLS
 
 #endif /* __G_HOOK_H__ */
-