[beast: 44/95] SFI: store glue context on Rapicorn::ThreadInfo::self
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast: 44/95] SFI: store glue context on Rapicorn::ThreadInfo::self
- Date: Mon, 25 Mar 2013 00:40:12 +0000 (UTC)
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]