You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2016/03/19 18:27:18 UTC

[08/14] lucy-clownfish git commit: Make cfish_init_parcel thread-safe

Make cfish_init_parcel thread-safe

Initialize globals with compare-and-swap.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/7528af45
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/7528af45
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/7528af45

Branch: refs/heads/master
Commit: 7528af4514e1ddea3c99bf9f6dcc4392c1f1b8e2
Parents: d7c863b
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Thu Mar 10 19:33:51 2016 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Thu Mar 10 21:45:10 2016 +0100

----------------------------------------------------------------------
 runtime/c/src/tls.c              |  9 +++++++--
 runtime/core/Clownfish/Boolean.c | 21 +++++++++++++++------
 runtime/core/Clownfish/Hash.c    |  6 +++++-
 runtime/perl/xs/XSBind.c         |  5 ++++-
 4 files changed, 31 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7528af45/runtime/c/src/tls.c
----------------------------------------------------------------------
diff --git a/runtime/c/src/tls.c b/runtime/c/src/tls.c
index b550f13..a7fda40 100644
--- a/runtime/c/src/tls.c
+++ b/runtime/c/src/tls.c
@@ -49,11 +49,16 @@ static DWORD err_context_tls_index;
 
 void
 Tls_init() {
-    err_context_tls_index = TlsAlloc();
-    if (err_context_tls_index == TLS_OUT_OF_INDEXES) {
+    DWORD tls_index = TlsAlloc();
+    if (tls_index == TLS_OUT_OF_INDEXES) {
         fprintf(stderr, "TlsAlloc failed (TLS_OUT_OF_INDEXES)\n");
         abort();
     }
+    LONG old_index = InterlockedCompareExchange((LONG*)&err_context_tls_index,
+                                                tls_index, 0);
+    if (old_index != 0) {
+        TlsFree(tls_index);
+    }
 }
 
 ErrContext*

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7528af45/runtime/core/Clownfish/Boolean.c
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Boolean.c b/runtime/core/Clownfish/Boolean.c
index fd7c6d9..44a7c48 100644
--- a/runtime/core/Clownfish/Boolean.c
+++ b/runtime/core/Clownfish/Boolean.c
@@ -22,18 +22,26 @@
 
 #include "Clownfish/Class.h"
 #include "Clownfish/String.h"
+#include "Clownfish/Util/Atomic.h"
 
 Boolean *Bool_true_singleton;
 Boolean *Bool_false_singleton;
 
 void
 Bool_init_class() {
-    Bool_true_singleton          = (Boolean*)Class_Make_Obj(BOOLEAN);
-    Bool_true_singleton->value   = true;
-    Bool_true_singleton->string  = Str_newf("true");
-    Bool_false_singleton         = (Boolean*)Class_Make_Obj(BOOLEAN);
-    Bool_false_singleton->value  = false;
-    Bool_false_singleton->string = Str_newf("false");
+    Boolean *true_obj = (Boolean*)Class_Make_Obj(BOOLEAN);
+    true_obj->value   = true;
+    true_obj->string  = Str_newf("true");
+    if (!Atomic_cas_ptr((void**)&Bool_true_singleton, NULL, true_obj)) {
+        Bool_Destroy(true_obj);
+    }
+
+    Boolean *false_obj = (Boolean*)Class_Make_Obj(BOOLEAN);
+    false_obj->value   = false;
+    false_obj->string  = Str_newf("false");
+    if (!Atomic_cas_ptr((void**)&Bool_false_singleton, NULL, false_obj)) {
+        Bool_Destroy(false_obj);
+    }
 }
 
 Boolean*
@@ -44,6 +52,7 @@ Bool_singleton(bool value) {
 void
 Bool_Destroy_IMP(Boolean *self) {
     if (self && self != CFISH_TRUE && self != CFISH_FALSE) {
+        DECREF(self->string);
         SUPER_DESTROY(self, BOOLEAN);
     }
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7528af45/runtime/core/Clownfish/Hash.c
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Hash.c b/runtime/core/Clownfish/Hash.c
index e0e5d80..174cc11 100644
--- a/runtime/core/Clownfish/Hash.c
+++ b/runtime/core/Clownfish/Hash.c
@@ -26,6 +26,7 @@
 #include "Clownfish/String.h"
 #include "Clownfish/Err.h"
 #include "Clownfish/Vector.h"
+#include "Clownfish/Util/Atomic.h"
 #include "Clownfish/Util/Memory.h"
 
 // TOMBSTONE is shared across threads, so it must never be incref'd or
@@ -50,7 +51,10 @@ SI_rebuild_hash(Hash *self);
 
 void
 Hash_init_class() {
-    TOMBSTONE = Str_newf("[HASHTOMBSTONE]");
+    String *tombstone = Str_newf("[HASHTOMBSTONE]");
+    if (!Atomic_cas_ptr((void**)&TOMBSTONE, NULL, tombstone)) {
+        DECREF(tombstone);
+    }
 }
 
 Hash*

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7528af45/runtime/perl/xs/XSBind.c
----------------------------------------------------------------------
diff --git a/runtime/perl/xs/XSBind.c b/runtime/perl/xs/XSBind.c
index 85bd85b..b6dd944 100644
--- a/runtime/perl/xs/XSBind.c
+++ b/runtime/perl/xs/XSBind.c
@@ -738,7 +738,10 @@ void
 cfish_Err_init_class(void) {
     dTHX;
     char *file = (char*)__FILE__;
-    attempt_xsub = (SV*)newXS(NULL, cfish_Err_attempt_via_xs, file);
+    SV *xsub = (SV*)newXS(NULL, cfish_Err_attempt_via_xs, file);
+    if (!cfish_Atomic_cas_ptr((void**)&attempt_xsub, NULL, xsub)) {
+        SvREFCNT_dec(xsub);
+    }
 }
 
 cfish_Err*