Files
ab_glyph_rasterizer
adler
adler32
andrew
bitflags
bytemuck
byteorder
calloop
cfg_if
color_quant
crc32fast
crossbeam_channel
crossbeam_deque
crossbeam_epoch
crossbeam_utils
deflate
dlib
downcast_rs
draw_state
either
event_loop
float
fnv
gfx
gfx_core
gfx_device_gl
gfx_gl
gfx_graphics
gfx_texture
gif
gl
glutin
api
platform
platform_impl
glutin_egl_sys
glutin_glx_sys
glutin_window
graphics
glyph_cache
graphics_api_version
image
codecs
bmp
hdr
ico
jpeg
pnm
tga
webp
imageops
io
math
utils
input
instant
interpolation
iovec
jpeg_decoder
lazy_static
lazycell
libc
unix
libloading
lock_api
log
maybe_uninit
memchr
memmap2
memoffset
miniz_oxide
mio
deprecated
net
sys
mio_extras
net2
nix
net
sys
nom
bits
branch
bytes
character
combinator
multi
number
sequence
num_cpus
num_integer
num_iter
num_rational
num_traits
once_cell
osmesa_sys
owned_ttf_parser
parking_lot
parking_lot_core
percent_encoding
piston
piston_window
png
proc_macro2
quote
raw_window_handle
rayon
collections
compile_fail
iter
chain.rschunks.rscloned.rscopied.rsempty.rsenumerate.rsextend.rsfilter.rsfilter_map.rsfind.rsflat_map.rsflat_map_iter.rsflatten.rsflatten_iter.rsfold.rsfor_each.rsfrom_par_iter.rsinspect.rsinterleave.rsinterleave_shortest.rsintersperse.rslen.rsmap.rsmap_with.rsmod.rsmultizip.rsnoop.rsonce.rspanic_fuse.rspar_bridge.rspositions.rsproduct.rsreduce.rsrepeat.rsrev.rsskip.rssplitter.rsstep_by.rssum.rstake.rstry_fold.rstry_reduce.rstry_reduce_with.rsunzip.rsupdate.rswhile_some.rszip.rszip_eq.rs
slice
rayon_core
compile_fail
join
scope
sleep
spawn
thread_pool
read_color
rusttype
same_file
scoped_threadpool
scoped_tls
scopeguard
serde
de
private
ser
serde_derive
shader_version
shaders_graphics2d
shared_library
slab
smallvec
smithay_client_toolkit
data_device
primary_selection
seat
shell
shm
window
spin_sleep
syn
attr.rsawait.rsbigint.rsbuffer.rscustom_keyword.rscustom_punctuation.rsdata.rsderive.rsdiscouraged.rserror.rsexport.rsexpr.rsext.rsfile.rsgenerics.rsgroup.rsident.rsitem.rslib.rslifetime.rslit.rslookahead.rsmac.rsmacros.rsop.rsparse.rsparse_macro_input.rsparse_quote.rspat.rspath.rsprint.rspunctuated.rsreserved.rssealed.rsspan.rsspanned.rsstmt.rsthread.rstoken.rstt.rsty.rsverbatim.rswhitespace.rs
texture
tiff
ttf_parser
tables
unicode_xid
vecmath
viewport
walkdir
wayland_client
wayland_commons
wayland_cursor
wayland_egl
wayland_protocols
wayland_sys
weezl
window
winit
platform
platform_impl
linux
wayland
event_loop
seat
keyboard
pointer
text_input
touch
window
x11
x11_dl
xcursor
xdg
xml
reader
parser
writer
>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
use std::marker; use std::mem; use std::sync::atomic::{AtomicUsize, Ordering}; use libc; macro_rules! dlsym { (fn $name:ident($($t:ty),*) -> $ret:ty) => ( #[allow(bad_style)] static $name: ::sys::unix::dlsym::DlSym<unsafe extern fn($($t),*) -> $ret> = ::sys::unix::dlsym::DlSym { name: concat!(stringify!($name), "\0"), addr: ::std::sync::atomic::ATOMIC_USIZE_INIT, _marker: ::std::marker::PhantomData, }; ) } pub struct DlSym<F> { pub name: &'static str, pub addr: AtomicUsize, pub _marker: marker::PhantomData<F>, } impl<F> DlSym<F> { pub fn get(&self) -> Option<&F> { assert_eq!(mem::size_of::<F>(), mem::size_of::<usize>()); unsafe { if self.addr.load(Ordering::SeqCst) == 0 { self.addr.store(fetch(self.name), Ordering::SeqCst); } if self.addr.load(Ordering::SeqCst) == 1 { None } else { mem::transmute::<&AtomicUsize, Option<&F>>(&self.addr) } } } } unsafe fn fetch(name: &str) -> usize { assert_eq!(name.as_bytes()[name.len() - 1], 0); match libc::dlsym(libc::RTLD_DEFAULT, name.as_ptr() as *const _) as usize { 0 => 1, n => n, } }