upgrade various Rust dependencies
This stops using parking_lot entirely. Since Rust 1.62, the std implementations on Linux are direct futexes, not the boxed pthread mutexes they used to be. No real reason to use parking_lot anymore, so shed this dependency.
This commit is contained in:
parent
d8ff02ab8b
commit
ae502200c0
|
@ -8,7 +8,8 @@ Each release is tagged in Git and on the Docker repository
|
||||||
|
|
||||||
## unreleased
|
## unreleased
|
||||||
|
|
||||||
* use Retina 0.4.1, which is compatible with rtsp-simple-server v0.19.3.
|
* use Retina 0.4.3, which is newly compatible with rtsp-simple-server v0.19.3
|
||||||
|
and some TP-Link cameras. Fixes [#238](https://github.com/scottlamb/moonfire-nvr/issues/238).
|
||||||
|
|
||||||
## 0.7.5 (2022-05-09)
|
## 0.7.5 (2022-05-09)
|
||||||
|
|
||||||
|
|
|
@ -115,13 +115,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitreader"
|
name = "bitstream-io"
|
||||||
version = "0.3.5"
|
version = "1.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bd5bf8a17cdc06d475689f9e9226f4b5bf5610e93cf5c3010a518fe6fb0d97f5"
|
checksum = "97d524fdb78bf6dc6d2dc4c02043e4b4962ede0a17ae3e13f0ed211a7eda5897"
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "blake3"
|
name = "blake3"
|
||||||
|
@ -296,9 +293,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cursive"
|
name = "cursive"
|
||||||
version = "0.17.0"
|
version = "0.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca536d245342f6c005e7547ab640e444a3dc2fc0319a92124c8c1cbff025e775"
|
checksum = "f3dc950f7cbc2aeb48ba253623fcd21357b15170a0e7c5f6433081d95808b7fd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
@ -657,11 +654,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h264-reader"
|
name = "h264-reader"
|
||||||
version = "0.5.0"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8d87669bdeca3d51902f1bf1f2c71c8f514a8f3011d9b81e63719b374091da1"
|
checksum = "a3c095862f1b74a6021f766321767e64fbec34fa76503debbe1da2c04ce23c2c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitreader",
|
"bitstream-io",
|
||||||
|
"hex-slice",
|
||||||
"log",
|
"log",
|
||||||
"memchr",
|
"memchr",
|
||||||
"rfc6381-codec",
|
"rfc6381-codec",
|
||||||
|
@ -672,17 +670,23 @@ name = "hashbrown"
|
||||||
version = "0.11.2"
|
version = "0.11.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.12.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashlink"
|
name = "hashlink"
|
||||||
version = "0.7.0"
|
version = "0.8.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
|
checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hashbrown",
|
"hashbrown 0.12.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -709,6 +713,12 @@ version = "0.4.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hex-slice"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5491a308e0214554f07a81d8944abe45f552871c12e3c3c6e7e5d354039a6c4c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hmac"
|
name = "hmac"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
|
@ -838,7 +848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
|
checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
"hashbrown",
|
"hashbrown 0.11.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -897,15 +907,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.119"
|
version = "0.2.133"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4"
|
checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libsqlite3-sys"
|
name = "libsqlite3-sys"
|
||||||
version = "0.24.1"
|
version = "0.25.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cb644c388dfaefa18035c12614156d285364769e818893da0dda9030c80ad2ba"
|
checksum = "9f0455f2c1bc9a7caa792907026e469c1d91761fb0ea37cbb16427c77280cf35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
|
@ -1021,7 +1031,6 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"nom",
|
"nom",
|
||||||
"parking_lot",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"slab",
|
"slab",
|
||||||
|
@ -1051,7 +1060,6 @@ dependencies = [
|
||||||
"nix",
|
"nix",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
"odds",
|
"odds",
|
||||||
"parking_lot",
|
|
||||||
"pretty-hex",
|
"pretty-hex",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"protobuf-codegen",
|
"protobuf-codegen",
|
||||||
|
@ -1096,7 +1104,6 @@ dependencies = [
|
||||||
"nix",
|
"nix",
|
||||||
"nom",
|
"nom",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
"parking_lot",
|
|
||||||
"password-hash",
|
"password-hash",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"reffers",
|
"reffers",
|
||||||
|
@ -1172,15 +1179,16 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
version = "0.23.1"
|
version = "0.25.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6"
|
checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"cc",
|
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"memoffset",
|
"memoffset",
|
||||||
|
"pin-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1358,9 +1366,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "password-hash"
|
name = "password-hash"
|
||||||
version = "0.3.2"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8"
|
checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64ct",
|
"base64ct",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
|
@ -1369,9 +1377,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pbkdf2"
|
name = "pbkdf2"
|
||||||
version = "0.10.1"
|
version = "0.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7"
|
checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
@ -1655,12 +1663,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "retina"
|
name = "retina"
|
||||||
version = "0.4.2"
|
version = "0.4.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b99f4f845f11c47edb36a1ac75198c5022eca34b179628d3a14afd7e1c3e7005"
|
checksum = "23d3ea4f2188bdf8136617a4b5e5827820107ce24407c6a977a45441f12edeb0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bitreader",
|
"bitstream-io",
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures",
|
"futures",
|
||||||
"h264-reader",
|
"h264-reader",
|
||||||
|
@ -1721,16 +1729,15 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rusqlite"
|
name = "rusqlite"
|
||||||
version = "0.27.0"
|
version = "0.28.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a"
|
checksum = "01e213bc3ecb39ac32e81e51ebe31fd888a940515173e3a18a35f8c6e896422a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"fallible-iterator",
|
"fallible-iterator",
|
||||||
"fallible-streaming-iterator",
|
"fallible-streaming-iterator",
|
||||||
"hashlink",
|
"hashlink",
|
||||||
"libsqlite3-sys",
|
"libsqlite3-sys",
|
||||||
"memchr",
|
|
||||||
"smallvec",
|
"smallvec",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1763,9 +1770,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scrypt"
|
name = "scrypt"
|
||||||
version = "0.9.0"
|
version = "0.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ba0aaf3911fff0d942c10a49779de7754699810fc7dbe3df515613b2ecc8195a"
|
checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hmac",
|
"hmac",
|
||||||
"password-hash",
|
"password-hash",
|
||||||
|
@ -2071,7 +2078,6 @@ dependencies = [
|
||||||
"mio",
|
"mio",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"parking_lot",
|
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
"socket2",
|
"socket2",
|
||||||
|
@ -2286,9 +2292,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uuid"
|
name = "uuid"
|
||||||
version = "0.8.2"
|
version = "1.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
|
checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
@ -11,7 +11,7 @@ rust-version = "1.60"
|
||||||
|
|
||||||
# The nightly feature is used within moonfire-nvr itself to gate the
|
# The nightly feature is used within moonfire-nvr itself to gate the
|
||||||
# benchmarks. Also pass it along to crates that can benefit from it.
|
# benchmarks. Also pass it along to crates that can benefit from it.
|
||||||
nightly = ["db/nightly", "parking_lot/nightly"]
|
nightly = ["db/nightly"]
|
||||||
|
|
||||||
# The bundled feature includes bundled (aka statically linked) versions of
|
# The bundled feature includes bundled (aka statically linked) versions of
|
||||||
# native libraries where possible.
|
# native libraries where possible.
|
||||||
|
@ -27,12 +27,12 @@ blake3 = "1.0.0"
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
clap = { version = "2.33.3", default-features = false, features = ["color", "wrap_help"] }
|
clap = { version = "2.33.3", default-features = false, features = ["color", "wrap_help"] }
|
||||||
cursive = "0.17.0"
|
cursive = "0.19.0"
|
||||||
db = { package = "moonfire-db", path = "db" }
|
db = { package = "moonfire-db", path = "db" }
|
||||||
failure = "0.1.1"
|
failure = "0.1.1"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
h264-reader = "0.5.0"
|
h264-reader = "0.6.0"
|
||||||
http = "0.2.3"
|
http = "0.2.3"
|
||||||
http-serve = { version = "0.3.1", features = ["dir"] }
|
http-serve = { version = "0.3.1", features = ["dir"] }
|
||||||
hyper = { version = "0.14.2", features = ["http1", "server", "stream", "tcp"] }
|
hyper = { version = "0.14.2", features = ["http1", "server", "stream", "tcp"] }
|
||||||
|
@ -41,28 +41,27 @@ libc = "0.2"
|
||||||
log = { version = "0.4" }
|
log = { version = "0.4" }
|
||||||
memchr = "2.0.2"
|
memchr = "2.0.2"
|
||||||
mylog = { git = "https://github.com/scottlamb/mylog" }
|
mylog = { git = "https://github.com/scottlamb/mylog" }
|
||||||
nix = "0.23.0"
|
nix = "0.25.0"
|
||||||
nom = "7.0.0"
|
nom = "7.0.0"
|
||||||
parking_lot = "0.12.0"
|
password-hash = "0.4.2"
|
||||||
password-hash = "0.3.2"
|
|
||||||
protobuf = "3.0"
|
protobuf = "3.0"
|
||||||
reffers = "0.7.0"
|
reffers = "0.7.0"
|
||||||
retina = "0.4.0"
|
retina = "0.4.0"
|
||||||
ring = "0.16.2"
|
ring = "0.16.2"
|
||||||
rusqlite = "0.27.0"
|
rusqlite = "0.28.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
smallvec = { version = "1.7", features = ["union"] }
|
smallvec = { version = "1.7", features = ["union"] }
|
||||||
structopt = { version = "0.3.13", default-features = false }
|
structopt = { version = "0.3.13", default-features = false }
|
||||||
sync_wrapper = "0.1.0"
|
sync_wrapper = "0.1.0"
|
||||||
time = "0.1"
|
time = "0.1"
|
||||||
tokio = { version = "1.0", features = ["macros", "parking_lot", "rt-multi-thread", "signal", "sync", "time"] }
|
tokio = { version = "1.0", features = ["macros", "rt-multi-thread", "signal", "sync", "time"] }
|
||||||
tokio-stream = "0.1.5"
|
tokio-stream = "0.1.5"
|
||||||
tokio-tungstenite = "0.17.1"
|
tokio-tungstenite = "0.17.1"
|
||||||
toml = "0.5"
|
toml = "0.5"
|
||||||
tracing = { version = "0.1", features = ["log"] }
|
tracing = { version = "0.1", features = ["log"] }
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
uuid = { version = "0.8", features = ["serde", "std", "v4"] }
|
uuid = { version = "1.1.2", features = ["serde", "std", "v4"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
mp4 = { git = "https://github.com/scottlamb/mp4-rust", branch = "moonfire" }
|
mp4 = { git = "https://github.com/scottlamb/mp4-rust", branch = "moonfire" }
|
||||||
|
|
|
@ -18,7 +18,6 @@ futures = "0.3"
|
||||||
lazy_static = "1.0"
|
lazy_static = "1.0"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
parking_lot = "0.12.0"
|
|
||||||
nom = "7.0.0"
|
nom = "7.0.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use parking_lot::Mutex;
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::sync::Mutex;
|
||||||
use std::sync::{mpsc, Arc};
|
use std::sync::{mpsc, Arc};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration as StdDuration;
|
use std::time::Duration as StdDuration;
|
||||||
|
@ -160,15 +160,15 @@ impl SimulatedClocks {
|
||||||
|
|
||||||
impl Clocks for SimulatedClocks {
|
impl Clocks for SimulatedClocks {
|
||||||
fn realtime(&self) -> Timespec {
|
fn realtime(&self) -> Timespec {
|
||||||
self.0.boot + *self.0.uptime.lock()
|
self.0.boot + *self.0.uptime.lock().unwrap()
|
||||||
}
|
}
|
||||||
fn monotonic(&self) -> Timespec {
|
fn monotonic(&self) -> Timespec {
|
||||||
Timespec::new(0, 0) + *self.0.uptime.lock()
|
Timespec::new(0, 0) + *self.0.uptime.lock().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Advances the clock by the specified amount without actually sleeping.
|
/// Advances the clock by the specified amount without actually sleeping.
|
||||||
fn sleep(&self, how_long: Duration) {
|
fn sleep(&self, how_long: Duration) {
|
||||||
let mut l = self.0.uptime.lock();
|
let mut l = self.0.uptime.lock().unwrap();
|
||||||
*l = *l + how_long;
|
*l = *l + how_long;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ use std::sync::Arc;
|
||||||
use std::task::{Context, Poll, Waker};
|
use std::task::{Context, Poll, Waker};
|
||||||
|
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use parking_lot::{Condvar, Mutex};
|
|
||||||
use slab::Slab;
|
use slab::Slab;
|
||||||
|
use std::sync::{Condvar, Mutex};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ShutdownError;
|
pub struct ShutdownError;
|
||||||
|
@ -47,6 +47,7 @@ impl Drop for Sender {
|
||||||
.0
|
.0
|
||||||
.wakers
|
.wakers
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.take()
|
.take()
|
||||||
.expect("only the single Sender takes the slab");
|
.expect("only the single Sender takes the slab");
|
||||||
for w in wakers.drain() {
|
for w in wakers.drain() {
|
||||||
|
@ -77,7 +78,7 @@ const NO_WAKER: usize = usize::MAX;
|
||||||
|
|
||||||
impl Receiver {
|
impl Receiver {
|
||||||
pub fn check(&self) -> Result<(), ShutdownError> {
|
pub fn check(&self) -> Result<(), ShutdownError> {
|
||||||
if self.0.wakers.lock().is_none() {
|
if self.0.wakers.lock().unwrap().is_none() {
|
||||||
Err(ShutdownError)
|
Err(ShutdownError)
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -106,22 +107,22 @@ impl Receiver {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wait_for(&self, timeout: std::time::Duration) -> Result<(), ShutdownError> {
|
pub fn wait_for(&self, timeout: std::time::Duration) -> Result<(), ShutdownError> {
|
||||||
let mut l = self.0.wakers.lock();
|
let l = self.0.wakers.lock().unwrap();
|
||||||
if l.is_none() {
|
let result = self
|
||||||
return Err(ShutdownError);
|
.0
|
||||||
}
|
.condvar
|
||||||
if self.0.condvar.wait_for(&mut l, timeout).timed_out() {
|
.wait_timeout_while(l, timeout, |wakers| wakers.is_some())
|
||||||
|
.unwrap();
|
||||||
|
if result.1.timed_out() {
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
// parking_lot guarantees no spurious wakeups.
|
|
||||||
debug_assert!(l.is_none());
|
|
||||||
Err(ShutdownError)
|
Err(ShutdownError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_impl(inner: &Inner, waker_i: &mut usize, cx: &mut Context<'_>) -> Poll<()> {
|
fn poll_impl(inner: &Inner, waker_i: &mut usize, cx: &mut Context<'_>) -> Poll<()> {
|
||||||
let mut l = inner.wakers.lock();
|
let mut l = inner.wakers.lock().unwrap();
|
||||||
let wakers = match &mut *l {
|
let wakers = match &mut *l {
|
||||||
None => return Poll::Ready(()),
|
None => return Poll::Ready(()),
|
||||||
Some(w) => w,
|
Some(w) => w,
|
||||||
|
|
|
@ -22,30 +22,29 @@ diff = "0.1.12"
|
||||||
failure = "0.1.1"
|
failure = "0.1.1"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
h264-reader = "0.5.0"
|
h264-reader = "0.6.0"
|
||||||
hashlink = "0.7.0"
|
hashlink = "0.8.1"
|
||||||
lazy_static = "1.0"
|
lazy_static = "1.0"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
mylog = { git = "https://github.com/scottlamb/mylog" }
|
mylog = { git = "https://github.com/scottlamb/mylog" }
|
||||||
nix = "0.23.0"
|
nix = "0.25.0"
|
||||||
num-rational = { version = "0.4.0", default-features = false, features = ["std"] }
|
num-rational = { version = "0.4.0", default-features = false, features = ["std"] }
|
||||||
odds = { version = "0.4.0", features = ["std-vec"] }
|
odds = { version = "0.4.0", features = ["std-vec"] }
|
||||||
parking_lot = "0.12.0"
|
|
||||||
pretty-hex = "0.3.0"
|
pretty-hex = "0.3.0"
|
||||||
protobuf = "3.0"
|
protobuf = "3.0"
|
||||||
ring = "0.16.2"
|
ring = "0.16.2"
|
||||||
rusqlite = "0.27.0"
|
rusqlite = "0.28.0"
|
||||||
scrypt = "0.9.0"
|
scrypt = "0.10.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
#similar = "2.1.0"
|
#similar = "2.1.0"
|
||||||
smallvec = "1.0"
|
smallvec = "1.0"
|
||||||
tempfile = "3.2.0"
|
tempfile = "3.2.0"
|
||||||
time = "0.1"
|
time = "0.1"
|
||||||
tokio = { version = "1.0", features = ["macros", "parking_lot", "rt-multi-thread", "sync"] }
|
tokio = { version = "1.0", features = ["macros", "rt-multi-thread", "sync"] }
|
||||||
url = { version = "2.1.1", features = ["serde"] }
|
url = { version = "2.1.1", features = ["serde"] }
|
||||||
uuid = { version = "0.8", features = ["serde", "std", "v4"] }
|
uuid = { version = "1.1.2", features = ["serde", "std", "v4"] }
|
||||||
itertools = "0.10.0"
|
itertools = "0.10.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
|
|
@ -11,7 +11,6 @@ use failure::{bail, format_err, Error, Fail, ResultExt as _};
|
||||||
use fnv::FnvHashMap;
|
use fnv::FnvHashMap;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::info;
|
use log::info;
|
||||||
use parking_lot::Mutex;
|
|
||||||
use protobuf::Message;
|
use protobuf::Message;
|
||||||
use ring::rand::{SecureRandom, SystemRandom};
|
use ring::rand::{SecureRandom, SystemRandom};
|
||||||
use rusqlite::{named_params, params, Connection, Transaction};
|
use rusqlite::{named_params, params, Connection, Transaction};
|
||||||
|
@ -20,6 +19,7 @@ use std::collections::BTreeMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref PARAMS: Mutex<scrypt::Params> = Mutex::new(scrypt::Params::recommended());
|
static ref PARAMS: Mutex<scrypt::Params> = Mutex::new(scrypt::Params::recommended());
|
||||||
|
@ -29,7 +29,7 @@ lazy_static! {
|
||||||
/// Call via `testutil::init()`.
|
/// Call via `testutil::init()`.
|
||||||
pub(crate) fn set_test_config() {
|
pub(crate) fn set_test_config() {
|
||||||
let params = scrypt::Params::new(8, 8, 1).unwrap();
|
let params = scrypt::Params::new(8, 8, 1).unwrap();
|
||||||
*PARAMS.lock() = params;
|
*PARAMS.lock().unwrap() = params;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -92,7 +92,7 @@ impl UserChange {
|
||||||
|
|
||||||
pub fn set_password(&mut self, pwd: String) {
|
pub fn set_password(&mut self, pwd: String) {
|
||||||
let salt = SaltString::generate(&mut scrypt::password_hash::rand_core::OsRng);
|
let salt = SaltString::generate(&mut scrypt::password_hash::rand_core::OsRng);
|
||||||
let params = *PARAMS.lock();
|
let params = *PARAMS.lock().unwrap();
|
||||||
let hash = scrypt::Scrypt
|
let hash = scrypt::Scrypt
|
||||||
.hash_password_customized(pwd.as_bytes(), None, None, params, &salt)
|
.hash_password_customized(pwd.as_bytes(), None, None, params, &salt)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -43,7 +43,6 @@ use hashlink::LinkedHashMap;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use log::{error, info, trace};
|
use log::{error, info, trace};
|
||||||
use parking_lot::{Mutex, MutexGuard};
|
|
||||||
use rusqlite::{named_params, params};
|
use rusqlite::{named_params, params};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
@ -57,6 +56,7 @@ use std::path::PathBuf;
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::string::String;
|
use std::string::String;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::{Mutex, MutexGuard};
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
@ -547,7 +547,7 @@ impl Stream {
|
||||||
pub fn days(&self) -> days::Map<days::StreamValue> {
|
pub fn days(&self) -> days::Map<days::StreamValue> {
|
||||||
let mut days = self.committed_days.clone();
|
let mut days = self.committed_days.clone();
|
||||||
for u in &self.uncommitted {
|
for u in &self.uncommitted {
|
||||||
let l = u.lock();
|
let l = u.lock().unwrap();
|
||||||
days.adjust(
|
days.adjust(
|
||||||
l.start..l.start + recording::Duration(i64::from(l.wall_duration_90k)),
|
l.start..l.start + recording::Duration(i64::from(l.wall_duration_90k)),
|
||||||
1,
|
1,
|
||||||
|
@ -850,7 +850,7 @@ impl LockedDatabase {
|
||||||
);
|
);
|
||||||
match stream.uncommitted.back() {
|
match stream.uncommitted.back() {
|
||||||
Some(s) => {
|
Some(s) => {
|
||||||
let l = s.lock();
|
let l = s.lock().unwrap();
|
||||||
r.prev_media_duration =
|
r.prev_media_duration =
|
||||||
l.prev_media_duration + recording::Duration(l.media_duration_90k.into());
|
l.prev_media_duration + recording::Duration(l.media_duration_90k.into());
|
||||||
r.prev_runs = l.prev_runs + if l.run_offset == 0 { 1 } else { 0 };
|
r.prev_runs = l.prev_runs + if l.run_offset == 0 { 1 } else { 0 };
|
||||||
|
@ -884,7 +884,7 @@ impl LockedDatabase {
|
||||||
if stream.synced_recordings == stream.uncommitted.len() {
|
if stream.synced_recordings == stream.uncommitted.len() {
|
||||||
bail!("can't sync un-added recording {}", id);
|
bail!("can't sync un-added recording {}", id);
|
||||||
}
|
}
|
||||||
let l = stream.uncommitted[stream.synced_recordings].lock();
|
let l = stream.uncommitted[stream.synced_recordings].lock().unwrap();
|
||||||
let bytes = i64::from(l.sample_file_bytes);
|
let bytes = i64::from(l.sample_file_bytes);
|
||||||
stream.bytes_to_add += bytes;
|
stream.bytes_to_add += bytes;
|
||||||
stream.fs_bytes_to_add += round_up(bytes);
|
stream.fs_bytes_to_add += round_up(bytes);
|
||||||
|
@ -972,7 +972,7 @@ impl LockedDatabase {
|
||||||
let mut new_duration = 0;
|
let mut new_duration = 0;
|
||||||
let mut new_runs = 0;
|
let mut new_runs = 0;
|
||||||
for i in 0..s.synced_recordings {
|
for i in 0..s.synced_recordings {
|
||||||
let l = s.uncommitted[i].lock();
|
let l = s.uncommitted[i].lock().unwrap();
|
||||||
raw::insert_recording(
|
raw::insert_recording(
|
||||||
&tx,
|
&tx,
|
||||||
o,
|
o,
|
||||||
|
@ -1094,7 +1094,7 @@ impl LockedDatabase {
|
||||||
let u = s.uncommitted.pop_front().unwrap();
|
let u = s.uncommitted.pop_front().unwrap();
|
||||||
log.added
|
log.added
|
||||||
.push(CompositeId::new(stream_id, s.cum_recordings));
|
.push(CompositeId::new(stream_id, s.cum_recordings));
|
||||||
let l = u.lock();
|
let l = u.lock().unwrap();
|
||||||
s.cum_recordings += 1;
|
s.cum_recordings += 1;
|
||||||
let wall_dur = recording::Duration(l.wall_duration_90k.into());
|
let wall_dur = recording::Duration(l.wall_duration_90k.into());
|
||||||
let media_dur = recording::Duration(l.media_duration_90k.into());
|
let media_dur = recording::Duration(l.media_duration_90k.into());
|
||||||
|
@ -1263,7 +1263,7 @@ impl LockedDatabase {
|
||||||
raw::list_recordings_by_time(&self.conn, stream_id, desired_time.clone(), f)?;
|
raw::list_recordings_by_time(&self.conn, stream_id, desired_time.clone(), f)?;
|
||||||
for (i, u) in s.uncommitted.iter().enumerate() {
|
for (i, u) in s.uncommitted.iter().enumerate() {
|
||||||
let row = {
|
let row = {
|
||||||
let l = u.lock();
|
let l = u.lock().unwrap();
|
||||||
if l.video_samples > 0 {
|
if l.video_samples > 0 {
|
||||||
let end = l.start + recording::Duration(l.wall_duration_90k as i64);
|
let end = l.start + recording::Duration(l.wall_duration_90k as i64);
|
||||||
if l.start > desired_time.end || end < desired_time.start {
|
if l.start > desired_time.end || end < desired_time.start {
|
||||||
|
@ -1304,7 +1304,7 @@ impl LockedDatabase {
|
||||||
);
|
);
|
||||||
for i in start..end {
|
for i in start..end {
|
||||||
let row = {
|
let row = {
|
||||||
let l = s.uncommitted[i].lock();
|
let l = s.uncommitted[i].lock().unwrap();
|
||||||
if l.video_samples > 0 {
|
if l.video_samples > 0 {
|
||||||
l.to_list_row(
|
l.to_list_row(
|
||||||
CompositeId::new(stream_id, s.cum_recordings + i as i32),
|
CompositeId::new(stream_id, s.cum_recordings + i as i32),
|
||||||
|
@ -1435,7 +1435,7 @@ impl LockedDatabase {
|
||||||
s.cum_recordings + s.uncommitted.len() as i32
|
s.cum_recordings + s.uncommitted.len() as i32
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
let l = s.uncommitted[i as usize].lock();
|
let l = s.uncommitted[i as usize].lock().unwrap();
|
||||||
return f(&RecordingPlayback {
|
return f(&RecordingPlayback {
|
||||||
video_index: &l.video_index,
|
video_index: &l.video_index,
|
||||||
});
|
});
|
||||||
|
@ -2241,7 +2241,7 @@ impl<C: Clocks + Clone> Drop for Database<C> {
|
||||||
return; // don't flush while panicking.
|
return; // don't flush while panicking.
|
||||||
}
|
}
|
||||||
if let Some(m) = self.db.take() {
|
if let Some(m) = self.db.take() {
|
||||||
if let Err(e) = m.into_inner().flush(&self.clocks, "drop") {
|
if let Err(e) = m.into_inner().unwrap().flush(&self.clocks, "drop") {
|
||||||
error!("Final database flush failed: {}", e);
|
error!("Final database flush failed: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2340,7 +2340,7 @@ impl<C: Clocks + Clone> Database<C> {
|
||||||
/// operations.
|
/// operations.
|
||||||
pub fn lock(&self) -> DatabaseGuard<C> {
|
pub fn lock(&self) -> DatabaseGuard<C> {
|
||||||
let timer = clock::TimerGuard::new(&self.clocks, acquisition);
|
let timer = clock::TimerGuard::new(&self.clocks, acquisition);
|
||||||
let db = self.db.as_ref().unwrap().lock();
|
let db = self.db.as_ref().unwrap().lock().unwrap();
|
||||||
drop(timer);
|
drop(timer);
|
||||||
let _timer = clock::TimerGuard::<C, &'static str, fn() -> &'static str>::new(
|
let _timer = clock::TimerGuard::<C, &'static str, fn() -> &'static str>::new(
|
||||||
&self.clocks,
|
&self.clocks,
|
||||||
|
@ -2357,7 +2357,7 @@ impl<C: Clocks + Clone> Database<C> {
|
||||||
/// This allows verification that a newly opened database is in an acceptable state.
|
/// This allows verification that a newly opened database is in an acceptable state.
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
fn close(mut self) -> rusqlite::Connection {
|
fn close(mut self) -> rusqlite::Connection {
|
||||||
self.db.take().unwrap().into_inner().conn
|
self.db.take().unwrap().into_inner().unwrap().conn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ use std::thread;
|
||||||
use tempfile::TempDir;
|
use tempfile::TempDir;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
static INIT: parking_lot::Once = parking_lot::Once::new();
|
static INIT: std::sync::Once = std::sync::Once::new();
|
||||||
|
|
||||||
/// id of the camera created by `TestDb::new` below.
|
/// id of the camera created by `TestDb::new` below.
|
||||||
pub const TEST_CAMERA_ID: i32 = 1;
|
pub const TEST_CAMERA_ID: i32 = 1;
|
||||||
|
|
|
@ -126,7 +126,7 @@ struct UuidPath([u8; 37]);
|
||||||
impl UuidPath {
|
impl UuidPath {
|
||||||
pub(crate) fn from(uuid: Uuid) -> Self {
|
pub(crate) fn from(uuid: Uuid) -> Self {
|
||||||
let mut buf = [0u8; 37];
|
let mut buf = [0u8; 37];
|
||||||
write!(&mut buf[..36], "{}", uuid.to_hyphenated_ref())
|
write!(&mut buf[..36], "{}", uuid.as_hyphenated())
|
||||||
.expect("can't format uuid to pathname buf");
|
.expect("can't format uuid to pathname buf");
|
||||||
UuidPath(buf)
|
UuidPath(buf)
|
||||||
}
|
}
|
||||||
|
|
|
@ -323,7 +323,7 @@ fn verify_dir_contents(
|
||||||
Ok(u) => u,
|
Ok(u) => u,
|
||||||
Err(_) => bail!("unexpected file {:?} in {:?}", f, sample_file_path),
|
Err(_) => bail!("unexpected file {:?} in {:?}", f, sample_file_path),
|
||||||
};
|
};
|
||||||
if s != uuid.to_hyphenated_ref().to_string() {
|
if s != uuid.as_hyphenated().to_string() {
|
||||||
// non-canonical form.
|
// non-canonical form.
|
||||||
bail!("unexpected file {:?} in {:?}", f, sample_file_path);
|
bail!("unexpected file {:?} in {:?}", f, sample_file_path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ pub fn run(_args: &super::Args, tx: &rusqlite::Transaction) -> Result<(), Error>
|
||||||
if avcc.num_of_sequence_parameter_sets() != 1 {
|
if avcc.num_of_sequence_parameter_sets() != 1 {
|
||||||
bail!("Multiple SPSs!");
|
bail!("Multiple SPSs!");
|
||||||
}
|
}
|
||||||
let ctx = avcc.create_context(()).map_err(|e| {
|
let ctx = avcc.create_context().map_err(|e| {
|
||||||
format_err!(
|
format_err!(
|
||||||
"Can't load SPS+PPS for video_sample_entry_id {}: {:?}",
|
"Can't load SPS+PPS for video_sample_entry_id {}: {:?}",
|
||||||
id,
|
id,
|
||||||
|
|
|
@ -12,12 +12,12 @@ use base::shutdown::ShutdownError;
|
||||||
use failure::{bail, format_err, Error};
|
use failure::{bail, format_err, Error};
|
||||||
use fnv::FnvHashMap;
|
use fnv::FnvHashMap;
|
||||||
use log::{debug, trace, warn};
|
use log::{debug, trace, warn};
|
||||||
use parking_lot::Mutex;
|
|
||||||
use std::cmp::{self, Ordering};
|
use std::cmp::{self, Ordering};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Mutex;
|
||||||
use std::sync::{mpsc, Arc};
|
use std::sync::{mpsc, Arc};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration as StdDuration;
|
use std::time::Duration as StdDuration;
|
||||||
|
@ -860,7 +860,7 @@ impl<F: FileWriter> InnerWriter<F> {
|
||||||
db: &db::Database<C>,
|
db: &db::Database<C>,
|
||||||
stream_id: i32,
|
stream_id: i32,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut l = self.r.lock();
|
let mut l = self.r.lock().unwrap();
|
||||||
|
|
||||||
// design/time.md explains these time manipulations in detail.
|
// design/time.md explains these time manipulations in detail.
|
||||||
let prev_media_duration_90k = l.media_duration_90k;
|
let prev_media_duration_90k = l.media_duration_90k;
|
||||||
|
@ -935,7 +935,7 @@ impl<F: FileWriter> InnerWriter<F> {
|
||||||
// This always ends a live segment.
|
// This always ends a live segment.
|
||||||
let wall_duration;
|
let wall_duration;
|
||||||
{
|
{
|
||||||
let mut l = self.r.lock();
|
let mut l = self.r.lock().unwrap();
|
||||||
l.flags = flags;
|
l.flags = flags;
|
||||||
l.local_time_delta = self.local_start - l.start;
|
l.local_time_delta = self.local_start - l.start;
|
||||||
l.sample_file_blake3 = Some(*blake3.as_bytes());
|
l.sample_file_blake3 = Some(*blake3.as_bytes());
|
||||||
|
@ -979,11 +979,11 @@ mod tests {
|
||||||
use crate::testutil;
|
use crate::testutil;
|
||||||
use base::clock::{Clocks, SimulatedClocks};
|
use base::clock::{Clocks, SimulatedClocks};
|
||||||
use log::{trace, warn};
|
use log::{trace, warn};
|
||||||
use parking_lot::Mutex;
|
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct MockDir(Arc<Mutex<VecDeque<MockDirAction>>>);
|
struct MockDir(Arc<Mutex<VecDeque<MockDirAction>>>);
|
||||||
|
@ -1005,10 +1005,10 @@ mod tests {
|
||||||
MockDir(Arc::new(Mutex::new(VecDeque::new())))
|
MockDir(Arc::new(Mutex::new(VecDeque::new())))
|
||||||
}
|
}
|
||||||
fn expect(&self, action: MockDirAction) {
|
fn expect(&self, action: MockDirAction) {
|
||||||
self.0.lock().push_back(action);
|
self.0.lock().unwrap().push_back(action);
|
||||||
}
|
}
|
||||||
fn ensure_done(&self) {
|
fn ensure_done(&self) {
|
||||||
assert_eq!(self.0.lock().len(), 0);
|
assert_eq!(self.0.lock().unwrap().len(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1019,6 +1019,7 @@ mod tests {
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.expect("got create_file with no expectation")
|
.expect("got create_file with no expectation")
|
||||||
{
|
{
|
||||||
|
@ -1033,6 +1034,7 @@ mod tests {
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.expect("got sync with no expectation")
|
.expect("got sync with no expectation")
|
||||||
{
|
{
|
||||||
|
@ -1044,6 +1046,7 @@ mod tests {
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.expect("got unlink_file with no expectation")
|
.expect("got unlink_file with no expectation")
|
||||||
{
|
{
|
||||||
|
@ -1059,7 +1062,7 @@ mod tests {
|
||||||
impl Drop for MockDir {
|
impl Drop for MockDir {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if !::std::thread::panicking() {
|
if !::std::thread::panicking() {
|
||||||
assert_eq!(self.0.lock().len(), 0);
|
assert_eq!(self.0.lock().unwrap().len(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1077,10 +1080,10 @@ mod tests {
|
||||||
MockFile(Arc::new(Mutex::new(VecDeque::new())))
|
MockFile(Arc::new(Mutex::new(VecDeque::new())))
|
||||||
}
|
}
|
||||||
fn expect(&self, action: MockFileAction) {
|
fn expect(&self, action: MockFileAction) {
|
||||||
self.0.lock().push_back(action);
|
self.0.lock().unwrap().push_back(action);
|
||||||
}
|
}
|
||||||
fn ensure_done(&self) {
|
fn ensure_done(&self) {
|
||||||
assert_eq!(self.0.lock().len(), 0);
|
assert_eq!(self.0.lock().unwrap().len(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1089,6 +1092,7 @@ mod tests {
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.expect("got sync_all with no expectation")
|
.expect("got sync_all with no expectation")
|
||||||
{
|
{
|
||||||
|
@ -1100,6 +1104,7 @@ mod tests {
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.pop_front()
|
.pop_front()
|
||||||
.expect("got write with no expectation")
|
.expect("got write with no expectation")
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,7 +68,7 @@ pub fn parse_extra_data(extradata: &[u8]) -> Result<VideoSampleEntryToInsert, Er
|
||||||
bail!("Multiple SPSs!");
|
bail!("Multiple SPSs!");
|
||||||
}
|
}
|
||||||
let ctx = avcc
|
let ctx = avcc
|
||||||
.create_context(())
|
.create_context()
|
||||||
.map_err(|e| format_err!("Can't load SPS+PPS: {:?}", e))?;
|
.map_err(|e| format_err!("Can't load SPS+PPS: {:?}", e))?;
|
||||||
let sps = ctx
|
let sps = ctx
|
||||||
.sps_by_id(h264_reader::nal::pps::ParamSetId::from_u32(0).unwrap())
|
.sps_by_id(h264_reader::nal::pps::ParamSetId::from_u32(0).unwrap())
|
||||||
|
|
|
@ -66,7 +66,6 @@ use futures::Stream;
|
||||||
use http::header::HeaderValue;
|
use http::header::HeaderValue;
|
||||||
use hyper::body::Buf;
|
use hyper::body::Buf;
|
||||||
use log::{debug, error, trace, warn};
|
use log::{debug, error, trace, warn};
|
||||||
use parking_lot::Once;
|
|
||||||
use reffers::ARefss;
|
use reffers::ARefss;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
@ -77,6 +76,7 @@ use std::io;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::Once;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
/// This value should be incremented any time a change is made to this file that causes different
|
/// This value should be incremented any time a change is made to this file that causes different
|
||||||
|
|
|
@ -288,10 +288,10 @@ mod tests {
|
||||||
use db::{recording, testutil, CompositeId};
|
use db::{recording, testutil, CompositeId};
|
||||||
use failure::{bail, Error};
|
use failure::{bail, Error};
|
||||||
use log::trace;
|
use log::trace;
|
||||||
use parking_lot::Mutex;
|
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::Mutex;
|
||||||
use time;
|
use time;
|
||||||
|
|
||||||
struct ProxyingStream {
|
struct ProxyingStream {
|
||||||
|
@ -385,7 +385,7 @@ mod tests {
|
||||||
_options: stream::Options,
|
_options: stream::Options,
|
||||||
) -> Result<Box<dyn stream::Stream>, Error> {
|
) -> Result<Box<dyn stream::Stream>, Error> {
|
||||||
assert_eq!(&url, &self.expected_url);
|
assert_eq!(&url, &self.expected_url);
|
||||||
let mut l = self.streams.lock();
|
let mut l = self.streams.lock().unwrap();
|
||||||
match l.pop() {
|
match l.pop() {
|
||||||
Some(stream) => {
|
Some(stream) => {
|
||||||
trace!("MockOpener returning next stream");
|
trace!("MockOpener returning next stream");
|
||||||
|
@ -393,7 +393,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
trace!("MockOpener shutting down");
|
trace!("MockOpener shutting down");
|
||||||
self.shutdown_tx.lock().take();
|
self.shutdown_tx.lock().unwrap().take();
|
||||||
bail!("done")
|
bail!("done")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -472,7 +472,7 @@ mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
stream.run();
|
stream.run();
|
||||||
assert!(opener.streams.lock().is_empty());
|
assert!(opener.streams.lock().unwrap().is_empty());
|
||||||
db.syncer_channel.flush();
|
db.syncer_channel.flush();
|
||||||
let db = db.db.lock();
|
let db = db.db.lock();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue