From 79c83eba7933f49e766dbeb85f9c40ee17e06edf Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Wed, 22 Dec 2021 12:35:36 +0100 Subject: 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. --- examples/sptr_pthread.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'examples/sptr_pthread.c') 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 +#include -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"); -- cgit v1.2.3