mirror of
https://github.com/vlang/v.git
synced 2025-08-03 09:47:15 -04:00
112 lines
2.4 KiB
V
112 lines
2.4 KiB
V
module sync
|
|
|
|
// ThreadLocalStorage provides thread-local storage for values of type T
|
|
@[noinit]
|
|
struct ThreadLocalStorage[T] {
|
|
mut:
|
|
key u64 // TLS key identifier. Note: While Linux uses unsigned int, Darwin requires unsigned long. u64 accommodates both.
|
|
in_use bool // Allocation status flag
|
|
}
|
|
|
|
// DataConversion convert voidptr to/from type T
|
|
union DataConversion {
|
|
mut:
|
|
f_u8 u8
|
|
f_u16 u16
|
|
f_u32 u32
|
|
f_u64 u64
|
|
|
|
f_i8 i8
|
|
f_i16 i16
|
|
f_i32 i32
|
|
f_i64 i64
|
|
|
|
f_voidptr voidptr
|
|
f_isize isize
|
|
f_usize usize
|
|
f_int int
|
|
f_f32 f32
|
|
f_f64 f64
|
|
f_rune rune
|
|
}
|
|
|
|
// convert_t_to_voidptr convert value from type T to voidptr
|
|
@[inline]
|
|
fn convert_t_to_voidptr[T](value T) !voidptr {
|
|
mut f := DataConversion{}
|
|
$if T is i8 {
|
|
f.f_i8 = value
|
|
} $else $if T is i16 {
|
|
f.f_i16 = value
|
|
} $else $if T is i32 {
|
|
f.f_i32 = value
|
|
} $else $if T is i64 {
|
|
f.f_i64 = value
|
|
} $else $if T is u8 {
|
|
f.f_u8 = value
|
|
} $else $if T is u16 {
|
|
f.f_u16 = value
|
|
} $else $if T is u32 {
|
|
f.f_u32 = value
|
|
} $else $if T is u64 {
|
|
f.f_u64 = value
|
|
} $else $if T is $pointer {
|
|
f.f_voidptr = voidptr(value)
|
|
} $else $if T is isize {
|
|
f.f_isize = value
|
|
} $else $if T is usize {
|
|
f.f_usize = value
|
|
} $else $if T is int {
|
|
f.f_int = value
|
|
} $else $if T is f32 {
|
|
f.f_f32 = value
|
|
} $else $if T is f64 {
|
|
f.f_f64 = value
|
|
} $else $if T is rune {
|
|
f.f_rune = value
|
|
} $else {
|
|
return error('Unsupported data type `${T.name}` to voidptr')
|
|
}
|
|
return unsafe { f.f_voidptr }
|
|
}
|
|
|
|
// convert_voidptr_to_t convert value from voidptr to type T
|
|
@[inline]
|
|
fn convert_voidptr_to_t[T](value voidptr) !T {
|
|
f := DataConversion{
|
|
f_voidptr: value
|
|
}
|
|
$if T is i8 {
|
|
return unsafe { f.f_i8 }
|
|
} $else $if T is i16 {
|
|
return unsafe { f.f_i16 }
|
|
} $else $if T is i32 {
|
|
return unsafe { f.f_i32 }
|
|
} $else $if T is i64 {
|
|
return unsafe { f.f_i64 }
|
|
} $else $if T is u8 {
|
|
return unsafe { f.f_u8 }
|
|
} $else $if T is u16 {
|
|
return unsafe { f.f_u16 }
|
|
} $else $if T is u32 {
|
|
return unsafe { f.f_u32 }
|
|
} $else $if T is u64 {
|
|
return unsafe { f.f_u64 }
|
|
} $else $if T is $pointer {
|
|
return unsafe { f.f_voidptr }
|
|
} $else $if T is isize {
|
|
return unsafe { f.f_isize }
|
|
} $else $if T is usize {
|
|
return unsafe { f.f_usize }
|
|
} $else $if T is int {
|
|
return unsafe { f.f_int }
|
|
} $else $if T is f32 {
|
|
return unsafe { f.f_f32 }
|
|
} $else $if T is f64 {
|
|
return unsafe { f.f_f64 }
|
|
} $else $if T is rune {
|
|
return unsafe { f.f_rune }
|
|
}
|
|
return error('Unsupported data type `${T.name}` from voidptr')
|
|
}
|