CK_PR_FAS(3)
β¨ CK_PR_FAS(3) β¨
okay bestie, pull up a chair, because we're about to talk about ck_pr_fas(3) β the atomic swap girlies of the Concurrency Kit world π
πΈ NAME πΈ
ck_pr_fas_ptr, ck_pr_fas_double, ck_pr_fas_char, ck_pr_fas_uint, ck_pr_fas_int, ck_pr_fas_64, ck_pr_fas_32, ck_pr_fas_16, ck_pr_fas_8 β atomic swap operations π₯
like, that's the whole squad. nine little icons, one shared destiny.
π LIBRARY π
Concurrency Kit (that's libck, and you link it with -lck) π«Ά
β¨ SYNOPSIS β¨
no cap, here's the receipts:
#include <ck_pr.h>
void *
ck_pr_fas_ptr(void *target, void *new_value);
double
ck_pr_fas_double(double *target, double new_value);
char
ck_pr_fas_char(char *target, char new_value);
unsigned int
ck_pr_fas_uint(unsigned int *target, unsigned int new_value);
int
ck_pr_fas_int(int *target, int new_value);
uint64_t
ck_pr_fas_64(uint64_t *target, uint64_t new_value);
uint32_t
ck_pr_fas_32(uint32_t *target, uint32_t new_value);
uint16_t
ck_pr_fas_16(uint16_t *target, uint16_t new_value);
uint8_t
ck_pr_fas_8(uint8_t *target, uint8_t new_value);
nine flavors, one vibe check. pick the one that matches your type and go π¦
π DESCRIPTION π
so the ck_pr_fas(3) family of functions atomically fetches the value pointed to by target and then replaces the value pointed to by target with the value you specified in new_value.
that's it. that's the whole thing. it's giving "grab the old one, drop the new one, all in one uninterruptible moment" πβ¨
the way that "atomically" is doing all the heavy lifting here β no other thread is gonna catch it mid-swap. it's one clean motion, like a hair flip that never gets caught on camera.
π RETURN VALUES π
this function hands you back the value that was pointed to by target at the time the operation was invoked β i.e. the old value, the one from before it got atomically replaced with new_value. π
so like, you get the ex. the new one is already in place. periodt.
π SEE ALSO π
the whole friend group, go say hi:
ck_pr_fence_load(3)ck_pr_fence_load_depends(3)ck_pr_fence_store(3)ck_pr_fence_memory(3)ck_pr_load(3)ck_pr_store(3)ck_pr_faa(3)ck_pr_inc(3)ck_pr_dec(3)ck_pr_neg(3)ck_pr_not(3)ck_pr_add(3)ck_pr_sub(3)ck_pr_and(3)ck_pr_or(3)ck_pr_xor(3)ck_pr_cas(3)ck_pr_btc(3)ck_pr_bts(3)ck_pr_btr(3)
more lore available at http://concurrencykit.org/ π§
okay that's the whole page bestie, we ate and left no crumbs π this was ck_pr_fas(3), dated April 7, 2013 β yeah it's an elder but she still slays. mwah, go write something lock-free πβ
π¦ where this page comes from
- alpine 3.24: ck-doc 0.7.2-r1 Β· BSD-2-Clause AND Apache-2.0
- debian bookworm: libck-dev 0.7.1-10 Β· BSD-2-Clause
- debian trixie: libck-dev 0.7.2-6 Β· BSD-2-Clause
- epel 10: ck-devel 0.7.2-1.el10_1 Β· BSD-2-clause AND Apache-2.0 AND BSD-3-clause
- epel 9: ck-devel 0.7.0-10.el9 Β· BSD
- fedora 43: ck-devel 0.7.2-2.fc43 Β· BSD-2-clause AND Apache-2.0 AND BSD-3-clause
- fedora 43: ck-devel 0.7.2-2.fc43 Β· BSD-2-clause AND Apache-2.0 AND BSD-3-clause
- fedora 44: ck-devel 0.7.2-4.fc44 Β· BSD-2-clause AND Apache-2.0 AND BSD-3-clause
- fedora 44: ck-devel 0.7.2-4.fc44 Β· BSD-2-clause AND Apache-2.0 AND BSD-3-clause
- nixos 26.05: ck 0.7.2
- nixpkgs unstable: ck 0.7.2
- opensuse-leap 16.0: ck-devel 0.7.2-bp160.1.9 Β· Apache-2.0 AND BSD-2-Clause
- opensuse-leap 16.0: ck-devel 0.7.2-bp160.1.9 Β· Apache-2.0 AND BSD-2-Clause
- opensuse-leap 16.0: ck-devel 0.7.2-bp160.1.9 Β· Apache-2.0 AND BSD-2-Clause
- ubuntu jammy: libck-dev 0.7.1-6ubuntu2 Β· BSD-2-Clause
- ubuntu noble: libck-dev 0.7.1-13build1 Β· BSD-2-Clause
- ubuntu questing: libck-dev 0.7.2-5ubuntu1
- ubuntu resolute: libck-dev 0.7.2-5ubuntu2 Β· BSD-2-Clause
- ubuntu stonking: libck-dev 0.7.2-11 Β· BSD-2-Clause
- Copyright 2013 Samy Al Bahra
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms