puniverse / quasar

Fibers, Channels and Actors for the JVM
http://docs.paralleluniverse.co/quasar/
Other
4.56k stars 575 forks source link

Instrumentation problem at Strand.park (0.7.8 SNAPSHOT, Kotlin 1.1) #254

Closed fab1an closed 7 years ago

fab1an commented 7 years ago

Hi, I'm using Kotlin 1.1 and I'm getting a weird message. Anything I can do about this?

Caused by: co.paralleluniverse.fibers.VerifyInstrumentationException: Uninstrumented whole methods ('**') or single calls ('!!') detected: 
    at co.paralleluniverse.common.util.ExtendedStackTrace.here() (ExtendedStackTrace.java:44 bci: 8)
    at co.paralleluniverse.fibers.Fiber.checkInstrumentation() (Fiber.java:1668 bci: 0)
    at co.paralleluniverse.fibers.Fiber.verifySuspend(co.paralleluniverse.fibers.Fiber) (Fiber.java:1641 bci: 6)
    at co.paralleluniverse.fibers.Fiber.verifySuspend() (Fiber.java:1636 bci: 3)
    at co.paralleluniverse.fibers.Fiber.park(java.lang.Object,co.paralleluniverse.fibers.Fiber$ParkAction,long,java.util.concurrent.TimeUnit) (Fiber.java:620 bci: 0)
    at co.paralleluniverse.fibers.Fiber.park(java.lang.Object) (Fiber.java:632 bci: 4)
    at co.paralleluniverse.strands.Strand.park(java.lang.Object) (Strand.java:536 bci: 78) !! (instrumented suspendable calls at: BCIs [54], lines [536])
    at co.paralleluniverse.strands.channels.TransferChannel.awaitMatch(co.paralleluniverse.strands.channels.TransferChannel$Node,co.paralleluniverse.strands.channels.TransferChannel$Node,java.lang.Object,boolean,long) (TransferChannel.java:734 bci: 920)
    at co.paralleluniverse.strands.channels.TransferChannel.xfer1(java.lang.Object,boolean,int,long) (TransferChannel.java:521 bci: 436)
    at co.paralleluniverse.strands.channels.TransferChannel.receive() (TransferChannel.java:185 bci: 129)
    at at.fab1an.util.QuasarUtilKt$fiberSendTo$1.invoke() (QuasarUtil.kt:61 bci: 220)
    at at.fab1an.util.QuasarUtilKt$fiberSendTo$1.invoke() (QuasarUtil.kt:65535 bci: 1) (optimized)
    at co.paralleluniverse.kotlin.KotlinKt$fiber$sc$1.invoke() (Kotlin.kt:27 bci: 76)
    at co.paralleluniverse.kotlin.KotlinKt$fiber$sc$1.run() (Kotlin.kt:65535 bci: 1) (optimized)
    at co.paralleluniverse.fibers.Fiber.run() (Fiber.java:1072 bci: 11)
    at co.paralleluniverse.fibers.Fiber.run1() (Fiber.java:1067 bci: 1)
    at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1731)
    at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1672)
    at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1668)
    at co.paralleluniverse.fibers.Fiber.verifySuspend(Fiber.java:1641)
    at co.paralleluniverse.fibers.Fiber.verifySuspend(Fiber.java:1636)
    at co.paralleluniverse.fibers.Fiber.park(Fiber.java:620)
    at co.paralleluniverse.fibers.Fiber.park(Fiber.java:632)
    at co.paralleluniverse.strands.Strand.park(Strand.java:536)
    at co.paralleluniverse.strands.channels.TransferChannel.awaitMatch(TransferChannel.java:734)
    at co.paralleluniverse.strands.channels.TransferChannel.xfer1(TransferChannel.java:521)
    at co.paralleluniverse.strands.channels.TransferChannel.receive(TransferChannel.java:185)
    at at.fab1an.util.QuasarUtilKt$fiberSendTo$1.invoke(QuasarUtil.kt:61)
    at at.fab1an.util.QuasarUtilKt$fiberSendTo$1.invoke(QuasarUtil.kt:65535)
    at co.paralleluniverse.kotlin.KotlinKt$fiber$sc$1.invoke(Kotlin.kt:27)
    at co.paralleluniverse.kotlin.KotlinKt$fiber$sc$1.run(Kotlin.kt:65535)
    at co.paralleluniverse.fibers.Fiber.run(Fiber.java:1072)
    at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1067)
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:767)
    at co.paralleluniverse.fibers.FiberForkJoinScheduler$FiberForkJoinTask.exec1(FiberForkJoinScheduler.java:266)
    at co.paralleluniverse.concurrent.forkjoin.ParkableForkJoinTask.doExec(ParkableForkJoinTask.java:117)
    at co.paralleluniverse.concurrent.forkjoin.ParkableForkJoinTask.exec(ParkableForkJoinTask.java:74)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
fab1an commented 7 years ago

Reduced to bare minimum Testcase:

WARNING: Uninstrumented whole methods ('**') or single calls ('!!') detected: 
    at co.paralleluniverse.common.util.ExtendedStackTrace.here() (ExtendedStackTrace.java:44 bci: 8)
    at co.paralleluniverse.fibers.Fiber.checkInstrumentation() (Fiber.java:1669 bci: 0)
    at co.paralleluniverse.fibers.Fiber.verifySuspend(co.paralleluniverse.fibers.Fiber) (Fiber.java:1642 bci: 6)
    at co.paralleluniverse.fibers.Fiber.verifySuspend() (Fiber.java:1637 bci: 3)
    at co.paralleluniverse.fibers.Fiber.park(java.lang.Object,co.paralleluniverse.fibers.Fiber$ParkAction,long,java.util.concurrent.TimeUnit) (Fiber.java:621 bci: 0)
    at co.paralleluniverse.fibers.Fiber.park(java.lang.Object) (Fiber.java:633 bci: 4)
    at co.paralleluniverse.strands.Strand.park(java.lang.Object) (Strand.java:536 bci: 78)
    at co.paralleluniverse.strands.ConditionSynchronizer.await(int) (ConditionSynchronizer.java:54 bci: 255)
    at co.paralleluniverse.strands.channels.QueueChannel.onQueueFull(int,boolean,long) (QueueChannel.java:261 bci: 349)
    at co.paralleluniverse.strands.channels.QueueChannel.send0(java.lang.Object,boolean,boolean,long) (QueueChannel.java:229 bci: 390)
    at co.paralleluniverse.strands.channels.QueueChannel.send(java.lang.Object) (QueueChannel.java:176 bci: 5) (optimized)
    at co.paralleluniverse.strands.channels.QueueIntChannel.send(int) (QueueIntChannel.java:72 bci: 133) !! (instrumented suspendable calls at: lines [72],  calls [co.paralleluniverse.strands.channels.QueuePrimitiveChannel.send(java.lang.Object)])
    at at.fab1an.quasarxml.TestSender2.run() (Main.kt:36 bci: 87)
    at co.paralleluniverse.fibers.Fiber.run() (Fiber.java:1073 bci: 11)
    at co.paralleluniverse.fibers.Fiber.run1() (Fiber.java:1068 bci: 1)
fab1an commented 7 years ago

If it's of any help I can paste bytecode or something.

fab1an commented 7 years ago

I've set up a test-case: https://github.com/fab1an/quasar-kotlin-test

Use ./gradlew run to start it. It uses a 0.7.8 jar built yesterday, which lies in the root-directory.

This is raw Kotlin, without the quasar-helper.

fab1an commented 7 years ago

The generated Kotlin-ByteCode as shown by IntellIJs Viewer:

// ================at/fab1an/quasar/TestSender2.class =================
// class version 52.0 (52)
// access flags 0x31
// signature Ljava/lang/Object;Lco/paralleluniverse/strands/SuspendableCallable<Ljava/lang/Object;>;
// declaration: at/fab1an/quasar/TestSender2 implements co.paralleluniverse.strands.SuspendableCallable<java.lang.Object>
public final class at/fab1an/quasar/TestSender2 implements co/paralleluniverse/strands/SuspendableCallable  {

  // access flags 0x1
  public run()Ljava/lang/Object; throws co/paralleluniverse/fibers/SuspendExecution 
  @Lorg/jetbrains/annotations/Nullable;() // invisible
   L0
    LINENUMBER 34 L0
    ALOAD 0
    GETFIELD at/fab1an/quasar/TestSender2.channel : Lco/paralleluniverse/strands/channels/IntChannel;
    ICONST_1
    INVOKEINTERFACE co/paralleluniverse/strands/channels/IntChannel.send (I)V
   L1
    LINENUMBER 35 L1
    ACONST_NULL
    ARETURN
   L2
    LOCALVARIABLE this Lat/fab1an/quasar/TestSender2; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x12
  private final Lco/paralleluniverse/strands/channels/IntChannel; channel
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x11
  public final getChannel()Lco/paralleluniverse/strands/channels/IntChannel;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    LINENUMBER 31 L0
    ALOAD 0
    GETFIELD at/fab1an/quasar/TestSender2.channel : Lco/paralleluniverse/strands/channels/IntChannel;
    ARETURN
   L1
    LOCALVARIABLE this Lat/fab1an/quasar/TestSender2; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public <init>(Lco/paralleluniverse/strands/channels/IntChannel;)V
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 1
    LDC "channel"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 31 L1
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    ALOAD 1
    PUTFIELD at/fab1an/quasar/TestSender2.channel : Lco/paralleluniverse/strands/channels/IntChannel;
    RETURN
   L2
    LOCALVARIABLE this Lat/fab1an/quasar/TestSender2; L0 L2 0
    LOCALVARIABLE channel Lco/paralleluniverse/strands/channels/IntChannel; L0 L2 1
    MAXSTACK = 2
    MAXLOCALS = 2

  @Lkotlin/Metadata;(mv={1, 1, 5}, bv={1, 0, 1}, k=1, d1={"\u0000\u0016\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0002\u0008\u0005\u0018\u00002\n\u0012\u0006\u0012\u0004\u0018\u00010\u00020\u0001B\r\u0012\u0006\u0010\u0003\u001a\u00020\u0004\u00a2\u0006\u0002\u0010\u0005J\n\u0010\u0008\u001a\u0004\u0018\u00010\u0002H\u0017R\u0011\u0010\u0003\u001a\u00020\u0004\u00a2\u0006\u0008\n\u0000\u001a\u0004\u0008\u0006\u0010\u0007\u00a8\u0006\u0009"}, d2={"Lat/fab1an/quasar/TestSender2;", "Lco/paralleluniverse/strands/SuspendableCallable;", "", "channel", "Lco/paralleluniverse/strands/channels/IntChannel;", "(Lco/paralleluniverse/strands/channels/IntChannel;)V", "getChannel", "()Lco/paralleluniverse/strands/channels/IntChannel;", "run", "production sources for module quasar-kotlin-test"})
  // compiled from: Main.kt
}

// ================at/fab1an/quasar/MainKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class at/fab1an/quasar/MainKt {

  // access flags 0x19
  public final static main([Ljava/lang/String;)V throws co/paralleluniverse/fibers/SuspendExecution 
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 0
    LDC "args"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 12 L1
   L2
    LINENUMBER 26 L2
   L3
    LINENUMBER 12 L3
   L4
    LINENUMBER 26 L4
   L5
    LINENUMBER 12 L5
    NEW co/paralleluniverse/fibers/Fiber
    DUP
    GETSTATIC at/fab1an/quasar/MainKt$main$1.INSTANCE : Lat/fab1an/quasar/MainKt$main$1;
    CHECKCAST co/paralleluniverse/strands/SuspendableCallable
    INVOKESPECIAL co/paralleluniverse/fibers/Fiber.<init> (Lco/paralleluniverse/strands/SuspendableCallable;)V
   L6
    LINENUMBER 26 L6
    INVOKEVIRTUAL co/paralleluniverse/fibers/Fiber.start ()Lco/paralleluniverse/fibers/Fiber;
    INVOKEVIRTUAL co/paralleluniverse/fibers/Fiber.join ()V
   L7
    LINENUMBER 27 L7
    RETURN
   L8
    LOCALVARIABLE args [Ljava/lang/String; L0 L8 0
    MAXSTACK = 3
    MAXLOCALS = 1

  @Lkotlin/Metadata;(mv={1, 1, 5}, bv={1, 0, 1}, k=2, d1={"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\u0008\u0002\u001a\u001b\u0010\u0000\u001a\u00020\u00012\u000c\u0010\u0002\u001a\u0008\u0012\u0004\u0012\u00020\u00040\u0003H\u0007\u00a2\u0006\u0002\u0010\u0005\u00a8\u0006\u0006"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "production sources for module quasar-kotlin-test"})
  // access flags 0x18
  final static INNERCLASS at/fab1an/quasar/MainKt$main$1 null null
  // compiled from: Main.kt
}

// ================at/fab1an/quasar/MainKt$main$1.class =================
// class version 52.0 (52)
// access flags 0x30
// signature <V:Ljava/lang/Object;>Ljava/lang/Object;Lco/paralleluniverse/strands/SuspendableCallable<Lkotlin/Unit;>;
// declaration: at/fab1an/quasar/MainKt$main$1<V> implements co.paralleluniverse.strands.SuspendableCallable<kotlin.Unit>
final class at/fab1an/quasar/MainKt$main$1 implements co/paralleluniverse/strands/SuspendableCallable  {

  // access flags 0x1041
  public synthetic bridge run()Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL at/fab1an/quasar/MainKt$main$1.invoke ()V
    GETSTATIC kotlin/Unit.INSTANCE : Lkotlin/Unit;
    ARETURN
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x11
  public final invoke()V throws co/paralleluniverse/fibers/SuspendExecution 
   L0
    LINENUMBER 13 L0
    BIPUSH 10
    INVOKESTATIC co/paralleluniverse/strands/channels/Channels.newIntChannel (I)Lco/paralleluniverse/strands/channels/IntChannel;
    DUP
    LDC "Channels.newIntChannel(10)"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkExpressionValueIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
    ASTORE 1
   L1
    LINENUMBER 15 L1
    ICONST_0
    NEW kotlin/ranges/IntRange
    DUP_X1
    SWAP
    SIPUSH 1000
    INVOKESPECIAL kotlin/ranges/IntRange.<init> (II)V
    CHECKCAST java/lang/Iterable
    ASTORE 2
   L2
    LINENUMBER 38 L2
    ALOAD 2
    INVOKEINTERFACE java/lang/Iterable.iterator ()Ljava/util/Iterator;
    ASTORE 3
   L3
    ALOAD 3
    INVOKEINTERFACE java/util/Iterator.hasNext ()Z
    IFEQ L4
    ALOAD 3
    CHECKCAST kotlin/collections/IntIterator
    INVOKEVIRTUAL kotlin/collections/IntIterator.nextInt ()I
    ISTORE 4
   L5
    ILOAD 4
    ISTORE 5
   L6
    LINENUMBER 16 L6
    NEW co/paralleluniverse/fibers/Fiber
    DUP
    NEW at/fab1an/quasar/TestSender2
    DUP
    ALOAD 1
    INVOKESPECIAL at/fab1an/quasar/TestSender2.<init> (Lco/paralleluniverse/strands/channels/IntChannel;)V
    CHECKCAST co/paralleluniverse/strands/SuspendableCallable
    INVOKESPECIAL co/paralleluniverse/fibers/Fiber.<init> (Lco/paralleluniverse/strands/SuspendableCallable;)V
    INVOKEVIRTUAL co/paralleluniverse/fibers/Fiber.start ()Lco/paralleluniverse/fibers/Fiber;
    POP
   L7
    LINENUMBER 17 L7
   L8
   L9
    GOTO L3
   L4
    LINENUMBER 39 L4
   L10
   L11
    LINENUMBER 19 L11
    ICONST_0
    ISTORE 2
   L12
    LINENUMBER 21 L12
   L13
    ILOAD 2
    BIPUSH 100
    IF_ICMPGE L14
   L15
    LINENUMBER 22 L15
    ALOAD 1
    INVOKEINTERFACE co/paralleluniverse/strands/channels/IntChannel.receive ()Ljava/lang/Object;
    POP
   L16
    LINENUMBER 23 L16
    IINC 2 1
   L17
    LINENUMBER 24 L17
    LDC "received"
    ASTORE 3
   L18
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 3
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L19
   L20
   L21
    LINENUMBER 21 L21
    GOTO L13
   L14
    LINENUMBER 25 L14
   L22
    LINENUMBER 26 L22
    RETURN
   L23
    LOCALVARIABLE it I L6 L8 5
    LOCALVARIABLE $i$a$1$forEach I L6 L8 6
    LOCALVARIABLE element$iv I L5 L9 4
    LOCALVARIABLE $receiver$iv Ljava/lang/Iterable; L2 L10 2
    LOCALVARIABLE $i$f$forEach I L2 L10 7
    LOCALVARIABLE i I L12 L14 2
    LOCALVARIABLE test Lco/paralleluniverse/strands/channels/IntChannel; L1 L14 1
    LOCALVARIABLE this Lat/fab1an/quasar/MainKt$main$1; L0 L23 0
    MAXSTACK = 5
    MAXLOCALS = 8

  // access flags 0x0
  <init>()V
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x19
  public final static Lat/fab1an/quasar/MainKt$main$1; INSTANCE

  // access flags 0x8
  static <clinit>()V
    NEW at/fab1an/quasar/MainKt$main$1
    DUP
    INVOKESPECIAL at/fab1an/quasar/MainKt$main$1.<init> ()V
    PUTSTATIC at/fab1an/quasar/MainKt$main$1.INSTANCE : Lat/fab1an/quasar/MainKt$main$1;
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 0

  @Lkotlin/Metadata;(mv={1, 1, 5}, bv={1, 0, 1}, k=3, d1={"\u0000\u0008\n\u0000\n\u0002\u0010\u0002\n\u0000\u0010\u0000\u001a\u00020\u0001H\u000b\u00a2\u0006\u0002\u0008\u0002"}, d2={"<anonymous>", "", "invoke"})
  OUTERCLASS at/fab1an/quasar/MainKt main ([Ljava/lang/String;)V
  // access flags 0x18
  final static INNERCLASS at/fab1an/quasar/MainKt$main$1 null null
  // compiled from: Main.kt
  // debug info: SMAP
Main.kt
Kotlin
*S Kotlin
*F
+ 1 Main.kt
at/fab1an/quasar/MainKt$main$1
+ 2 _Collections.kt
kotlin/collections/CollectionsKt___CollectionsKt
*L
1#1,37:1
1477#2,2:38
*E
*S KotlinDebug
*F
+ 1 Main.kt
at/fab1an/quasar/MainKt$main$1
*L
15#1,2:38
*E

}

// ================META-INF/production sources for module quasar-kotlin-test.kotlin_module =================


at.fab1an.quasarMainKt
fab1an commented 7 years ago

Duplicate of #255