-
Notifications
You must be signed in to change notification settings - Fork 0
/
structs.jl
110 lines (96 loc) · 2.64 KB
/
structs.jl
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import Base.Threads.Atomic
using ConcurrentUtils
## ProcessTask
struct ProcessTask
dtid::Int
symbol::AbstractString
idir::AbstractString
status::Atomic{UInt8}
ProcessTask(dtid::Int, symbol::AbstractString, idir::AbstractString, status::UInt8) = new(dtid, symbol, idir, Atomic{UInt8}(status))
ProcessTask(signal::AbstractString, status::UInt8) = new(0, signal, "", Atomic{UInt8}(status))
end
## ProcessArgs
struct ProcessArgs
kwargs::Dict{Symbol,Any}
ProcessArgs() = new(Dict{Symbol,Any}())
ProcessArgs(; kwargs...) = new(Dict{Symbol,Any}(kwargs))
ProcessArgs(p::ProcessArgs; kwargs...) = new(Dict{Symbol,Any}(vcat(collect(getfield(p, :kwargs)), collect(kwargs))))
end
import Base.getproperty, Base.setproperty!
Base.getproperty(x::ProcessArgs, name::Symbol) = getfield(x, :kwargs)[name]
Base.setproperty!(x::ProcessArgs, name::Symbol, v) = getfield(x, :kwargs)[name] = v
## LockedDeque
using DataStructures
struct LockedDeque{T}
lock::ReentrantLock
q::Deque{T}
LockedDeque{T}() where {T} = new(ReentrantLock(), Deque{T}())
end
import Base.first, Base.last, Base.isempty, Base.empty!, Base.pop!, Base.popfirst!, Base.push!, Base.pushfirst!, Base.length
first(q::LockedDeque) =
lock(q.lock) do
first(q.q)
end
last(q::LockedDeque) =
lock(q.lock) do
last(q.q)
end
isempty(q::LockedDeque) =
lock(q.lock) do
isempty(q.q)
end
empty!(q::LockedDeque) =
lock(q.lock) do
empty!(q.q)
end
pop!(q::LockedDeque) =
lock(q.lock) do
pop!(q.q)
end
popfirst!(q::LockedDeque) =
lock(q.lock) do
popfirst!(q.q)
end
push!(q::LockedDeque, x) =
lock(q.lock) do
push!(q.q, x)
end
pushfirst!(q::LockedDeque, x) =
lock(q.lock) do
pushfirst!(q.q, x)
end
length(q::LockedDeque) =
lock(q.lock) do
length(q.q)
end
## LockedDict
struct LockedDict{K,V}
lock::ReadWriteLock
d::Dict{K,V}
LockedDict{K,V}() where {K,V} = new(ReadWriteLock(), Dict{K,V}())
end
import Base.getindex, Base.setindex!, Base.haskey, Base.keys, Base.delete!
getindex(d::LockedDict{K,V}, k::K) where {K,V} =
lock_read(d.lock) do
d.d[k]
end
setindex!(d::LockedDict{K,V}, v::V, k::K) where {K,V} =
lock(d.lock) do
d.d[k] = v
end
haskey(d::LockedDict{K,V}, k::K) where {K,V} =
lock_read(d.lock) do
haskey(d.d, k)
end
isempty(d::LockedDict{K,V}) where {K,V} =
lock_read(d.lock) do
isempty(d.d)
end
keys(d::LockedDict{K,V}) where {K,V} =
lock_read(d.lock) do
keys(d.d)
end
delete!(d::LockedDict{K,V}, k::K) where {K,V} =
lock(d.lock) do
delete!(d.d, k)
end