diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..f503b8f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,97 @@ +name: Build Project + +on: + push: + branches: [ "master" ] + pull_request: + +jobs: + linux: + strategy: + matrix: + include: + - target: x86_64-unknown-linux-gnu + - target: i686-unknown-linux-gnu + deps: apt-get install -y gcc-multilib + - target: aarch64-unknown-linux-gnu + deps: apt-get install -y gcc-aarch64-linux-gnu + - target: armv7-unknown-linux-gnueabihf + deps: apt-get install -y gcc-arm-linux-gnueabihf + + name: Build ${{ matrix.target }} + runs-on: ubuntu-latest + container: + image: ubuntu:18.04 + steps: + - name: Checkout sources + uses: taiki-e/checkout-action@v1 + - name: Install Essentials + run: | + apt-get update -y + apt-get upgrade -y + apt-get install -y curl gcc openjdk-17-jdk-headless + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + targets: ${{ matrix.target }} + - name: Install linker dependencies + run: ${{ matrix.deps }} + if: ${{ matrix.deps != '' }} + - name: Run Gradle Build + run: ./gradlew build -Ptarget=${{ matrix.target }} + + windows: + strategy: + matrix: + include: + - target: x86_64-pc-windows-msvc + - target: i686-pc-windows-msvc + + name: Build ${{ matrix.target }} + runs-on: windows-2022 + steps: + - name: Checkout sources + uses: actions/checkout@v6 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + target: ${{ matrix.target }} + - name: Set up JDK + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' + cache: 'gradle' + - name: Run Gradle Build + run: ./gradlew build -Ptarget=${{ matrix.target }} + + macos: + name: Build macOS universal binary + runs-on: macos-14 + steps: + - name: Checkout sources + uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - name: Compile natives + working-directory: native + run: | + rustup target add x86_64-apple-darwin + cargo build -r --target=x86_64-apple-darwin + rustup target add aarch64-apple-darwin + cargo build -r --target=aarch64-apple-darwin + + - name: Create target directory for darwin + run: mkdir -p native/target/darwin/release + + - name: Combine to universal dylib + run: lipo -create -output native/target/darwin/release/libudpqueue.dylib native/target/**/release/*.dylib + + - name: Run Gradle Build + run: ./gradlew build -x cargoBuild -Ptarget=darwin diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index 24f6cd8..3ea60e0 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -1,13 +1,7 @@ name: musl on: - push: - branches: [ "master" ] - paths: - - '.github/workflows/musl.yml' # when new targets are added - - 'build.gradle.kts' # when the root build script changes - - 'api' # when api source is changed - - 'native' # when natives are changed + workflow_dispatch: concurrency: group: "pub-musl" @@ -37,14 +31,14 @@ jobs: image: alpine:3.18 steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: taiki-e/checkout-action@v1 - name: Install Essentials run: | apk add curl gcc bash mkdir -p /root/musl curl -q https://musl.cc/x86_64-linux-musl-cross.tgz | tar xzf - -C /root/musl - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@0e66bd3e6b38ec0ad5312288c83e47c143e6b09e #@v1.0.6 + uses: dtolnay/rust-toolchain@stable with: toolchain: stable target: x86_64-unknown-linux-musl ${{ matrix.target }} # requires native target installed to build proc-macros2 diff --git a/.github/workflows/publish-api.yml b/.github/workflows/publish-api.yml index 21af0af..3b8fe74 100644 --- a/.github/workflows/publish-api.yml +++ b/.github/workflows/publish-api.yml @@ -1,12 +1,6 @@ name: publish-api on: - push: - branches: [ "master" ] - paths: - - '.github/workflows/publish-api.yml' # when new targets are added - - 'build.gradle.kts' # when the root build script changes - - 'api' # when api source is changed workflow_dispatch: @@ -21,15 +15,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4 + uses: actions/checkout@v6 - - name: Publish + - name: Build and Publish env: - ORG_GRADLE_PROJECT_ossrhUser: ${{ secrets.OSSRH_USER }} - ORG_GRADLE_PROJECT_ossrhPassword: ${{ secrets.OSSRH_PASSWORD }} - ORG_GRADLE_PROJECT_stagingProfile: ${{ secrets.STAGING_PROFILE_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_KEY }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.GPG_KEYID }} - run: | - chmod u+x gradlew - ./gradlew --console plain --stacktrace -Ptarget=x86_64-unknown-linux-gnu api:publishToSonatype closeAndReleaseStagingRepository + JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} + JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.MAVENCENTRAL_TOKEN }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + run: ./gradlew api:publish api:jreleaserRelease diff --git a/.github/workflows/publish-mac.yml b/.github/workflows/publish-mac.yml deleted file mode 100644 index 917e658..0000000 --- a/.github/workflows/publish-mac.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: publish-natives-macos - -on: - push: - branches: [ "master" ] - paths: - - '.github/workflows/publish-mac.yml' # when new targets are added - - 'build.gradle.kts' # when the root build script changes - - 'api' # when api source is changed - - 'native' # when natives are changed - -concurrency: - group: "pub-mac" - cancel-in-progress: true - -jobs: - build: - name: Build macOS universal binary - environment: MavenRelease - runs-on: macos-12 - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Install Rust toolchain - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af #@v1 - with: - profile: minimal - toolchain: stable - override: true - - - name: Compile natives - working-directory: native - run: | - rustup target add x86_64-apple-darwin - cargo build -r --target=x86_64-apple-darwin - rustup target add aarch64-apple-darwin - cargo build -r --target=aarch64-apple-darwin - - - name: Create target directory for darwin - run: mkdir -p native/target/darwin/release - - - name: Combine to universal dylib - run: lipo -create -output native/target/darwin/release/libudpqueue.dylib native/target/**/release/*.dylib - - - name: Publish - env: - ORG_GRADLE_PROJECT_ossrhUser: ${{ secrets.OSSRH_USER }} - ORG_GRADLE_PROJECT_ossrhPassword: ${{ secrets.OSSRH_PASSWORD }} - ORG_GRADLE_PROJECT_stagingProfile: ${{ secrets.STAGING_PROFILE_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_KEY }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.GPG_KEYID }} - run: | - chmod u+x gradlew - ./gradlew --console plain --stacktrace -Ptarget=darwin native:publishToSonatype closeAndReleaseStagingRepository diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f05294d..41a190e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,13 +1,6 @@ name: publish-natives on: - push: - branches: [ "master" ] - paths: - - '.github/workflows/publish.yml' # when new targets are added - - 'build.gradle.kts' # when the root build script changes - - 'api' # when api source is changed - - 'native' # when natives are changed workflow_dispatch: concurrency: @@ -29,9 +22,9 @@ jobs: name: Publish ${{ matrix.target }} environment: MavenRelease - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest container: - image: ubuntu:16.04 + image: ubuntu:18.04 steps: - name: Checkout sources uses: taiki-e/checkout-action@v1 @@ -39,12 +32,7 @@ jobs: run: | apt-get update -y apt-get upgrade -y - apt-get install -y curl gcc openjdk-8-jdk-headless - - name: Setup rustup - run: | - curl --proto '=https' --tlsv1.2 --retry 10 --location --silent --show-error --fail "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y - echo "$HOME/.cargo/bin" >> $GITHUB_PATH - shell: bash + apt-get install -y curl gcc openjdk-17-jdk-headless - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: @@ -53,19 +41,15 @@ jobs: - name: Install linker dependencies run: ${{ matrix.deps }} if: ${{ matrix.deps != '' }} - - name: Compile natives - working-directory: native - run: cargo build -r --target=${{ matrix.target }} - - name: Publish + - name: Build and Publish env: - ORG_GRADLE_PROJECT_ossrhUser: ${{ secrets.OSSRH_USER }} - ORG_GRADLE_PROJECT_ossrhPassword: ${{ secrets.OSSRH_PASSWORD }} - ORG_GRADLE_PROJECT_stagingProfile: ${{ secrets.STAGING_PROFILE_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_KEY }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.GPG_KEYID }} - run: | - chmod u+x gradlew - ./gradlew --console plain --stacktrace -Ptarget="${{ matrix.target }}" native:publishToSonatype closeAndReleaseStagingRepository + JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} + JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.MAVENCENTRAL_TOKEN }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + run: ./gradlew native:publish native:jreleaserRelease -Ptarget=${{ matrix.target }} + windows: strategy: matrix: @@ -75,27 +59,61 @@ jobs: name: Publish ${{ matrix.target }} environment: MavenRelease - runs-on: windows-2019 + runs-on: windows-2022 steps: - name: Checkout sources - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: Install Rust toolchain - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af #@v1 + uses: dtolnay/rust-toolchain@stable with: - profile: minimal toolchain: stable - override: true target: ${{ matrix.target }} + - name: Set up JDK + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' + cache: 'gradle' + - name: Build and Publish + env: + JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} + JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.MAVENCENTRAL_TOKEN }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + run: ./gradlew native:publish native:jreleaserRelease -Ptarget=${{ matrix.target }} + + macos: + name: Build macOS universal binary + runs-on: macos-14 + steps: + - name: Checkout sources + uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + - name: Compile natives working-directory: native - run: cargo build -r --target=${{ matrix.target }} - - name: Publish - env: - ORG_GRADLE_PROJECT_ossrhUser: ${{ secrets.OSSRH_USER }} - ORG_GRADLE_PROJECT_ossrhPassword: ${{ secrets.OSSRH_PASSWORD }} - ORG_GRADLE_PROJECT_stagingProfile: ${{ secrets.STAGING_PROFILE_ID }} - ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_KEY }} - ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.GPG_KEYID }} run: | - chmod u+x gradlew - ./gradlew --console plain --stacktrace -Ptarget="${{ matrix.target }}" native:publishToSonatype closeAndReleaseStagingRepository + rustup target add x86_64-apple-darwin + cargo build -r --target=x86_64-apple-darwin + rustup target add aarch64-apple-darwin + cargo build -r --target=aarch64-apple-darwin + + - name: Create target directory for darwin + run: mkdir -p native/target/darwin/release + + - name: Combine to universal dylib + run: lipo -create -output native/target/darwin/release/libudpqueue.dylib native/target/**/release/*.dylib + + - name: Build and Publish + env: + JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} + JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.MAVENCENTRAL_TOKEN }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + run: ./gradlew native:publish native:jreleaserRelease -Ptarget=${{ matrix.target }} -x cargoBuild \ No newline at end of file diff --git a/.github/workflows/rust-clippy.yml b/.github/workflows/rust-clippy.yml index efe680c..31e051e 100644 --- a/.github/workflows/rust-clippy.yml +++ b/.github/workflows/rust-clippy.yml @@ -34,15 +34,13 @@ jobs: security-events: write steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: Install Rust toolchain - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af #@v1 + uses: dtolnay/rust-toolchain@stable with: - profile: minimal toolchain: stable components: clippy - override: true - name: Install required cargo run: cargo install clippy-sarif sarif-fmt diff --git a/CHANGELOG.md b/CHANGELOG.md index a3fcce4..0c9316c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.2.10 - TBD + +- Update dependencies and modernize gradle project + ## v0.2.9 - 2024/08/21 - Update dependencies diff --git a/README.md b/README.md index 39da05e..1fe3b5a 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ MacOS/Darwin universal (x86 intel & aarch64 M1): [![](https://img.shields.io/maven-central/v/club.minnced/udpqueue-native-darwin?color=blue&label=darwin&logo=apple&logoColor=white)](https://search.maven.org/artifact/club.minnced/udpqueue-native-darwin) -More platforms can be added on request. Linux shared libraries are compiled against **GLIBC 2.18**. +More platforms can be added on request. Linux shared libraries are compiled against **GLIBC 2.27**. Simply install the version of `udpqueue-native-*` for your platform: diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 1eef0b9..d32c149 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,10 +1,9 @@ -import java.net.URL -import javax.net.ssl.HttpsURLConnection - plugins { - `java-library` - `maven-publish` - signing + `publishing-environment` +} + +publishingEnvironment { + moduleName = "udpqueue-api" } repositories { @@ -12,72 +11,11 @@ repositories { } dependencies { - implementation("org.slf4j:slf4j-api:1.7.25") - implementation("dev.arbjerg:lava-common:1.5.4") - compileOnly("net.dv8tion:JDA:5.0.2") + implementation("org.slf4j:slf4j-api:2.0.17") + implementation("dev.arbjerg:lava-common:1.5.6") + compileOnly("net.dv8tion:JDA:6.2.0") } val javadoc: Javadoc by tasks javadoc.isFailOnError = false - -val javadocJar = tasks.register("javadocJar") { - group = "build" - dependsOn(javadoc) - from(javadoc.destinationDir) - archiveClassifier.set("javadoc") -} - -val sourcesJar = tasks.register("sourcesJar") { - group = "build" - from(sourceSets["main"].java) - archiveClassifier.set("sources") -} - -tasks.withType { - archiveBaseName.set("udpqueue-api") -} - -publishing.publications { - create("Release") { - from(components["java"]) - - groupId = group.toString() - artifactId = "udpqueue-api" - version = version.toString() - - artifact(javadocJar) - artifact(sourcesJar) - - pom.apply(ext["generatePom"] as MavenPom.() -> Unit) - pom.name.set(artifactId) - } -} - - -val shouldPublish by lazy { - val conn = URL("https://repo1.maven.org/maven2/club/minnced/udpqueue-api/$version/").openConnection() as HttpsURLConnection - conn.requestMethod = "GET" - conn.connect() - - conn.responseCode > 400 -} - -val signingKey: String? by project -val signingPassword: String? by project - -if (signingKey != null) { - signing { - useInMemoryPgpKeys(signingKey, signingPassword ?: "") - val publications = publishing.publications.toTypedArray() - sign(*publications) - } -} else { - println("Could not find signingKey") -} - -// Only run publishing tasks if the version doesn't already exist - -tasks.withType { - enabled = enabled && shouldPublish -} \ No newline at end of file diff --git a/api/src/main/java/com/sedmelluq/discord/lavaplayer/tools/DaemonThreadFactory.java b/api/src/main/java/com/sedmelluq/discord/lavaplayer/tools/DaemonThreadFactory.java index 861228b..5d100d4 100644 --- a/api/src/main/java/com/sedmelluq/discord/lavaplayer/tools/DaemonThreadFactory.java +++ b/api/src/main/java/com/sedmelluq/discord/lavaplayer/tools/DaemonThreadFactory.java @@ -30,9 +30,7 @@ public DaemonThreadFactory(String name) { * @param exitCallback Runnable to be executed when the thread exits. */ public DaemonThreadFactory(String name, Runnable exitCallback) { - SecurityManager securityManager = System.getSecurityManager(); - - group = (securityManager != null) ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup(); + group = Thread.currentThread().getThreadGroup(); namePrefix = "lava-daemon-pool-" + name + "-" + poolNumber.getAndIncrement() + "-thread-"; this.exitCallback = exitCallback; } diff --git a/build.gradle.kts b/build.gradle.kts index d4c2b61..ca2d60e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,36 +1,12 @@ -import java.time.Duration - plugins { `java-library` `maven-publish` signing - id("io.github.gradle-nexus.publish-plugin") version "1.1.0" } -val ossrhUser: String? by project -val ossrhPassword: String? by project -val stagingProfile: String? by project - -val enablePublishing = ossrhUser != null && ossrhPassword != null && stagingProfile != null - -if (enablePublishing) { - apply(plugin = "io.github.gradle-nexus.publish-plugin") - - nexusPublishing { - repositories.sonatype { - username.set(ossrhUser) - password.set(ossrhPassword) - stagingProfileId.set(stagingProfile) - } - - // Sonatype is very slow :) - connectTimeout.set(Duration.ofMinutes(1)) - clientTimeout.set(Duration.ofMinutes(10)) - - transitionCheckOptions { - maxRetries.set(100) - delayBetween.set(Duration.ofSeconds(5)) - } +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) } } @@ -39,85 +15,6 @@ subprojects { mavenCentral() } - apply(plugin="java") - - configure { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - group = "club.minnced" - version = "0.2.9" - - // See https://github.com/sedmelluq/lavaplayer/blob/master/common/src/main/java/com/sedmelluq/lava/common/natives/architecture/DefaultArchitectureTypes.java - // identifier is the suffix used after the system name - fun getPlatform(triplet: String) = when { - triplet.startsWith("x86_64") && "linux" in triplet && "musl" in triplet -> "linux-musl-x86-64" - triplet.startsWith("i686") && "linux" in triplet && "musl" in triplet -> "linux-musl-x86" - triplet.startsWith("aarch64") && "linux" in triplet && "musl" in triplet -> "linux-musl-aarch64" - triplet.startsWith("arm") && "linux" in triplet && "musl" in triplet -> "linux-musl-arm" - - triplet.startsWith("x86_64") && "linux" in triplet -> "linux-x86-64" - triplet.startsWith("i686") && "linux" in triplet -> "linux-x86" - triplet.startsWith("aarch64") && "linux" in triplet -> "linux-aarch64" - triplet.startsWith("arm") && "linux" in triplet -> "linux-arm" - - triplet.startsWith("x86_64") && "windows" in triplet -> "win-x86-64" - triplet.startsWith("i686") && "windows" in triplet -> "win-x86" - triplet.startsWith("aarch64") && "windows" in triplet -> "win-aarch64" - triplet.startsWith("arm") && "windows" in triplet -> "win-arm" - - "darwin" in triplet -> "darwin" - - else -> throw IllegalArgumentException("Unknown platform: $triplet") - } - - // Testing: "x86_64-unknown-linux-gnu" - ext["target"] = findProperty("target") as? String ?: throw AssertionError("Invalid target") - ext["platform"] = getPlatform(ext["target"].toString()) - - val generatePom: MavenPom.() -> Unit = { - packaging = "jar" - description.set("Rust implementation of the JDA-NAS interface") - url.set("https://github.com/MinnDevelopment/udpqueue.rs") - scm { - url.set("https://github.com/MinnDevelopment/udpqueue.rs") - connection.set("scm:git:git://github.com/MinnDevelopment/udpqueue.rs") - developerConnection.set("scm:git:ssh:git@github.com:MinnDevelopment/udpqueue.rs") - } - licenses { - license { - name.set("The Apache Software License, Version 2.0") - url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") - distribution.set("repo") - } - } - developers { - developer { - id.set("Minn") - name.set("Florian Spieß") - email.set("business@minn.dev") - } - } - } - - ext["generatePom"] = generatePom - - val rebuild = tasks.create("rebuild") { - group = "build" - afterEvaluate { - dependsOn(tasks["build"], tasks["clean"]) - tasks["build"].dependsOn(tasks.withType()) - tasks.forEach { - if (it.name != "clean") - mustRunAfter(tasks["clean"]) - } - } - } - - tasks.withType { - enabled = enablePublishing - mustRunAfter(rebuild) - dependsOn(rebuild) - } + version = "0.2.10" } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..2a93d71 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,32 @@ +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + id("java-gradle-plugin") +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(gradleApi()) + implementation("org.jreleaser:jreleaser-gradle-plugin:1.21.0") +} + +kotlin { + jvmToolchain(17) +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +tasks.withType(KotlinCompile::class).configureEach { + jvmTargetValidationMode.set(JvmTargetValidationMode.IGNORE) +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/publishing-environment.gradle.kts b/buildSrc/src/main/kotlin/publishing-environment.gradle.kts new file mode 100644 index 0000000..2671ba2 --- /dev/null +++ b/buildSrc/src/main/kotlin/publishing-environment.gradle.kts @@ -0,0 +1,103 @@ +import org.gradle.kotlin.dsl.withType +import org.jreleaser.gradle.plugin.JReleaserExtension +import org.jreleaser.gradle.plugin.tasks.AbstractJReleaserTask +import org.jreleaser.model.Active +import udpqueue.gradle.generatePom +import udpqueue.gradle.stagingDirectory + +plugins { + `java-library` + `maven-publish` + + id("org.jreleaser") +} + + +interface PublishingEnvironmentExtension { + val moduleName: Property +} + +val publishingEnvironment = project.extensions.create("publishingEnvironment") +val sourceSets = the() + +val javadoc: Javadoc by tasks +val javadocJar by tasks.registering(Jar::class) { + group = "build" + dependsOn(javadoc) + from(javadoc.destinationDir) + archiveClassifier.set("javadoc") +} + +val sourcesJar by tasks.registering(Jar::class) { + group = "build" + from(sourceSets["main"].java) + archiveClassifier.set("sources") +} + +configure { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + + afterEvaluate { + base.archivesName = publishingEnvironment.moduleName + } +} + +tasks.withType().configureEach { + options.encoding = "UTF-8" + options.release = 8 +} + +configure { + publications { + register("Release") { + from(components["java"]) + + afterEvaluate { + artifactId = publishingEnvironment.moduleName.get() + pom.name.set(artifactId) + } + + groupId = group.toString() + version = version.toString() + + artifact(tasks.named("javadocJar")) + artifact(tasks.named("sourcesJar")) + + pom.generatePom() + } + } + + repositories.maven { + url = stagingDirectory.asFile.toURI() + } +} + +configure { + release { + github { + enabled = false + } + } + + signing { + active = Active.RELEASE + armored = true + } + + deploy { + maven { + mavenCentral { + register("sonatype") { + active = Active.RELEASE + url = "https://central.sonatype.com/api/v1/publisher" + stagingRepository(stagingDirectory.asFile.relativeTo(projectDir).path) + } + } + } + } +} + +tasks.withType().configureEach { + mustRunAfter(tasks.named("publish")) +} diff --git a/buildSrc/src/main/kotlin/udpqueue/gradle/platform.kt b/buildSrc/src/main/kotlin/udpqueue/gradle/platform.kt new file mode 100644 index 0000000..1ae94d6 --- /dev/null +++ b/buildSrc/src/main/kotlin/udpqueue/gradle/platform.kt @@ -0,0 +1,28 @@ +package udpqueue.gradle + +import org.gradle.api.Project + +// See https://github.com/sedmelluq/lavaplayer/blob/master/common/src/main/java/com/sedmelluq/lava/common/natives/architecture/DefaultArchitectureTypes.java +// identifier is the suffix used after the system name +fun Project.getPlatform(triplet: String = targetPlatform) = when { + triplet.startsWith("x86_64") && "linux" in triplet && "musl" in triplet -> "linux-musl-x86-64" + triplet.startsWith("i686") && "linux" in triplet && "musl" in triplet -> "linux-musl-x86" + triplet.startsWith("aarch64") && "linux" in triplet && "musl" in triplet -> "linux-musl-aarch64" + triplet.startsWith("arm") && "linux" in triplet && "musl" in triplet -> "linux-musl-arm" + + triplet.startsWith("x86_64") && "linux" in triplet -> "linux-x86-64" + triplet.startsWith("i686") && "linux" in triplet -> "linux-x86" + triplet.startsWith("aarch64") && "linux" in triplet -> "linux-aarch64" + triplet.startsWith("arm") && "linux" in triplet -> "linux-arm" + + triplet.startsWith("x86_64") && "windows" in triplet -> "win-x86-64" + triplet.startsWith("i686") && "windows" in triplet -> "win-x86" + triplet.startsWith("aarch64") && "windows" in triplet -> "win-aarch64" + triplet.startsWith("arm") && "windows" in triplet -> "win-arm" + + "darwin" in triplet -> "darwin" + + else -> throw IllegalArgumentException("Unknown platform: $triplet") +} + +val Project.targetPlatform: String get() = findProperty("target") as? String ?: "x86_64-unknown-linux-gnu" \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/udpqueue/gradle/publishing.kt b/buildSrc/src/main/kotlin/udpqueue/gradle/publishing.kt new file mode 100644 index 0000000..71df298 --- /dev/null +++ b/buildSrc/src/main/kotlin/udpqueue/gradle/publishing.kt @@ -0,0 +1,32 @@ +package udpqueue.gradle + +import org.gradle.api.Project +import org.gradle.api.file.Directory +import org.gradle.api.publish.maven.MavenPom + +fun MavenPom.generatePom() { + packaging = "jar" + description.set("Rust implementation of the JDA-NAS interface") + url.set("https://github.com/MinnDevelopment/udpqueue.rs") + scm { + url.set("https://github.com/MinnDevelopment/udpqueue.rs") + connection.set("scm:git:git://github.com/MinnDevelopment/udpqueue.rs") + developerConnection.set("scm:git:ssh:git@github.com:MinnDevelopment/udpqueue.rs") + } + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + developers { + developer { + id.set("Minn") + name.set("Florian Spieß") + email.set("business@minn.dev") + } + } +} + +val Project.stagingDirectory: Directory get() = layout.buildDirectory.dir("staging-deploy").get() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b8c28d8..9cf65cf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/native/Cargo.lock b/native/Cargo.lock index eca0a13..cbf6a24 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "bytes" @@ -32,16 +32,18 @@ dependencies = [ [[package]] name = "jni" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", "thiserror", "walkdir", + "windows-sys", ] [[package]] @@ -177,3 +179,69 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" diff --git a/native/Cargo.toml b/native/Cargo.toml index 0bec500..3a9ec73 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "udpqueue" version = "0.2.7" -edition = "2021" +edition = "2024" [dependencies] -jni = "0.19" +jni = "0.21" [lib] -crate_type = ["cdylib"] +crate-type = ["cdylib"] [profile.release] opt-level = 3 lto = true strip = "debuginfo" -panic = "abort" \ No newline at end of file +panic = "abort" diff --git a/native/build.gradle.kts b/native/build.gradle.kts index 5e8b213..1284415 100644 --- a/native/build.gradle.kts +++ b/native/build.gradle.kts @@ -1,89 +1,51 @@ -import java.net.URL -import javax.net.ssl.HttpsURLConnection +import udpqueue.gradle.getPlatform +import udpqueue.gradle.targetPlatform plugins { - `java-library` - signing - `maven-publish` + `publishing-environment` } -dependencies { - api(project(":api")) - // Explicit dependency to avoid having to republish api each time -// api("club.minnced:udpqueue-api:0.2.8") +publishingEnvironment { + moduleName = "udpqueue-native-${getPlatform()}" } -val processResources: Copy by tasks -val target = ext["target"]?.toString() ?: "" -val platform = ext["platform"] as String -val artifactName = "udpqueue-native-$platform" - -// This checks if the version already exists on maven central, and skips if a successful response is returned. -val shouldPublish by lazy { - val conn = URL("https://repo1.maven.org/maven2/club/minnced/$artifactName/$version/").openConnection() as HttpsURLConnection - conn.requestMethod = "GET" - conn.connect() - - conn.responseCode > 400 +dependencies { + api(project(":api")) } -tasks.withType { - archiveBaseName.set(artifactName) +val cargoBuild by tasks.registering(Exec::class) { + commandLine( + "cargo", "build", "--release", "--target", targetPlatform + ) } -tasks.create("moveResources") { +val moveResources by tasks.registering(Copy::class) { group = "build" - from("target/$target/release/") + dependsOn(cargoBuild) + + from("target/$targetPlatform/release/") include { it.name == "release" || it.name.endsWith(".so") || it.name.endsWith(".dll") || it.name.endsWith(".dylib") } - into("src/main/resources/natives/$platform") - - processResources.dependsOn(this) + into("src/main/resources/natives/${getPlatform()}") } -tasks.create("cleanNatives") { +val cleanNatives by tasks.registering(Delete::class) { group = "build" delete(fileTree("src/main/resources/natives")) - tasks["clean"].dependsOn(this) -} - -processResources.include { - it.isDirectory || it.file.parentFile.name == platform } - -publishing.publications { - create("Release") { - from(components["java"]) - - groupId = group.toString() - artifactId = artifactName - version = version.toString() - - pom.apply(ext["generatePom"] as MavenPom.() -> Unit) - pom.name.set(artifactName) - } +tasks.named("clean").configure { + dependsOn(cleanNatives) } -val signingKey: String? by project -val signingPassword: String? by project +tasks.processResources { + dependsOn(moveResources) -if (signingKey != null) { - signing { - useInMemoryPgpKeys(signingKey, signingPassword ?: "") - val publications = publishing.publications.toTypedArray() - sign(*publications) + include { + it.isDirectory || it.file.parentFile.name == getPlatform() } -} else { - println("Could not find signingKey") -} - -// Only run publishing tasks if the version doesn't already exist - -tasks.withType { - enabled = enabled && shouldPublish } \ No newline at end of file diff --git a/native/src/lib.rs b/native/src/lib.rs index eaf576d..b5d7a75 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -1,6 +1,7 @@ -use jni::objects::{JClass, JString, JValue}; -use jni::sys::{jboolean, jint, jlong, jobject}; +use core::slice; use jni::JNIEnv; +use jni::objects::{JByteBuffer, JClass, JObject, JString, JValueOwned}; +use jni::sys::{jboolean, jint, jlong}; use sender::{Manager, Sockets}; use std::net::{SocketAddr, UdpSocket}; use std::time::Duration; @@ -13,38 +14,47 @@ fn get_handle(instance: jlong) -> &'static Manager { } #[inline(always)] -fn parse_address( - env: &JNIEnv, - string: JString, +fn parse_address<'local>( + env: &mut JNIEnv<'local>, + string: JString<'local>, port: jint, ) -> Result> { Ok(SocketAddr::new( - env.get_string(string)?.to_str()?.parse()?, + env.get_string(&string)?.to_str()?.parse()?, port as u16, )) } #[inline(always)] -fn copy_data(env: &JNIEnv, buffer: jobject, length: jint) -> Result, jni::errors::Error> { +fn copy_data<'local>( + env: &JNIEnv<'local>, + buffer: JObject<'local>, + length: jint, +) -> Result, jni::errors::Error> { let length = length as usize; - let slice = env.get_direct_buffer_address(buffer.into())?; - Ok(Box::from(&slice[..length])) + let slice = unsafe { + slice::from_raw_parts_mut( + env.get_direct_buffer_address(&JByteBuffer::from(buffer))?, + length, + ) + }; + Ok(Box::from(slice)) } /// Wrapper for System.getProperty(String): String? #[inline] -fn get_property(env: &JNIEnv, name: &str) -> Option { +fn get_property(env: &mut JNIEnv, name: &str) -> Option { let class = env.find_class("java/lang/System").ok()?; - let args = JValue::Object(env.new_string(name).ok()?.into()); + let args = JValueOwned::Object(env.new_string(name).ok()?.into()); match env.call_static_method( class, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;", - &[args], + &[args.borrow()], ) { - Ok(JValue::Object(obj)) => Some( - env.get_string(JString::from(obj)) + Ok(JValueOwned::Object(obj)) => Some( + env.get_string(&JString::from(obj)) .ok()? .to_str() .ok()? @@ -57,17 +67,19 @@ fn get_property(env: &JNIEnv, name: &str) -> Option { /// Whether to log send errors, default true /// Configured using -Dudpqueue.log_errors= #[inline] -fn is_log_errors(env: &JNIEnv) -> bool { +fn is_log_errors(env: &mut JNIEnv) -> bool { get_property(env, "udpqueue.log_errors") .map(|s| s == "true") .unwrap_or(true) } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_create( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_create< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, queue_buffer_capacity: jint, packet_interval: jlong, ) -> jlong { @@ -79,11 +91,13 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud } } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_destroy( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_destroy< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, ) { if instance == 0 { @@ -101,11 +115,13 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud } } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_getRemainingCapacity( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_getRemainingCapacity< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, key: jlong, ) -> jint { @@ -117,14 +133,14 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud } #[allow(unused, clippy::too_many_arguments)] -fn queue_packet( - env: JNIEnv, - me: jobject, +fn queue_packet<'local>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, key: jlong, - address_string: JString, + address_string: JString<'local>, port: jint, - data_buffer: jobject, + data_buffer: JObject<'local>, data_length: jint, socket: Option, ) -> bool { @@ -140,7 +156,7 @@ fn queue_packet( } }; - let address = match parse_address(&env, address_string, port) { + let address = match parse_address(&mut env, address_string, port) { Ok(a) => a, Err(e) => { eprintln!("Invalid socket address provided: {e}"); @@ -151,16 +167,18 @@ fn queue_packet( get_handle(instance).enqueue_packet(key, address, data, socket) } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_queuePacket( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_queuePacket< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, key: jlong, - address_string: JString, + address_string: JString<'local>, port: jint, - data_buffer: jobject, + data_buffer: JObject<'local>, data_length: jint, ) -> jboolean { queue_packet( @@ -176,11 +194,13 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud ) as jboolean } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_deleteQueue( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_deleteQueue< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, key: jlong, ) -> jboolean { @@ -191,24 +211,28 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud get_handle(instance).delete_queue(key) as jboolean } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_process( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_process< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, ) { - let log_errors = is_log_errors(&env); + let log_errors = is_log_errors(&mut env); if instance != 0 { get_handle(instance).process(log_errors); } } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_pauseDemo( - env: JNIEnv, - me: JClass, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_pauseDemo< + 'local, +>( + mut env: JNIEnv<'local>, + me: JClass<'local>, length: jint, ) { // todo!(); @@ -217,11 +241,13 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud // Explicit socket handling requires platform-specific conversions between file descriptors / handles to UdpSocket instances. // Note: I haven't tested any of this since I have no usable java interface at the moment. -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_processWithSocket( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_processWithSocket< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, socketv4: jlong, socketv6: jlong, @@ -245,7 +271,7 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud let sockets = Sockets { v4, v6 }; - let log_errors = is_log_errors(&env); + let log_errors = is_log_errors(&mut env); get_handle(instance).process_with_sockets(log_errors, &sockets); // This gives up ownership of the file descriptors back to the caller, allowing them to stay open @@ -257,16 +283,18 @@ pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_Ud } } -#[no_mangle] +#[unsafe(no_mangle)] #[allow(non_snake_case, unused)] -pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_queuePacketWithSocket( - env: JNIEnv, - me: jobject, +pub extern "system" fn Java_com_sedmelluq_discord_lavaplayer_udpqueue_natives_UdpQueueManagerLibrary_queuePacketWithSocket< + 'local, +>( + mut env: JNIEnv<'local>, + me: JObject<'local>, instance: jlong, key: jlong, - address_string: JString, + address_string: JString<'local>, port: jint, - data_buffer: jobject, + data_buffer: JObject<'local>, data_length: jint, socket_handle: jlong, ) -> jboolean { @@ -319,7 +347,7 @@ mod unix_specific { #[inline(always)] pub(crate) unsafe fn to_socket(handle: jlong) -> UdpSocket { - UdpSocket::from_raw_fd(handle as RawFd) + unsafe { UdpSocket::from_raw_fd(handle as RawFd) } } #[inline(always)] @@ -335,7 +363,7 @@ mod windows_specific { #[inline(always)] pub(crate) unsafe fn to_socket(handle: jlong) -> UdpSocket { - UdpSocket::from_raw_socket(handle as RawSocket) + unsafe { UdpSocket::from_raw_socket(handle as RawSocket) } } #[inline(always)] diff --git a/native/src/sender.rs b/native/src/sender.rs index 8cdd337..2812e4b 100644 --- a/native/src/sender.rs +++ b/native/src/sender.rs @@ -179,7 +179,7 @@ impl Manager { } #[inline(always)] - fn state(&self) -> MutexGuard { + fn state<'a>(&'a self) -> MutexGuard<'a, QueueState> { self.state.lock().unwrap() }