Author: Remi Meier
Branch: 
Changeset: r1112:72914bbde634
Date: 2014-03-28 10:59 +0100
http://bitbucket.org/pypy/stmgc/changeset/72914bbde634/

Log:    add a simple demo

diff --git a/c7/demo/demo_simple.c b/c7/demo/demo_simple.c
new file mode 100644
--- /dev/null
+++ b/c7/demo/demo_simple.c
@@ -0,0 +1,108 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+#ifdef USE_HTM
+#  include "../../htm-c7/stmgc.h"
+#else
+#  include "stmgc.h"
+#endif
+
+#define ITERS 10000000
+#define NTHREADS    2
+
+
+typedef TLPREFIX struct node_s node_t;
+typedef node_t* nodeptr_t;
+typedef object_t* objptr_t;
+
+struct node_s {
+    struct object_s hdr;
+    long value;
+    nodeptr_t next;
+};
+
+__thread stm_thread_local_t stm_thread_local;
+
+
+ssize_t stmcb_size_rounded_up(struct object_s *ob)
+{
+    return sizeof(struct node_s);
+}
+
+void stmcb_trace(struct object_s *obj, void visit(object_t **))
+{
+    struct node_s *n;
+    n = (struct node_s*)obj;
+    visit((object_t **)&n->next);
+}
+
+
+
+static sem_t done;
+
+static __thread int tl_counter = 0;
+static int gl_counter = 0;
+
+void *demo2(void *arg)
+{
+    int status;
+    stm_register_thread_local(&stm_thread_local);
+    tl_counter = 0;
+
+    int i = 0;
+    while (i < ITERS) {
+        stm_start_inevitable_transaction(&stm_thread_local);
+        tl_counter++;
+        if (i % 5 == 0)
+            gl_counter++;
+        stm_commit_transaction();
+        i++;
+    }
+
+    assert(stm_thread_local.shadowstack == stm_thread_local.shadowstack_base);
+
+    stm_unregister_thread_local(&stm_thread_local);
+    status = sem_post(&done); assert(status == 0);
+    return NULL;
+}
+
+
+void newthread(void*(*func)(void*), void *arg)
+{
+    pthread_t th;
+    int status = pthread_create(&th, NULL, func, arg);
+    if (status != 0)
+        abort();
+    pthread_detach(th);
+    printf("started new thread\n");
+}
+
+
+
+int main(void)
+{
+    int status, i;
+
+    status = sem_init(&done, 0, 0); assert(status == 0);
+
+    stm_setup();
+    stm_register_thread_local(&stm_thread_local);
+
+
+    for (i = 1; i <= NTHREADS; i++) {
+        newthread(demo2, (void*)(uintptr_t)i);
+    }
+
+    for (i = 1; i <= NTHREADS; i++) {
+        status = sem_wait(&done); assert(status == 0);
+    }
+
+
+    stm_unregister_thread_local(&stm_thread_local);
+    stm_teardown();
+
+    return 0;
+}
diff --git a/duhton/demo/micro_transactions.duh 
b/duhton/demo/micro_transactions.duh
--- a/duhton/demo/micro_transactions.duh
+++ b/duhton/demo/micro_transactions.duh
@@ -5,16 +5,23 @@
 
 
 (defun increment ()
-  ;;(set c (+ (get c) 1))
-  (setq c 0)
-  (setq c (+  c 1))
   )
 
 
+(defun big_transactions ()
+  (setq n 0)
+  (while (< n 20000)
+    (transaction increment)
+    (setq n (+ n 1))
+    )
+  )
+
 (setq n 0)
-(while (< n 10000000)
-  (transaction increment)
+(while (< n 800)
+  (transaction big_transactions)
   (setq n (+ n 1))
   )
 
+(setq timer (time))
 (run-transactions)
+(print (quote TIME_IN_PARALLEL:) (- (time) timer))
diff --git a/htm-c7/stmgc.c b/htm-c7/stmgc.c
--- a/htm-c7/stmgc.c
+++ b/htm-c7/stmgc.c
@@ -2,6 +2,7 @@
 #include <string.h>
 #include <stdio.h>
 #include "htm.h"
+#include <unistd.h>
 
 pthread_mutex_t _stm_gil = PTHREAD_MUTEX_INITIALIZER;
 __thread stm_thread_local_t *_stm_tloc;
@@ -117,15 +118,17 @@
 void stm_commit_transaction(void) {
     stm_collect(0);
     _stm_tloc = NULL;
-    if (mutex_locked(&_stm_gil)) {
-        assert(!xtest());
+    if (_htm_info.use_gil) {
+        OPT_ASSERT(!xtest());
         if (pthread_mutex_unlock(&_stm_gil) != 0) abort();
         gil_transactions++;
-        //fprintf(stderr, "G");
+        if (gil_transactions % 512 == 0)
+            fprintf(stderr, "G");
     } else {
         xend();
         htm_transactions++;
-        //fprintf(stderr, "H");
+        if (htm_transactions % 512 == 0)
+            fprintf(stderr, "H");
     }
 }
 
@@ -201,7 +204,7 @@
 
 static inline uintptr_t list_pop_item(struct list_s *lst)
 {
-    assert(lst->count > 0);
+    OPT_ASSERT(lst->count > 0);
     return lst->items[--lst->count];
 }
 
@@ -277,7 +280,7 @@
 
     tl->thread_local_obj = NULL;
     tl->shadowstack_base = (object_t **)tl_malloc(768*1024);
-    assert(tl->shadowstack_base);
+    OPT_ASSERT(tl->shadowstack_base);
     tl->shadowstack = tl->shadowstack_base;
     tl->last_abort__bytes_in_nursery = 0;
 }
@@ -304,7 +307,7 @@
 object_t *_stm_allocate_old(ssize_t size)
 {
     char *p = tl_malloc(size);
-    assert(p);
+    OPT_ASSERT(p);
     memset(p, 0, size);
     ((object_t *)p)->gil_flags = _STM_GCFLAG_WRITE_BARRIER;
     return (object_t *)p;
@@ -313,7 +316,7 @@
 object_t *_stm_allocate_external(ssize_t size)
 {
     char *p = tl_malloc(size);
-    assert(p);
+    OPT_ASSERT(p);
     memset(p, 0, size);
     _stm_write_slowpath((object_t *)p);
     return (object_t *)p;
@@ -367,7 +370,7 @@
         size_t size = stmcb_size_rounded_up(obj);
 
         nobj = tl_malloc(size);
-        assert(nobj);
+        OPT_ASSERT(nobj);
 
         /* Copy the object  */
         memcpy(nobj, obj, size);
@@ -400,10 +403,10 @@
 
 static inline void _collect_now(object_t *obj)
 {
-    assert(!_is_in_nursery(obj));
+    OPT_ASSERT(!_is_in_nursery(obj));
 
     /* We must not have GCFLAG_WRITE_BARRIER so far.  Add it now. */
-    assert(!(obj->gil_flags & GCFLAG_WRITE_BARRIER));
+    OPT_ASSERT(!(obj->gil_flags & GCFLAG_WRITE_BARRIER));
     obj->gil_flags |= GCFLAG_WRITE_BARRIER;
 
     /* Trace the 'obj' to replace pointers to nursery with pointers
@@ -430,7 +433,7 @@
 {
     if (_stm_nursery_base == NULL) {
         _stm_nursery_base = tl_malloc(NURSERY_SIZE);
-        assert(_stm_nursery_base);
+        OPT_ASSERT(_stm_nursery_base);
         _stm_nursery_end = _stm_nursery_base + NURSERY_SIZE;
         _stm_nursery_current = _stm_nursery_base;
     }
@@ -448,7 +451,7 @@
         young_weakrefs,
         object_t * /*item*/,
         ({
-            assert(_is_in_nursery(item));
+            OPT_ASSERT(_is_in_nursery(item));
             object_t *TLPREFIX *pforwarded_array = (object_t *TLPREFIX *)item;
 
             /* the following checks are done like in nursery.c: */
@@ -459,11 +462,11 @@
 
             item = pforwarded_array[1]; /* moved location */
 
-            assert(!_is_in_nursery(item));
+            OPT_ASSERT(!_is_in_nursery(item));
 
             ssize_t size = 16;
             object_t *pointing_to = *WEAKREF_PTR(item, size);
-            assert(pointing_to != NULL);
+            OPT_ASSERT(pointing_to != NULL);
 
             if (_is_in_nursery(pointing_to)) {
                 object_t *TLPREFIX *pforwarded_array = (object_t *TLPREFIX 
*)pointing_to;
@@ -504,7 +507,7 @@
 
     char *p = _stm_nursery_current;
     char *end = p + size_rounded_up;
-    assert(end <= _stm_nursery_end);
+    OPT_ASSERT(end <= _stm_nursery_end);
     _stm_nursery_current = end;
     STM_SEGMENT->nursery_current = end;
     return (object_t *)p;
@@ -512,7 +515,7 @@
 
 object_t *stm_allocate_weakref(ssize_t size_rounded_up)
 {
-    assert(size_rounded_up == 16);
+    OPT_ASSERT(size_rounded_up == 16);
     object_t *obj = stm_allocate(size_rounded_up);
     LIST_APPEND(young_weakrefs, obj);
     return obj;
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to