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

SIGABRT encountered on writing an invalid file descriptor #1157

Open
lancewoo opened this issue Dec 25, 2021 · 3 comments
Open

SIGABRT encountered on writing an invalid file descriptor #1157

lancewoo opened this issue Dec 25, 2021 · 3 comments

Comments

@lancewoo
Copy link

lancewoo commented Dec 25, 2021

Describe the bug

Please add a clear description of what the bug is, and fill the list below.

  • CameraView version: 2.7.2
  • Camera engine used: camera2
  • Reproducible in official demo app: no
  • Device / Android version: Pie, API 25
  • I have read the FAQ page: yes

The scenario is like this. We had a timer set for taking pictures every 5 minutes. Occasionaly the app would get a SIGABRT to be killed when creating a new CameraView fragment for taking a new picture. After checking the logcat and stacktrace, we suspect that there might be something wrong with the states of CameraOrchestrator or WorkerHandler. So we passed true to recreateHandler in the CameraEngine constructor and never got crashed again. p.s. After 2 more days' of pressure tests, it crashed again.

My question is, is it possible that WorkerHandler used an old thread while its Looper had quit?

Expected behavior

A clear and concise description of what you expected to happen.

XML layout

Part of the XML layout with the CameraView declaration, so we can read its attributes.

  <com.otaliastudios.cameraview.CameraView xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/camera_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"

        android:keepScreenOn="true"
        app:cameraAudio="off"
        app:cameraAutoFocusMarker="@string/cameraview_default_autofocus_marker"
        app:cameraEngine="camera2"
        app:cameraFlash="auto"
        app:cameraGestureLongTap="takePicture"
        app:cameraGesturePinch="zoom"
        app:cameraGestureScrollHorizontal="exposureCorrection"
        app:cameraGestureScrollVertical="none"
        app:cameraGestureTap="autoFocus"
        app:cameraGrid="off"
        app:cameraWhiteBalance="auto"
        app:cameraPlaySounds="false"
        app:cameraPreview="glSurface">

    </com.otaliastudios.cameraview.CameraView>

Logs

Use CameraLogger.setLogLevel(LEVEL_INFO) to see all logs into LogCat.

12-23 11:09:34.589 4590 4590 I #ST2303_CameraServer#: [(Camera2Fragment.java:256)#onCreateView] Camera2Fragment onCreateView(id=1)
12-23 11:09:34.602 4590 4590 W CameraView: doInstantiateEngine: instantiating. engine: CAMERA2
12-23 11:09:34.602 4590 4590 W WorkerHandler: get: Reusing cached worker handler. CameraViewEngine
12-23 11:09:34.603 4590 4590 W CameraView: doInstantiateEngine: instantiated. engine: Camera1Engine
12-23 11:09:34.603 4590 4590 I CameraOrchestrator: FACING - Scheduling.
12-23 11:09:34.604 4590 4590 F Looper : Could not write wake signal to fd 56: Bad file descriptor

pid: 4298, tid: 4298, name: er.cameraserver >>> com.senter.cameraserver <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'Could not write wake signal to fd 56: Bad file descriptor'
r0 00000000 r1 000010ca r2 00000006 r3 00000008
r4 000010ca r5 000010ca r6 ffb304ac r7 0000010c
r8 00000000 r9 efe48000 r10 12dc0f38 r11 00000000
ip f23a33cc sp ffb30498 lr f230ef95 pc f2305e5e

backtrace:
#00 pc 0001ce5e /system/lib/libc.so (abort+58)
#1 pc 00007e19 /system/lib/liblog.so (__android_log_assert+156)
#2 pc 0000f8d3 /system/lib/libutils.so (android::Looper::wake()+106)
#3 pc 003abc5f /system/framework/arm/boot-framework.oat (offset 0x3ab000) (android.app.backup.BackupDataInput.dtor [DEDUPED]+102)
#4 pc 000123e7 anonymous:d6d2e000 (android.os.MessageQueue.enqueueMessage+462)
#5 pc 0001e7a5 anonymous:d6d2e000 (android.os.Handler.enqueueMessage+100)
#6 pc 00021069 anonymous:d6d2e000 (android.os.Handler.sendMessageAtTime+240)
#7 pc 00014d29 anonymous:d6d2e000 (android.os.Handler.sendMessageDelayed+120)
#8 pc 00033b45 anonymous:d6d2e000 (android.os.Handler.postDelayed+68)
#9 pc 0040d175 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
#10 pc 003e6c71 /system/lib/libart.so (art_quick_invoke_stub+224)
#11 pc 000a103d /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+136)
#12 pc 001e5b09 /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+236)
#13 pc 001e05f7 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+814)
#14 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#15 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#16 pc 003f9c84 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.internal.WorkerHandler.post+4)
#17 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#18 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#19 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#20 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#21 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#22 pc 003f271a /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.orchestrator.CameraOrchestrator.sync+26)
#23 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#24 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#25 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#26 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#27 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#28 pc 003f2480 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.orchestrator.CameraOrchestrator.scheduleInternal+100)
#29 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#30 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#31 pc 001e141f /system/lib/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+586)
#32 pc 003e399b /system/lib/libart.so (MterpInvokeDirectRange+170)
#33 pc 00400294 /system/lib/libart.so (ExecuteMterpImpl+15252)
#34 pc 003f2402 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.orchestrator.CameraOrchestrator.scheduleDelayed+18)
#35 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#36 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#37 pc 001e141f /system/lib/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+586)
#38 pc 003e2b05 /system/lib/libart.so (MterpInvokeVirtualRange+424)
#39 pc 00400194 /system/lib/libart.so (ExecuteMterpImpl+14996)
#40 pc 003f23ac /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.orchestrator.CameraOrchestrator.schedule+12)
#41 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#42 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#43 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#44 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#45 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#46 pc 003f2c84 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.orchestrator.CameraStateOrchestrator.scheduleStateful+12)
#47 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#48 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#49 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#50 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#51 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#52 pc 003ec7aa /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.engine.CameraBaseEngine.setFacing+38)
#53 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#54 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#55 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#56 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#57 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#58 pc 003e374c /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.CameraView.setFacing+4)
#59 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#60 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#61 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#62 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#63 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#64 pc 003e2810 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.CameraView.initialize+704)
#65 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#66 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#67 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#68 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#69 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#70 pc 003e217a /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.otaliastudios.cameraview.CameraView.+50)
#71 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#72 pc 001c939f /system/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+82)
#73 pc 003d53b1 /system/lib/libart.so (artQuickToInterpreterBridge+880)
#74 pc 004116ff /system/lib/libart.so (art_quick_to_interpreter_bridge+30)
#75 pc 0040d175 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
#76 pc 003e6c71 /system/lib/libart.so (art_quick_invoke_stub+224)
#77 pc 000a103d /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+136)
#78 pc 00347ba5 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, art::JValue*, char const*)+52)
#79 pc 00348ff5 /system/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+1024)
#80 pc 002f2163 /system/lib/libart.so (art::Constructor_newInstance0(_JNIEnv*, _jobject*, _jobjectArray*)+366)
#81 pc 00111f5d /system/framework/arm/boot-core-oj.oat (offset 0x10d000) (java.lang.String.concat [DEDUPED]+92)
#82 pc 0040d175 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
#83 pc 003e6c71 /system/lib/libart.so (art_quick_invoke_stub+224)
#84 pc 000a103d /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+136)
#85 pc 001e5b09 /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+236)
#86 pc 001e05f7 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+814)
#87 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#88 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#89 pc 000cc3c6 /system/framework/boot-core-oj.vdex (java.lang.reflect.Constructor.newInstance+8)
#90 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#91 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#92 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#93 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#94 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#95 pc 00b88be6 /system/framework/boot-framework.vdex (android.view.LayoutInflater.createView+420)
#96 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#97 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#98 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#99 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#100 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#101 pc 00b88e82 /system/framework/boot-framework.vdex (android.view.LayoutInflater.createViewFromTag+230)
#102 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#103 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#104 pc 001e141f /system/lib/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+586)
#105 pc 003e3f73 /system/lib/libart.so (MterpInvokeVirtualQuickRange+306)
#106 pc 00403c94 /system/lib/libart.so (ExecuteMterpImpl+30100)
#107 pc 00d3b0ea /system/framework/boot-framework.vdex (android.view.LayoutInflater.createViewFromTag+12)
#108 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#109 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#110 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#111 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#112 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#113 pc 00b8974c /system/framework/boot-framework.vdex (android.view.LayoutInflater.rInflate+184)
#114 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#115 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#116 pc 001e141f /system/lib/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+586)
#117 pc 003e3f73 /system/lib/libart.so (MterpInvokeVirtualQuickRange+306)
#118 pc 00403c94 /system/lib/libart.so (ExecuteMterpImpl+30100)
#119 pc 00d3b23c /system/framework/boot-framework.vdex (android.view.LayoutInflater.rInflateChildren+18)
#120 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#121 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#122 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#123 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#124 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#125 pc 00b890ba /system/framework/boot-framework.vdex (android.view.LayoutInflater.inflate+248)
#126 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#127 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#128 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#129 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#130 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#131 pc 00b88f94 /system/framework/boot-framework.vdex (android.view.LayoutInflater.inflate+24)
#132 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#133 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#134 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#135 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#136 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#137 pc 00a460dc /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.FrontCameraFragment.inflaterLayout+8)
#138 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#139 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#140 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#141 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#142 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#143 pc 00a44a08 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.Camera2Fragment.onCreateView+168)
#144 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#145 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#146 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#147 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#148 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#149 pc 002780fe /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.Fragment.performCreateView+38)
#150 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#151 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#152 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#153 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#154 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#155 pc 0027079a /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.FragmentStateManager.createView+414)
#156 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#157 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#158 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#159 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#160 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#161 pc 00270f4a /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.FragmentStateManager.moveToExpectedState+274)
#162 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#163 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#164 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#165 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#166 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#167 pc 0026dd62 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.FragmentManager.executeOpsTogether+558)
#168 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#169 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#170 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#171 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#172 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#173 pc 0026edd4 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute+168)
#174 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#175 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#176 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#177 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#178 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#179 pc 0026da7a /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.FragmentManager.execSingleAction+62)
#180 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#181 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#182 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#183 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#184 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#185 pc 00263270 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (androidx.fragment.app.BackStackRecord.commitNow+12)
#186 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#187 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#188 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#189 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#190 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#191 pc 00a4567e /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.CameraActivity2.doTakeNextPic+274)
#192 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#193 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#194 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#195 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#196 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#197 pc 00a45864 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.CameraActivity2.takeNextPic+404)
#198 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#199 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#200 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#201 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#202 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#203 pc 00a45902 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.CameraActivity2.takeNextPicForAllWorkers+74)
#204 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#205 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#206 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#207 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#208 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#209 pc 00a46042 /data/app/com.senter.cameraserver-iHEOxySVA_zTWZQo1GIS7w==/oat/arm/base.vdex (com.senter.cameraserver.ui.CameraActivity2.onResume+46)
#210 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#211 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#212 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#213 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#214 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#215 pc 003b2d82 /system/framework/boot-framework.vdex (android.app.Instrumentation.callActivityOnResume+6)
#216 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#217 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#218 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#219 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#220 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#221 pc 00393ca2 /system/framework/boot-framework.vdex (android.app.Activity.performResume+50)
#222 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#223 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#224 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#225 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#226 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#227 pc 0038b502 /system/framework/boot-framework.vdex (android.app.ActivityThread.performResumeActivity+208)
#228 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#229 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#230 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#231 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#232 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#233 pc 0038f0a6 /system/framework/boot-framework.vdex (android.app.ActivityThread.handleResumeActivity+12)
#234 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#235 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#236 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#237 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#238 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#239 pc 003d1044 /system/framework/boot-framework.vdex (android.app.servertransaction.ResumeActivityItem.execute+24)
#240 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#241 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#242 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#243 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)
#244 pc 003ffe94 /system/lib/libart.so (ExecuteMterpImpl+14228)
#245 pc 003d1640 /system/framework/boot-framework.vdex (android.app.servertransaction.TransactionExecutor.executeLifecycleState+104)
#246 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#247 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#248 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#249 pc 003e2759 /system/lib/libart.so (MterpInvokeDirect+196)
#250 pc 003fff94 /system/lib/libart.so (ExecuteMterpImpl+14484)
#251 pc 003d14a4 /system/framework/boot-framework.vdex (android.app.servertransaction.TransactionExecutor.execute+74)
#252 pc 001c4d73 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.850926792+378)
#253 pc 001c9459 /system/lib/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+152)
#254 pc 001e05df /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+790)
#255 pc 003e18cb /system/lib/libart.so (MterpInvokeVirtual+442)

@lancewoo
Copy link
Author

This seems to be a system level bug in Looper. This crash happened when a WorkerHandler thread was created and cached and a new CameraView instance was created and it was awaken up by an alarm.
I finally changed how CameraEngine use the WorkerHandler to do a workaround. Whenever recreateHandler() is called, a new key is used to create a new WorkerHandler; when CameraEngine quits, the WorkerHandler quits then.

@natario1
Copy link
Owner

natario1 commented Dec 29, 2021

Thanks for the information. I don't fully understand what's going on though. Is there something the library could do, other than creating a new handler each time?

@lancewoo
Copy link
Author

lancewoo commented Jan 4, 2022

I strongly suspect there's something wrong with my version of Android Looper at the very core. https://android.googlesource.com/platform/system/core/+log/master/libutils/Looper.cpp

More information, the device we're using is for surveillance purpose on power towers. There's no user interaction. So we only set up alarms to do picture shots repeatedly, say, every 30 minutes. After each picture taken, the device would go into sleep mode to save battery as soon as possible. A crash may occur on each second wakeup to do a picture taking. If we delay some time, say, 100ms or more, to do the instantiation of CameraView, it seems the crash case would not be touched. Weird? Since this is probably a bug of the underlying Android system, as we can see from stacktraces of each crash, I don't think there is a need to do modifications to the CameraView. It is a great library. Thanks! Moreover, this crash case only occurred to an Android 9 device, not on other kinds.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants