Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Follow 'em! #45

Merged
merged 88 commits into from
Feb 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
d708314
Revert "Revert "[UPDATE] add abstracted resource manager""
kory33 Jan 18, 2020
a2c764d
[update] コメントを追加しメソッド名を改善する
kory33 Jan 18, 2020
f0f86c1
[update] -language:higherKindsをscalacオプションに追加する
kory33 Jan 19, 2020
4726ce3
[update] ResourceScopeのインターフェースを改善する
kory33 Jan 22, 2020
3cbfb54
[update] ResourceScopeのメソッド宣言順を整理する
kory33 Jan 22, 2020
d593f41
[add] BukkitResourcesを追記する
kory33 Jan 22, 2020
84087a2
[update] プラグインでのエンティティ管理をすべてResourceScopeで行うようにする
kory33 Jan 22, 2020
36e646e
[update] わかりづらい箇所にコメントを追加する
kory33 Jan 22, 2020
f994b48
[fix] 参照ミスを修正する
kory33 Jan 22, 2020
c74ddd0
[update] ResourceScopeに詳細なdocを追加する
kory33 Jan 22, 2020
70f4d4e
[update] SingleResourceScope を実装する
kory33 Jan 24, 2020
6058539
[update] ドキュメントを追加する
kory33 Jan 24, 2020
b498d96
[update] SingleResourceScopeでConcurrent[F]ではなくAsync[F]を要求する
kory33 Jan 24, 2020
fa40708
[update] ドキュメントを追記する
kory33 Jan 24, 2020
15b5f90
[update] Concurrentの要求をAsyncに弱める
kory33 Jan 24, 2020
a9f7e33
[update] OptionTExtraに関数を実装する
kory33 Jan 25, 2020
d2df87d
[update] trackedForSomeのシグネチャを改善する
kory33 Jan 25, 2020
3a5e973
[update] MagicEffectでSingleResourceScopeを使う
kory33 Jan 25, 2020
cb012d8
[move] unwrapOptionTResourceをResourceExtraに移動する
kory33 Jan 25, 2020
2e6f025
[fix] magicEffectEntityScopeの解放をonDisableに追記する
kory33 Jan 25, 2020
6656e5a
[fix] ドキュメントのミスを修正する
kory33 Jan 25, 2020
b445f94
[clean] ドキュメントを追加しimportを整理する
kory33 Jan 25, 2020
4a0cc2e
[update] BlizzardTaskの分岐を減らす
kory33 Jan 30, 2020
be2a99e
[update] managedBlocks -= bを外に括りだす
kory33 Jan 30, 2020
705441a
[fix] 引数の渡し忘れを修正する
kory33 Jan 30, 2020
2fe638f
[fix] 引数の渡し忘れを修正する
kory33 Jan 30, 2020
bdce4e6
[update] managedBlockScopeをmanagedBlocksに差し戻す
kory33 Jan 30, 2020
10e2da5
[update] 未使用であったunwrapOptionTKを削除する
kory33 Jan 30, 2020
5f35697
[update] OptionTExtraのテストを追加する
kory33 Jan 30, 2020
7a73d5b
[update] ResourceExtraにdocを追加する
kory33 Jan 30, 2020
0916670
[update] ResourceExtraのテストを追加する
kory33 Jan 30, 2020
533856f
[clean] ResourceExtraSpecのコードを構造化する
kory33 Jan 30, 2020
80a1770
[update] ResourceScopeの引数型を逆にする
kory33 Jan 30, 2020
bbecdd6
[update] ResourceScopeのテストを書き、デフォルト実装を修正する
kory33 Feb 1, 2020
5b5d412
[update] cats+cats-effectのバージョンを上げる
kory33 Feb 1, 2020
92b246b
[update] SingleResourceScopeのテストを追加し、実装をいくらか修正する
kory33 Feb 1, 2020
b0d8518
[update] 運営チームからのガチャ券配布のUI側でクールダウンを制御するようにする
kory33 Feb 2, 2020
c7335eb
[update] 運営ガチャ券配布処理のDBアクセスを無くす
kory33 Feb 2, 2020
f52b157
[fix] ガチャ券配布の上限計算を修正する
kory33 Feb 2, 2020
ed024d3
[update] 整地報酬ガチャ券の処理も同期化し、コードスタイルを整える
kory33 Feb 2, 2020
2f4e571
Revert "[update] 運営ガチャ券配布処理のDBアクセスを無くす"
kory33 Feb 2, 2020
2ef8503
[clean] 運営配布ガチャ券ボタンの副作用部分の整理+コメント付与
kory33 Feb 2, 2020
a901b17
[update] givePlayerBugの処理を簡略化する
kory33 Feb 2, 2020
ecdd90f
Merge branch 'develop' into resource-management
kory33 Feb 2, 2020
ba883ae
[fix] LimitedLoginEventでのパーシングを直す
kory33 Feb 2, 2020
7f95683
[UPDATE] rename local vars
KisaragiEffective Feb 4, 2020
d60f38b
[UPDATE] rename static vars
KisaragiEffective Feb 4, 2020
9b32782
[UPDATE] reimplement logic
KisaragiEffective Feb 4, 2020
668c015
[UPDATE] replace with utility function
KisaragiEffective Feb 4, 2020
6f4bf88
[UPDATE] replace with map
KisaragiEffective Feb 4, 2020
628ff5b
[UPDATE] oops
KisaragiEffective Feb 4, 2020
2414944
[UPDATE] solve lint
KisaragiEffective Feb 4, 2020
463f76f
[UPDATE] format
KisaragiEffective Feb 4, 2020
1536ce3
[update] BukkitSyncExecutionContextをBukkitSyncIOShiftで置き換える
kory33 Feb 4, 2020
19a093d
Update src/main/scala/com/github/unchama/seichiassist/data/MenuInvent…
KisaragiEffective Feb 4, 2020
ed3d968
[update] ResourceScopeのインターフェースを変更する
kory33 Feb 5, 2020
a9b5940
[delete] ResourceExtraを削除する
kory33 Feb 5, 2020
c65947d
[update] ResourceScopeのキャンセルの意味論を明確にする
kory33 Feb 7, 2020
e4276e4
[fix] releaseAllをdeferする
kory33 Feb 7, 2020
67252e2
[update] テスト条件を厳しくする
kory33 Feb 7, 2020
59ca461
[update] コメントを追加する
kory33 Feb 7, 2020
1737b03
[update] 開放 -> 解放
kory33 Feb 7, 2020
8623305
[update] コメントを加筆・修正する
kory33 Feb 7, 2020
fad68e0
[update] withSelfCancellation のロジックを抜き出し、個別テストを書く
kory33 Feb 7, 2020
8f0a982
[update] trackedHandlersをResourceScopeのプリミティブとする
kory33 Feb 8, 2020
35bb1a3
[update] コメントを改善する
kory33 Feb 8, 2020
9495ac7
Merge pull request #415 from GiganticMinecraft/resource-management
kory33 Feb 8, 2020
5db6be8
Merge pull request #429 from GiganticMinecraft/feature/reimplement-me…
kory33 Feb 8, 2020
020e264
[update] runBreakEffectをIOにする
kory33 Feb 8, 2020
52730d5
[update] managedBlocksをmanagedBlockChunkScopeに置き換え、諸々をIO化する
kory33 Feb 8, 2020
54fe77c
[delete] 未使用のRoundedTaskを削除する
kory33 Feb 8, 2020
55d4a1b
[fix] 型アノテーションを追加しコンパイルエラーを修正する
kory33 Feb 8, 2020
b22affa
[update] 自己言及的なvalをlazyにする
kory33 Feb 8, 2020
e435cc2
[update] 自己言及的なvalをlazyにする
kory33 Feb 8, 2020
d11b7cd
[fix] DIG100の型を広くする
kory33 Feb 8, 2020
32c59b3
Revert "[fix] DIG100の型を広くする"
kory33 Feb 9, 2020
03b1d34
[fix] DIG100の型を広くし、引数型を弱める
kory33 Feb 9, 2020
b68b696
[update] Metadata経由でなく資源スコープで管理判定を行うようにする
kory33 Feb 9, 2020
68b5259
[fix] スキル使用時に破壊したブロックを直接ドロップしないようにする
kory33 Feb 9, 2020
896ab5d
[fix] エフェクトの分岐を修正する
kory33 Feb 9, 2020
1ce3569
[update] 単爆エフェクトの再生を資源スコープ内で行う
kory33 Feb 9, 2020
98b9687
[update] 実験結果をコメントに含める
kory33 Feb 9, 2020
55c7d49
[update] ドロップ品計算にBlock.getDropsを使う
kory33 Feb 9, 2020
b1d36a5
Update ActiveSkillData.java
KisaragiEffective Feb 10, 2020
8a699a4
Update Skills.java
KisaragiEffective Feb 10, 2020
3d8b7af
Update src/main/scala/com/github/unchama/seichiassist/data/ActiveSkil…
KisaragiEffective Feb 10, 2020
849007a
Merge pull request #433 from GiganticMinecraft/KisaragiEffective-patch-1
kory33 Feb 10, 2020
1c43d38
Merge pull request #432 from GiganticMinecraft/fix/430
kory33 Feb 10, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,20 @@ val providedDependencies = Seq(
).map(_ % "provided")

val testDependencies = Seq(
"org.scalatest" %% "scalatest" % "3.1.0"
"org.scalamock" %% "scalamock" % "4.4.0",
"org.scalatest" %% "scalatest" % "3.1.0",
).map(_ % "test")

val dependenciesToEmbed = Seq(
"org.flywaydb" % "flyway-core" % "5.2.4",
"org.typelevel" %% "cats-core" % "2.0.0",
"org.typelevel" %% "cats-effect" % "2.0.0",
"org.typelevel" %% "cats-core" % "2.1.0",
"org.typelevel" %% "cats-effect" % "2.1.0",
"eu.timepit" %% "refined" % "0.9.10",
"com.beachape" %% "enumeratum" % "1.5.13"
)

addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.11.0" cross CrossVersion.full)

// localDependenciesはprovidedとして扱い、jarに埋め込まない
assemblyExcludedJars in assembly := {
(fullClasspath in assembly).value
Expand Down Expand Up @@ -87,6 +90,7 @@ lazy val root = (project in file("."))
scalacOptions ++= Seq(
"-encoding", "utf8",
"-unchecked",
"-language:higherKinds",
"-deprecation",
"-Ypatmat-exhaust-depth", "320",
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import scala.collection.mutable
class PlayerInventoryListener extends Listener {
val playerMap: mutable.HashMap[UUID, PlayerData] = BuildAssist.playermap

import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.sync
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.syncShift
import com.github.unchama.targetedeffect._
import com.github.unchama.util.syntax.Nullability.NullabilityExtensionReceiver

Expand Down Expand Up @@ -64,7 +64,7 @@ class PlayerInventoryListener extends Listener {
*/
if (itemstackcurrent.getType == Material.SKULL_ITEM) {
//ホームメニューへ帰還
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, sync}
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, syncShift}

seichiassist.unsafe.runAsyncTargetedEffect(player)(
sequentialEffect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ object PlayerLeftClickListener extends Listener {
if (!hasStickOnMainHand || !actionWasOnMainHand) return
}

import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, sync}
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, syncShift}

seichiassist.unsafe.runAsyncTargetedEffect(player)(
sequentialEffect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import org.bukkit.{Material, Sound}

object BlockPlacementSkillMenu extends Menu {

import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, sync}
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, syncShift}
import com.github.unchama.targetedeffect._
import com.github.unchama.targetedeffect.syntax._
import menuinventory.syntax._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import org.bukkit.{Material, Sound}
object BuildMainMenu extends Menu {

import com.github.unchama.menuinventory.slot.button.RecomputedButton
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, sync}
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts.{layoutPreparationContext, syncShift}
import com.github.unchama.targetedeffect._
import com.github.unchama.targetedeffect.player.PlayerEffects._
import com.github.unchama.targetedeffect.syntax._
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.github.unchama.concurrent

import cats.effect.{ContextShift, IO}
import org.bukkit.Bukkit
import org.bukkit.plugin.java.JavaPlugin

import scala.concurrent.ExecutionContext

/**
* Bukkitのメインスレッドへ実行をシフトするような `ContextShift[IO]` の実装。
*
* Bukkitのスケジューラにタスクを投げるような `ExecutionContext` から
* `ContextShift[IO]` を作ることはできるが、この実装だと一つ問題がある。
* 具体的には、`IO` のキャンセルがタスクの実行がキューされるまでしか可能でなく、
* 一度キューされたら実行が始まるのを待ち続けないといけない点にある。
* cats-effectの言葉で言えば、キャンセルが可能な非同期境界がキュー以前までしか無い。
*
* この問題点はBukkitと組み合わせると次の不都合がある。
* 例えば、Bukkitサーバーが停まるまでに必ず終了(正常終了かキャンセル)
* されなければならないプログラムがあったとする。
* また、このプログラムは途中で同期スレッドに実行をシフトするロジックを含むとする。
*
* サーバーの停止時、 `onDisable` にてこのプログラムの `Fiber` をcancelする必要がある。
* しかし、 `onDisable` が呼ばれた後はサーバーティックはもう来ない。
* よって、もし `onDisable` が同期スレッドへのシフトがキューされた後、
* かつ同期スレッドでのシフト後の処理が走り出す前に呼び出されてしまった場合、
* プログラムをキャンセルする手立てがない。デッドロックのような状況が発生し、
* リソースの安全な解放ができない可能性がある。
*
* `BukkitSyncIOShift` はこの問題を解決するため、
* shiftの実行時点でキャンセルが入ったときはBukkitのスケジューラ上で
* キューしたタスクもろともキャンセルするような実装になっている。
*/
sealed trait BukkitSyncIOShift extends ContextShift[IO]

object BukkitSyncIOShift {
def apply()(implicit hostPlugin: JavaPlugin): BukkitSyncIOShift =
new BukkitSyncIOShift {
override def shift: IO[Unit] =
IO.cancelable { cb =>
val run = new Runnable { def run(): Unit = cb(Right(())) }
val scheduledTask = Bukkit.getScheduler.runTask(hostPlugin, run)

IO(scheduledTask.cancel())
}

override def evalOn[A](ec: ExecutionContext)(fa: IO[A]): IO[A] =
IO.shift(ec).bracket(_ => fa)(_ => shift)
}
}
4 changes: 2 additions & 2 deletions src/main/scala/com/github/unchama/concurrent/Execution.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ object Execution {
* 与えられた`IO`をサーバーメインスレッドで実行するように予約する。
* @return
*/
def onServerMainThread(program: IO[Any])(implicit context: BukkitSyncExecutionContext): IO[Unit] = {
def onServerMainThread(program: IO[Any])(implicit sync: BukkitSyncIOShift): IO[Unit] = {
val asyncProgram = for {
_ <- IO.shift(context)
_ <- sync.shift
_ <- program
} yield ()

Expand Down
12 changes: 12 additions & 0 deletions src/main/scala/com/github/unchama/generic/OptionTExtra.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.github.unchama.generic

import cats.data.OptionT
import cats.{Applicative, ~>}

object OptionTExtra {
/**
* `failCondition` が true のとき失敗するような計算を返す。
*/
def failIf[F[_]: Applicative](failCondition: Boolean): OptionT[F, Unit] =
OptionT.fromOption[F](Option.unless(failCondition)(()))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.github.unchama.generic.effect

import cats.effect.concurrent.Deferred
import cats.effect.{CancelToken, Concurrent}

object ConcurrentExtra {
import cats.implicits._

/**
* `f` を並行的に開始し、 `f` の計算をキャンセルする計算を`f`に渡してから結果をawaitする計算を返す。
*
* `f` 内で渡された `CancelToken[F]` を実行した際の動作は未定義となる。
* 実際、`f` 内のキャンセルはそれ自身の終了をブロックしながらawaitするため、
* ハングすることが予想される。
*/
def withSelfCancellation[F[_]: Concurrent, A](f: CancelToken[F] => F[A]): F[A] =
for {
// [start `awaitToken >>= f`]--
// | |
// [fill promise] |
// |--->[await promise completion]
// | |
// | [`f` yielding a]
// | |
// [await completion]<------
// |
// yield a <----

tokenPromise <- Deferred[F, CancelToken[F]]

fiber <- Concurrent[F].start(tokenPromise.get.flatMap(f))

_ <- tokenPromise.complete(fiber.cancel)

a <- fiber.join
} yield a
}
Loading