summaryrefslogtreecommitdiffhomepage
path: root/examples/sptr_pthread.c
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-12-22 12:35:36 +0100
committerTyge Løvset <[email protected]>2021-12-22 12:35:36 +0100
commit79c83eba7933f49e766dbeb85f9c40ee17e06edf (patch)
treee43a84d18b79956a8e22b9403358811b6865f344 /examples/sptr_pthread.c
parent7a30e2853792870a1d85087861e46a1ae1ca6b0e (diff)
downloadSTC-modified-79c83eba7933f49e766dbeb85f9c40ee17e06edf.tar.gz
STC-modified-79c83eba7933f49e766dbeb85f9c40ee17e06edf.zip
Renamed csptr to carc. i_key/val_ref renamed to i_key/val_sptr. Change inspired by Rust Arc/Rc. cbox name is taken from Rust Box type.
Diffstat (limited to 'examples/sptr_pthread.c')
-rw-r--r--examples/sptr_pthread.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/examples/sptr_pthread.c b/examples/sptr_pthread.c
index d71ce97d..d81d9810 100644
--- a/examples/sptr_pthread.c
+++ b/examples/sptr_pthread.c
@@ -11,13 +11,13 @@ struct Base
int value;
} typedef Base;
+#define i_type BaseRc
#define i_val Base
-#define i_drop(x) printf("Base::~Base()\n")
-#define i_tag base
+#define i_valdrop(x) printf("Drop Base: %d\n", (x)->value)
#define i_opt c_no_cmp
-#include <stc/csptr.h>
+#include <stc/carc.h>
-void* thr(csptr_base* lp)
+void* thr(BaseRc* lp)
{
sleep(1);
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
@@ -25,30 +25,32 @@ void* thr(csptr_base* lp)
{
printf("local pointer in a thread:\n"
" p.get() = %p, p.use_count() = %ld\n", (void*)lp->get, *lp->use_count);
+ /* safe to modify base here */
+ lp->get->value += 1;
}
/* atomically decrease ref. */
- csptr_base_drop(lp);
+ BaseRc_drop(lp);
return NULL;
}
int main()
{
- csptr_base p = csptr_base_from((Base){42});
+ BaseRc p = BaseRc_from((Base){0});
printf("Created a Base\n"
" p.get() = %p, p.use_count() = %ld\n", (void*)p.get, *p.use_count);
enum {N = 3};
pthread_t t[N];
- csptr_base c[N];
+ BaseRc c[N];
c_forrange (i, N) {
- c[i] = csptr_base_clone(p);
+ c[i] = BaseRc_clone(p);
pthread_create(&t[i], NULL, (void*(*)(void*))thr, &c[i]);
}
printf("Shared ownership between %d threads and released\n"
"ownership from main:\n"
" p.get() = %p, p.use_count() = %ld\n", N, (void*)p.get, *p.use_count);
- csptr_base_reset(&p);
+ BaseRc_reset(&p);
c_forrange (i, N) pthread_join(t[i], NULL);
printf("All threads completed, the last one deleted Base\n");