ctypes API Referennce¶
There are 16 kinds of numeric ctypes that could be updated atomically, these types are listed below:
original ctypes |
atomic functions |
---|---|
c_bool |
bool_* |
c_byte |
byte_* |
c_wchar |
wchar_* |
c_ubyte |
ubyte_* |
c_short |
short_* |
c_ushort |
ushort_* |
c_int |
int_* |
c_uint |
uint_* |
c_long |
long_* |
c_ulong |
ulong_* |
c_longlong |
longlong_* |
c_ulonglong |
ulonglong_* |
c_size_t |
size_t_* |
c_ssize_t |
ssize_t_* |
c_float |
float_store |
c_double |
double_store |
c_longdouble |
longdouble_store |
Integer types support 18 kinds of APIs could be used to achieve atomic operations,¶
get value atomically
type_load(type *);
store value atomically, store the content got from pointer b to a
type_store(type *a, type *b);
get and set atomically
type type_get_and_set(type *, type);
compare and set atomically
type type_compare_and_set(type *, type *, type);
value exchange between 3 pointers in 2 groups atomically, store b in a after store a in c
type_shift(type *a, type *b, type *c);
increment and fetch atomically
_Bool type_add_and_fetch(type *, type);
decrement and fetch atomically
type type_sub_and_fetch(type *, type);
bitwise AND and fetch the result atomically
type type_and_and_fetch(type *, type);
bitwise OR and fetch the result atomically
type type_or_and_fetch(type *, type);
bitwise XOR and fetch the result atomically
type type_xor_and_fetch(type *, type);
bitwise NAND(AND first then NOT) and fetch the result atomically
type type_nand_and_fetch(type *, type);
fetch and increment atomically
_Bool type_fetch_and_add(type *, type);
fetch and decrement atomically
type type_fetch_and_sub(type *, type);
fetch then bitwise AND atomically
type type_fetch_and_and(type *, type);
fetch then bitwise OR atomically
type type_fetch_and_or(type *, type);
fetch then bitwise XOR atomically
type type_fetch_and_xor(type *, type);
fetch then bitwise NAND atomically
type type_fetch_and_nand(type *, type);
floating types supports only 1 kind,
store value atomically
type_store(type *, type *);
bool atomic functions:¶
_Bool bool_load(_Bool *);
void bool_store(_Bool *, _Bool *);
_Bool bool_get_and_set(_Bool *, _Bool);
_Bool bool_compare_and_set(_Bool *, _Bool *, _Bool);
void bool_shift(_Bool *v, _Bool *, _Bool *);
byte atomic functions:¶
char byte_load(char *);
void byte_store(char *, char *);
char byte_get_and_set(char *, char);
void byte_shift(char *v, char *, char*);
_Bool byte_compare_and_set(char *, char *, char);
char byte_add_and_fetch(char *, char);
char byte_sub_and_fetch(char *, char);
char byte_and_and_fetch(char *, char);
char byte_or_and_fetch(char *, char);
char byte_xor_and_fetch(char *, char);
char byte_nand_and_fetch(char *, char);
char byte_fetch_and_add(char *, char);
char byte_fetch_and_sub(char *, char);
char byte_fetch_and_and(char *, char);
char byte_fetch_and_or(char *, char);
char byte_fetch_and_xor(char *, char);
char byte_fetch_and_nand(char *, char);
ubyte atomic functions:¶
unsigned char ubyte_load(unsigned char *);
void ubyte_store(unsigned char *, unsigned char *);
unsigned char ubyte_get_and_set(unsigned char *, unsigned char);
void ubyte_shift(unsigned char *, unsigned char *, unsigned char *);
_Bool ubyte_compare_and_set(unsigned char *, unsigned char *, unsigned char);
unsigned char ubyte_add_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_sub_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_and_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_or_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_xor_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_nand_and_fetch(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_add(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_sub(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_and(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_or(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_xor(unsigned char *, unsigned char);
unsigned char ubyte_fetch_and_nand(unsigned char *, unsigned char);
short atomic functions:¶
short short_load(short *);
void short_store(short *, short *);
short short_get_and_set(short *, short);
void short_shift(short *v, short *, short *);
_Bool short_compare_and_set(short *, short *, short);
short short_add_and_fetch(short *, short);
short short_sub_and_fetch(short *, short);
short short_and_and_fetch(short *, short);
short short_or_and_fetch(short *, short);
short short_xor_and_fetch(short *, short);
short short_nand_and_fetch(short *, short);
short short_fetch_and_add(short *, short);
short short_fetch_and_sub(short *, short);
short short_fetch_and_and(short *, short);
short short_fetch_and_or(short *, short);
short short_fetch_and_xor(short *, short);
short short_fetch_and_nand(short *, short);
ushort atomic functions:¶
unsigned short ushort_load(unsigned short *);
void ushort_store(unsigned short *, unsigned short *);
unsigned short ushort_get_and_set(unsigned short *, unsigned short);
void ushort_shift(unsigned short *, unsigned short *, unsigned short *);
_Bool ushort_compare_and_set(unsigned short *, unsigned short *, unsigned short);
unsigned short ushort_add_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_sub_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_and_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_or_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_xor_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_nand_and_fetch(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_add(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_sub(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_and(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_or(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_xor(unsigned short *, unsigned short);
unsigned short ushort_fetch_and_nand(unsigned short *, unsigned short);
int atomic functions:¶
int int_load(int *);
void int_store(int *, int *);
int int_get_and_set(int *, int);
void int_shift(int *, int *, int* );
_Bool int_compare_and_set(int *, int *, int);
int int_add_and_fetch(int *, int);
int int_sub_and_fetch(int *, int);
int int_and_and_fetch(int *, int);
int int_or_and_fetch(int *, int);
int int_xor_and_fetch(int *, int);
int int_nand_and_fetch(int *, int);
int int_fetch_and_add(int *, int);
int int_fetch_and_sub(int *, int);
int int_fetch_and_and(int *, int);
int int_fetch_and_or(int *, int);
int int_fetch_and_xor(int *, int);
int int_fetch_and_nand(int *, int);
uint atomic functions:¶
unsigned int uint_load(unsigned int *);
void uint_store(unsigned int *, unsigned int *);
unsigned int uint_get_and_set(unsigned int *, unsigned int);
void uint_shift(unsigned int *, unsigned int *, unsigned int *);
_Bool uint_compare_and_set(unsigned int *, unsigned int *, unsigned int);
unsigned int uint_add_and_fetch(unsigned int *, unsigned int);
unsigned int uint_sub_and_fetch(unsigned int *, unsigned int);
unsigned int uint_and_and_fetch(unsigned int *, unsigned int);
unsigned int uint_or_and_fetch(unsigned int *, unsigned int);
unsigned int uint_xor_and_fetch(unsigned int *, unsigned int);
unsigned int uint_nand_and_fetch(unsigned int *, unsigned int);
unsigned int uint_fetch_and_add(unsigned int *, unsigned int);
unsigned int uint_fetch_and_sub(unsigned int *, unsigned int);
unsigned int uint_fetch_and_and(unsigned int *, unsigned int);
unsigned int uint_fetch_and_or(unsigned int *, unsigned int);
unsigned int uint_fetch_and_xor(unsigned int *, unsigned int);
unsigned int uint_fetch_and_nand(unsigned int *, unsigned int);
wchar atomic functions:¶
wchar_t wchar_load(wchar_t *);
void wchar_store(wchar_t *, wchar_t *);
wchar_t wchar_get_and_set(wchar_t *, wchar_t);
void wchar_shift(wchar_t *, wchar_t *, wchar_t*);
_Bool wchar_compare_and_set(wchar_t *, wchar_t *, wchar_t);
wchar_t wchar_add_and_fetch(wchar_t *, wchar_t);
wchar_t wchar_sub_and_fetch(wchar_t *, wchar_t);
wchar_t wchar_fetch_and_add(wchar_t *, wchar_t);
wchar_t wchar_fetch_and_sub(wchar_t *, wchar_t);
long atomic functions(the size of long type is 64bit on Linux/MacOSX, 32bit on Windows):¶
long long_load(long *);
void long_store(long *, long *);
void long_shift(long *, long *, long*);
long long_get_and_set(long *, long);
_Bool long_compare_and_set(long *, long *, long);
long long_add_and_fetch(long *, long);
long long_sub_and_fetch(long *, long);
long long_and_and_fetch(long *, long);
long long_or_and_fetch(long *, long);
long long_xor_and_fetch(long *, long);
long long_nand_and_fetch(long *, long);
long long_fetch_and_add(long *, long);
long long_fetch_and_sub(long *, long);
long long_fetch_and_and(long *, long);
long long_fetch_and_or(long *, long);
long long_fetch_and_xor(long *, long);
long long_fetch_and_nand(long *, long);
ulong atomic functions(the size of long type is 64bit on Linux/MacOSX, 32bit on Windows):¶
unsigned long ulong_load(unsigned long *);
void ulong_store(unsigned long *, unsigned long *);
unsigned long ulong_get_and_set(unsigned long *, unsigned long );
void ulong_shift(unsigned long *, unsigned long *, unsigned long *);
_Bool ulong_compare_and_set(unsigned long *, unsigned long *, unsigned long);
unsigned long ulong_add_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_sub_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_and_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_or_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_xor_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_nand_and_fetch(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_add(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_sub(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_and(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_or(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_xor(unsigned long *, unsigned long);
unsigned long ulong_fetch_and_nand(unsigned long *, unsigned long);
size_t atomic functions:¶
size_t size_t_load(size_t *);
void size_t_store(size_t *, size_t *);
size_t size_t_get_and_set(size_t *, size_t);
void size_t_shift(size_t *v, size_t *, size_t *);
_Bool size_t_compare_and_set(size_t *, size_t *, size_t);
size_t size_t_add_and_fetch(size_t *, size_t);
size_t size_t_sub_and_fetch(size_t *, size_t);
size_t size_t_and_and_fetch(size_t *, size_t);
size_t size_t_or_and_fetch(size_t *, size_t);
size_t size_t_xor_and_fetch(size_t *, size_t);
size_t size_t_nand_and_fetch(size_t *, size_t);
size_t size_t_fetch_and_add(size_t *, size_t);
size_t size_t_fetch_and_sub(size_t *, size_t);
size_t size_t_fetch_and_and(size_t *, size_t);
size_t size_t_fetch_and_or(size_t *, size_t);
size_t size_t_fetch_and_xor(size_t *, size_t);
size_t size_t_fetch_and_nand(size_t *, size_t);
ssize_t atomic functions:¶
ssize_t ssize_t_load(ssize_t *);
void ssize_t_store(ssize_t *, ssize_t *);
ssize_t ssize_t_get_and_set(ssize_t *, ssize_t);
void ssize_t_shift(ssize_t *, ssize_t *, ssize_t *);
_Bool ssize_t_compare_and_set(ssize_t *, ssize_t *, ssize_t);
ssize_t ssize_t_add_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_sub_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_and_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_or_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_xor_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_nand_and_fetch(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_add(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_sub(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_and(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_or(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_xor(ssize_t *, ssize_t);
ssize_t ssize_t_fetch_and_nand(ssize_t *, ssize_t);
long long atomic functions:¶
long long longlong_load(long long *);
void longlong_store(long long *, long long *);
long long longlong_get_and_set(long long *, long long);
void longlong_shift(long long *, long long *, long long *);
_Bool longlong_compare_and_set(long long *, long long *, long long);
long long longlong_add_and_fetch(long long *, long long);
long long longlong_sub_and_fetch(long long *, long long);
long long longlong_and_and_fetch(long long *, long long);
long long longlong_or_and_fetch(long long *, long long);
long long longlong_xor_and_fetch(long long *, long long);
long long longlong_nand_and_fetch(long long *, long long);
long long longlong_fetch_and_add(long long *, long long);
long long longlong_fetch_and_sub(long long *, long long);
long long longlong_fetch_and_and(long long *, long long);
long long longlong_fetch_and_or(long long *, long long);
long long longlong_fetch_and_xor(long long *, long long);
long long longlong_fetch_and_nand(long long *, long long);
unsigned long long atomic functions:¶
unsigned long long longlong_load(unsigned long long *);
void ulonglong_store(unsigned long long *, unsigned long long *);
unsigned long long ulonglong_get_and_set(unsigned long long *, unsigned long long);
void ulonglong_shift(unsigned long long *, unsigned long long *, unsigned long long *);
_Bool ulonglong_compare_and_set(unsigned long long *, unsigned long long *, unsigned long long);
unsigned long long ulonglong_add_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_sub_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_and_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_or_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_xor_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_nand_and_fetch(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_add(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_sub(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_and(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_or(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_xor(unsigned long long *, unsigned long long);
unsigned long long ulonglong_fetch_and_nand(unsigned long long *, unsigned long long);
float atomic functions:¶
void float_store(float *v, float *n);
double atomic functions:¶
void double_store(double *v, double *n);
long double atomic functions:¶
void longdouble_store(long double *v, long double *n);