[beast: 44/95] SFI: store glue context on Rapicorn::ThreadInfo::self



commit 09ed32cef91fe69c93560eb4c20a73d87e71619c
Author: Tim Janik <timj gnu org>
Date:   Tue Mar 19 01:55:27 2013 +0100

    SFI: store glue context on Rapicorn::ThreadInfo::self

 sfi/sfiglue.cc |   33 ++++++++++++++++++++++++---------
 1 files changed, 24 insertions(+), 9 deletions(-)
---
diff --git a/sfi/sfiglue.cc b/sfi/sfiglue.cc
index 91e0608..4357f5e 100644
--- a/sfi/sfiglue.cc
+++ b/sfi/sfiglue.cc
@@ -27,31 +27,46 @@ sfi_glue_context_common_init (SfiGlueContext            *context,
   context->pending_events = NULL;
   context->gc_hash = glue_gc_hash_table_new ();
 }
+
+class RingPtrDataKey : public Rapicorn::DataKey<SfiRing*> {
+  virtual void destroy (SfiRing *ring) override
+  {
+    if (ring)
+      sfi_ring_free (ring);
+  }
+};
+static RingPtrDataKey context_stack_key;
+
 void
 sfi_glue_context_push (SfiGlueContext *context)
 {
   g_return_if_fail (context != NULL);
   g_return_if_fail (context->table.destroy != NULL);
-  sfi_thread_set_qdata_full (quark_context_stack,
-                            sfi_ring_prepend ((SfiRing*) sfi_thread_steal_qdata (quark_context_stack),
-                                              context),
-                            (GDestroyNotify) sfi_ring_free);
+
+  Rapicorn::ThreadInfo &self = Rapicorn::ThreadInfo::self();
+  SfiRing *context_stack = self.swap_data (&context_stack_key, (SfiRing*) NULL); // prevents deletion
+  context_stack = sfi_ring_prepend (context_stack, context);
+  self.set_data (&context_stack_key, context_stack);
 }
+
 SfiGlueContext*
 sfi_glue_context_current (void)
 {
-  SfiRing *context_stack = (SfiRing*) sfi_thread_get_qdata (quark_context_stack);
+  Rapicorn::ThreadInfo &self = Rapicorn::ThreadInfo::self();
+  SfiRing *context_stack = self.get_data (&context_stack_key);
   return (SfiGlueContext*) (context_stack ? context_stack->data : NULL);
 }
+
 void
 sfi_glue_context_pop (void)
 {
-  SfiRing *context_stack = (SfiRing*) sfi_thread_steal_qdata (quark_context_stack);
+  Rapicorn::ThreadInfo &self = Rapicorn::ThreadInfo::self();
+  SfiRing *context_stack = self.swap_data (&context_stack_key, (SfiRing*) NULL); // prevents deletion
   g_return_if_fail (context_stack != NULL);
-  sfi_thread_set_qdata_full (quark_context_stack,
-                            sfi_ring_remove_node (context_stack, context_stack),
-                            (GDestroyNotify) sfi_ring_free);
+  context_stack = sfi_ring_remove_node (context_stack, context_stack);
+  self.set_data (&context_stack_key, context_stack);
 }
+
 SfiRing*
 sfi_glue_context_list_poll_fds (void)
 {


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