diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b260e17..a999eee 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -38,14 +38,6 @@ jobs: if: matrix.os == 'windows-latest' run: "choco install -y bonjour" - - name: Cache Cargo - uses: actions/cache@v3 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - name: Build run: cargo build --features "${{ matrix.features }}" diff --git a/Cargo.lock b/Cargo.lock index 001d889..91d2198 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,21 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -28,37 +28,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "once_cell", - "windows-sys", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] @@ -90,7 +90,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.100", + "syn 2.0.110", "which", ] @@ -113,15 +113,15 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.100", + "syn 2.0.110", "which", ] [[package]] name = "bitflags" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bonjour-sys" @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clang-sys" @@ -161,9 +161,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -171,9 +171,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -183,27 +183,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.110", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "darling" @@ -308,12 +308,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -324,9 +324,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "heck" @@ -336,24 +336,24 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "humantime" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "ident_case" @@ -363,20 +363,20 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -407,18 +407,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets", + "windows-link", ] [[package]] @@ -429,9 +429,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "maplit" @@ -441,9 +441,9 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "minimal-lexical" @@ -467,6 +467,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -475,37 +481,37 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.110", ] [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -515,9 +521,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -526,9 +532,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rustc-hash" @@ -546,7 +552,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -557,34 +563,45 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.110", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -618,9 +635,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -638,9 +655,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "utf8parse" @@ -662,13 +679,19 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.59.0" @@ -678,6 +701,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -744,7 +776,7 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "zeroconf" -version = "0.15.1" +version = "0.16.0" dependencies = [ "avahi-sys", "bonjour-sys", @@ -776,7 +808,7 @@ name = "zeroconf-macros" version = "0.1.4" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.110", ] [[package]] diff --git a/examples/browser/src/main.rs b/examples/browser/src/main.rs index 5f768ce..8c5ee71 100644 --- a/examples/browser/src/main.rs +++ b/examples/browser/src/main.rs @@ -57,7 +57,7 @@ fn main() -> zeroconf::Result<()> { fn on_service_discovery_event( result: zeroconf::Result, - _context: Option>, + _context: Option>, ) { info!( "Service event: {:?}", diff --git a/examples/service/src/main.rs b/examples/service/src/main.rs index 23fce9d..83c6a53 100644 --- a/examples/service/src/main.rs +++ b/examples/service/src/main.rs @@ -62,7 +62,7 @@ fn main() -> zeroconf::Result<()> { fn on_service_registered( result: zeroconf::Result, - context: Option>, + context: Option>, ) { let service = result.expect("failed to register service"); diff --git a/zeroconf/Cargo.toml b/zeroconf/Cargo.toml index ab3065d..474c910 100644 --- a/zeroconf/Cargo.toml +++ b/zeroconf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zeroconf" -version = "0.15.1" +version = "0.16.0" authors = ["Walker Crouse "] edition = "2018" description = "cross-platform library that wraps ZeroConf/mDNS implementations like Bonjour or Avahi" diff --git a/zeroconf/src/avahi/browser.rs b/zeroconf/src/avahi/browser.rs index 6adab5e..9c8601b 100644 --- a/zeroconf/src/avahi/browser.rs +++ b/zeroconf/src/avahi/browser.rs @@ -36,6 +36,9 @@ pub struct AvahiMdnsBrowser { poll: Option>, } +unsafe impl Send for AvahiMdnsBrowser {} +unsafe impl Sync for AvahiMdnsBrowser {} + impl TMdnsBrowser for AvahiMdnsBrowser { fn new(service_type: ServiceType) -> Self { Self { @@ -60,11 +63,11 @@ impl TMdnsBrowser for AvahiMdnsBrowser { self.context.service_callback = Some(service_callback); } - fn set_context(&mut self, context: Box) { + fn set_context(&mut self, context: Box) { self.context.user_context = Some(Arc::from(context)); } - fn context(&self) -> Option<&dyn Any> { + fn context(&self) -> Option<&(dyn Any + Send + Sync)> { self.context.user_context.as_ref().map(|c| c.as_ref()) } @@ -110,7 +113,7 @@ struct AvahiBrowserContext { client: Option>, resolvers: ServiceResolverSet, service_callback: Option>, - user_context: Option>, + user_context: Option>, interface_index: AvahiIfIndex, kind: CString, browser: Option, @@ -146,6 +149,9 @@ impl fmt::Debug for AvahiBrowserContext { } } +unsafe impl Send for AvahiBrowserContext {} +unsafe impl Sync for AvahiBrowserContext {} + unsafe extern "C" fn client_callback( client: *mut AvahiClient, state: AvahiClientState, diff --git a/zeroconf/src/avahi/entry_group.rs b/zeroconf/src/avahi/entry_group.rs index 9babd93..d759b62 100644 --- a/zeroconf/src/avahi/entry_group.rs +++ b/zeroconf/src/avahi/entry_group.rs @@ -172,6 +172,9 @@ impl Drop for ManagedAvahiEntryGroup { } } +unsafe impl Send for ManagedAvahiEntryGroup {} +unsafe impl Sync for ManagedAvahiEntryGroup {} + /// Holds parameters for initializing a new `ManagedAvahiEntryGroup` with /// `ManagedAvahiEntryGroup::new()`. /// diff --git a/zeroconf/src/avahi/raw_browser.rs b/zeroconf/src/avahi/raw_browser.rs index 8124539..edf1286 100644 --- a/zeroconf/src/avahi/raw_browser.rs +++ b/zeroconf/src/avahi/raw_browser.rs @@ -77,6 +77,9 @@ impl Drop for ManagedAvahiServiceBrowser { } } +unsafe impl Send for ManagedAvahiServiceBrowser {} +unsafe impl Sync for ManagedAvahiServiceBrowser {} + /// Holds parameters for initializing a new `ManagedAvahiServiceBrowser` with /// `ManagedAvahiServiceBrowser::new()`. /// diff --git a/zeroconf/src/avahi/resolver.rs b/zeroconf/src/avahi/resolver.rs index 3ff11a3..587cabf 100644 --- a/zeroconf/src/avahi/resolver.rs +++ b/zeroconf/src/avahi/resolver.rs @@ -71,6 +71,9 @@ impl Drop for ManagedAvahiServiceResolver { } } +unsafe impl Send for ManagedAvahiServiceResolver {} +unsafe impl Sync for ManagedAvahiServiceResolver {} + /// Holds parameters for initializing a new `ManagedAvahiServiceResolver` with /// `ManagedAvahiServiceResolver::new()`. /// diff --git a/zeroconf/src/avahi/service.rs b/zeroconf/src/avahi/service.rs index 5e068bc..3f908cf 100644 --- a/zeroconf/src/avahi/service.rs +++ b/zeroconf/src/avahi/service.rs @@ -32,6 +32,9 @@ pub struct AvahiMdnsService { poll: Option>, } +unsafe impl Send for AvahiMdnsService {} +unsafe impl Sync for AvahiMdnsService {} + impl TMdnsService for AvahiMdnsService { fn new(service_type: ServiceType, port: u16) -> Self { let kind = avahi_util::format_service_type(&service_type); @@ -99,11 +102,11 @@ impl TMdnsService for AvahiMdnsService { self.context.registered_callback = registered_callback.into() } - fn set_context(&mut self, context: Box) { + fn set_context(&mut self, context: Box) { self.context.user_context = Some(Arc::from(context)) } - fn context(&self) -> Option<&dyn Any> { + fn context(&self) -> Option<&(dyn Any + Send + Sync)> { self.context.user_context.as_ref().map(|c| c.as_ref()) } @@ -157,7 +160,7 @@ struct AvahiServiceContext { domain: Option, host: Option, registered_callback: Option>, - user_context: Option>, + user_context: Option>, } impl AvahiServiceContext { @@ -198,6 +201,9 @@ impl fmt::Debug for AvahiServiceContext { } } +unsafe impl Send for AvahiServiceContext {} +unsafe impl Sync for AvahiServiceContext {} + unsafe extern "C" fn client_callback( client: *mut AvahiClient, state: AvahiClientState, diff --git a/zeroconf/src/avahi/string_list.rs b/zeroconf/src/avahi/string_list.rs index 6b1d931..90c0a35 100644 --- a/zeroconf/src/avahi/string_list.rs +++ b/zeroconf/src/avahi/string_list.rs @@ -44,7 +44,7 @@ impl ManagedAvahiStringList { /// dereferenced. /// /// [`avahi_string_list_find()`]: https://avahi.org/doxygen/html/strlst_8h.html#aafc54c009a2a1608b517c15a7cf29944 - pub unsafe fn find(&mut self, key: *const c_char) -> Option { + pub unsafe fn find(&mut self, key: *const c_char) -> Option> { let node = avahi_string_list_find(self.0, key); if !node.is_null() { @@ -75,7 +75,7 @@ impl ManagedAvahiStringList { } /// Returns the first node in the list. - pub fn head(&mut self) -> AvahiStringListNode { + pub fn head(&mut self) -> AvahiStringListNode<'_> { AvahiStringListNode::new(self.0) } diff --git a/zeroconf/src/bonjour/browser.rs b/zeroconf/src/bonjour/browser.rs index 20ea4b5..a84161c 100644 --- a/zeroconf/src/bonjour/browser.rs +++ b/zeroconf/src/bonjour/browser.rs @@ -30,6 +30,9 @@ pub struct BonjourMdnsBrowser { context: Box, } +unsafe impl Send for BonjourMdnsBrowser {} +unsafe impl Sync for BonjourMdnsBrowser {} + impl TMdnsBrowser for BonjourMdnsBrowser { fn new(service_type: ServiceType) -> Self { Self { @@ -52,11 +55,11 @@ impl TMdnsBrowser for BonjourMdnsBrowser { self.context.service_discovered_callback = Some(service_discovered_callback); } - fn set_context(&mut self, context: Box) { + fn set_context(&mut self, context: Box) { self.context.user_context = Some(Arc::from(context)); } - fn context(&self) -> Option<&dyn Any> { + fn context(&self) -> Option<&(dyn Any + Send + Sync)> { self.context.user_context.as_ref().map(|c| c.as_ref()) } @@ -91,7 +94,7 @@ struct BonjourBrowserContext { resolved_domain: Option, resolved_port: u16, resolved_txt: Option, - user_context: Option>, + user_context: Option>, } impl BonjourBrowserContext { @@ -115,6 +118,9 @@ impl fmt::Debug for BonjourBrowserContext { } } +unsafe impl Send for BonjourBrowserContext {} +unsafe impl Sync for BonjourBrowserContext {} + unsafe extern "system" fn browse_callback( _sd_ref: DNSServiceRef, flags: DNSServiceFlags, diff --git a/zeroconf/src/bonjour/service.rs b/zeroconf/src/bonjour/service.rs index 014d6f7..0cf2b9b 100644 --- a/zeroconf/src/bonjour/service.rs +++ b/zeroconf/src/bonjour/service.rs @@ -28,6 +28,9 @@ pub struct BonjourMdnsService { context: Box, } +unsafe impl Send for BonjourMdnsService {} +unsafe impl Sync for BonjourMdnsService {} + impl TMdnsService for BonjourMdnsService { fn new(service_type: ServiceType, port: u16) -> Self { Self { @@ -89,11 +92,11 @@ impl TMdnsService for BonjourMdnsService { self.context.registered_callback = Some(registered_callback); } - fn set_context(&mut self, context: Box) { + fn set_context(&mut self, context: Box) { self.context.user_context = Some(Arc::from(context)); } - fn context(&self) -> Option<&dyn Any> { + fn context(&self) -> Option<&(dyn Any + Send + Sync)> { self.context.user_context.as_ref().map(|c| c.as_ref()) } @@ -140,7 +143,7 @@ impl TMdnsService for BonjourMdnsService { #[derive(Default, FromRaw, AsRaw)] struct BonjourServiceContext { registered_callback: Option>, - user_context: Option>, + user_context: Option>, } // Necessary for BonjourMdnsService, cant be `derive`d because of registered_callback @@ -152,6 +155,9 @@ impl std::fmt::Debug for BonjourServiceContext { } } +unsafe impl Send for BonjourServiceContext {} +unsafe impl Sync for BonjourServiceContext {} + impl BonjourServiceContext { fn invoke_callback(&self, result: Result) { if let Some(f) = &self.registered_callback { diff --git a/zeroconf/src/browser.rs b/zeroconf/src/browser.rs index 5817e7d..464c714 100644 --- a/zeroconf/src/browser.rs +++ b/zeroconf/src/browser.rs @@ -35,10 +35,10 @@ pub trait TMdnsBrowser { /// Sets the optional user context to pass through to the callback. This is useful if you need /// to share state between pre and post-callback. The context type must implement `Any`. - fn set_context(&mut self, context: Box); + fn set_context(&mut self, context: Box); /// Returns the optional user context to pass through to the callback. - fn context(&self) -> Option<&dyn Any>; + fn context(&self) -> Option<&(dyn Any + Send + Sync)>; /// Starts the browser. Returns an `EventLoop` which can be called to keep the browser alive. fn browse_services(&mut self) -> Result; @@ -52,7 +52,8 @@ pub trait TMdnsBrowser { /// * `context` - The optional user context passed through /// /// [`MdnsBrowser`]: type.MdnsBrowser.html -pub type ServiceBrowserCallback = dyn Fn(Result, Option>); +pub type ServiceBrowserCallback = + dyn Fn(Result, Option>) + Send + Sync; /// Represents a service that has been discovered by a [`MdnsBrowser`]. /// diff --git a/zeroconf/src/lib.rs b/zeroconf/src/lib.rs index 6263f21..a0c7b42 100644 --- a/zeroconf/src/lib.rs +++ b/zeroconf/src/lib.rs @@ -81,7 +81,7 @@ //! //! fn on_service_registered( //! result: zeroconf::Result, -//! context: Option>, +//! context: Option>, //! ) { //! let service = result.expect("failed to register service"); //! @@ -166,7 +166,7 @@ //! //! fn on_service_event( //! result: zeroconf::Result, -//! _context: Option>, +//! _context: Option>, //! ) { //! info!( //! "Service event: {:?}", diff --git a/zeroconf/src/service.rs b/zeroconf/src/service.rs index e6e7360..7525684 100644 --- a/zeroconf/src/service.rs +++ b/zeroconf/src/service.rs @@ -58,10 +58,10 @@ pub trait TMdnsService { /// Sets the optional user context to pass through to the callback. This is useful if you need /// to share state between pre and post-callback. The context type must implement `Any`. - fn set_context(&mut self, context: Box); + fn set_context(&mut self, context: Box); /// Returns the optional user context. - fn context(&self) -> Option<&dyn Any>; + fn context(&self) -> Option<&(dyn Any + Send + Sync)>; /// Registers and start's the service. Returns an `EventLoop` which can be called to keep /// the service alive. @@ -75,7 +75,8 @@ pub trait TMdnsService { /// * `context` - The optional user context passed through /// /// [`MdnsService`]: type.MdnsService.html -pub type ServiceRegisteredCallback = dyn Fn(Result, Option>); +pub type ServiceRegisteredCallback = + dyn Fn(Result, Option>) + Send + Sync; /// Represents a registration event for a [`MdnsService`]. ///