PING: RFR: JDK-8235846: Improve WindbgDebuggerLocal implementation

Alex Menkov alexey.menkov at oracle.com
Thu Jan 23 21:16:47 UTC 2020



On 01/23/2020 12:35, Chris Plummer wrote:
> On 1/23/20 11:21 AM, Alex Menkov wrote:

...skipped...

>>>>
>>>>> Why is the following not placed at the end if the "if" block:
>>>>>
>>>>>   299   AddRef();
>>>>>   300   return S_OK;
>>>>>
>>>>> The following was removed. It's not clear to me why it was and what 
>>>>> the impact is:
>>>>>
>>>>>   283   ptrIDebugOutputCallbacks->AddRef();
>>>>
>>>> I updated COM object implementation (SAOutputCallbacks) to follow 
>>>> "standard way".
>>>> - standard implementation for QueryInterface looks like
>>>>
>>>>   *ppInterface = nullptr;
>>>>   if (IsEqualIID(interfaceId, __uuidof(IUnknown)) ||
>>>>         IsEqualIID(interfaceId, __uuidof(MyInterface1))) {
>>>>     *ppInterface = static_cast<MyInterface1*>(this);
>>>>   } else if (IsEqualIID(interfaceId, __uuidof(MyInterface2))) {
>>>>     *ppInterface = static_cast<MyInterface2*>(this);
>>>>   } else if (IsEqualIID(interfaceId, __uuidof(MyInterface3))) {
>>>>     *ppInterface = static_cast<MyInterface3*>(this);
>>>> ...
>>>>   } else {
>>>>     return E_NOINTERFACE;
>>>>   }
>>>>   AddRef();
>>>>   return S_OK;
>>>> }
>>>>
>>> I'm not sure what standard you are referring to. The only other uses 
>>> of E_NOINTERFACE I see are 5 uses in awt that all put the AddRef() in 
>>> the if/else blocks, not outside. Can you please explain what this 
>>> standard is?
>>
>> Well, openjdk implements only 3 COM interfaces.
>> This "standard way" is from other projects I worked on (including jdk 
>> installer which implements a lot of COM objects).
>> I don't care much about this change and can revert it.
> OK.

What does the "OK" mean? :)
Do you prefer revert the change?

--alex

> 
> thanks,
> 
> Chris
>>
>> As for ref.counter - I never see ref.counter is initialized by 0 (AWT 
>> code initialize ref.counter by 1 in ctor too).
>>
>> --alex
>>
>>>
>>> thanks
>>>
>>> Chris
>>>> - standard handling of ref. counter sets it to 1 during object 
>>>> creation (so callers don't have to call AddRef after each creation)
>>>> So I did:
>>>> -  SAOutputCallbacks() : m_refCount(0), m_msgBuffer(0) {
>>>> +  SAOutputCallbacks() : m_refCount(1), m_msgBuffer(nullptr) {
>>>>
>>>> and removed unnecessary AddRef:
>>>>    SAOutputCallbacks* ptrIDebugOutputCallbacks = new 
>>>> SAOutputCallbacks();
>>>> -  ptrIDebugOutputCallbacks->AddRef();
>>>>
>>>>
>>>> --alex
>>>>
>>>>>
>>>>> thanks,
>>>>>
>>>>> Chris
>>>>>
>>>>> On 1/17/20 10:37 AM, Alex Menkov wrote:
>>>>>> Need 2nd reviewer.
>>>>>>
>>>>>> --alex
>>>>>>
>>>>>> On 01/14/2020 13:10, serguei.spitsyn at oracle.com wrote:
>>>>>>> Hi Alex,
>>>>>>>
>>>>>>> Thank you for the update!
>>>>>>> It looks good.
>>>>>>>
>>>>>>> Still incorrect indent:
>>>>>>>
>>>>>>> 103 ~AutoJavaString() { 104 if (m_buf) { 105 
>>>>>>> m_env->ReleaseStringUTFChars(m_str, m_buf); 106 } 107 } 108 109 
>>>>>>> operator const char* () const { 110 return m_buf; 111 } ... 133 
>>>>>>> void setReleaseMode(jint mode) {
>>>>>>> 134 releaseMode = mode;
>>>>>>> 135 }
>>>>>>> 136
>>>>>>> 137 operator jbyte* () const {
>>>>>>> 138 return bytePtr;
>>>>>>> 139 }
>>>>>>>
>>>>>>> The comment shout start from a capital letter:
>>>>>>>
>>>>>>> 177 // verifies COM call result is S_OK, throws DebuggerException 
>>>>>>> and exits otherwise.
>>>>>>>
>>>>>>>
>>>>>>> No need for another webrev.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 1/14/20 12:39 PM, Alex Menkov wrote:
>>>>>>>> Hi Serguei,
>>>>>>>>
>>>>>>>> Thank you for the review.
>>>>>>>> updated webrev:
>>>>>>>> http://cr.openjdk.java.net/~amenkov/jdk15/WinDbg_improve/webrev.02/
>>>>>>>>
>>>>>>>> On 01/13/2020 16:39, serguei.spitsyn at oracle.com wrote:
>>>>>>>>> Hi Alex,
>>>>>>>>>
>>>>>>>>> It looks pretty good.
>>>>>>>>> Just some minor comments below.
>>>>>>>>>
>>>>>>>>> The class AutoCOMPtr has unfixed indents.
>>>>>>>>> I guess, the function AutoArrayPtr.asPtr() is not used anymore 
>>>>>>>>> and can be deleted.
>>>>>>>>
>>>>>>>> fixed.
>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'd suggest to remove first level '()' brackets in the comment 
>>>>>>>>> to avoid brackets nesting: 74 // manage COM 'auto' pointers (to 
>>>>>>>>> avoid multiple Release 75 // calls at every early (exception) 
>>>>>>>>> returns). => 74 // manage COM 'auto' pointers to avoid multiple 
>>>>>>>>> Release
>>>>>>>>> 75 // calls at every early (exception) returns.
>>>>>>>>
>>>>>>>> done.
>>>>>>>>
>>>>>>>>> I'd suggest to reformat it as it was originally formatted:
>>>>>>>>>
>>>>>>>>> 297 if (IsEqualIID(interfaceId, __uuidof(IUnknown))
>>>>>>>>> 298 || IsEqualIID(interfaceId, 
>>>>>>>>> __uuidof(IDebugOutputCallbacks))) { => 297 if 
>>>>>>>>> (IsEqualIID(interfaceId, __uuidof(IUnknown))  ||
>>>>>>>>> 298 IsEqualIID(interfaceId, __uuidof(IDebugOutputCallbacks))) {
>>>>>>>>
>>>>>>>> done.
>>>>>>>>
>>>>>>>>> The comment about S_FALSE is not that clear as S_FALSE is not 
>>>>>>>>> really used
>>>>>>>>> (better to use consistently just one value: S_FALSE or false):
>>>>>>>>>
>>>>>>>>> 418 // S_FALSE means timeout
>>>>>>>>> 419 
>>>>>>>>> COM_VERIFY_OK_(ptrIDebugControl->WaitForEvent(DEBUG_WAIT_DEFAULT, 
>>>>>>>>> INFINITE),
>>>>>>>>> 420 "Windbg Error: WaitForEvent failed!", false);
>>>>>>>>
>>>>>>>> S_FALSE is a possible result of ptrIDebugControl->WaitForEvent 
>>>>>>>> call.
>>>>>>>> In the case we wait infinitely, so S_FALSE is not possible and 
>>>>>>>> we don't handle it separately.
>>>>>>>> I removed the comment.
>>>>>>>>
>>>>>>>>
>>>>>>>>> NULL is used in some placesand nullptr in others.
>>>>>>>>
>>>>>>>> There is some mess with 0/NULL/nullptr in the file
>>>>>>>> I fixed all NULLs and some (most likely not all) 0s.
>>>>>>>> BTW it immediately discovered misuse of NULL/0:
>>>>>>>>
>>>>>>>> -  if (ptrIDebugSymbols->GetModuleParameters(loaded, 0, NULL, 
>>>>>>>> params.asPtr()) != S_OK) {
>>>>>>>> -     THROW_NEW_DEBUGGER_EXCEPTION_("Windbg Error: 
>>>>>>>> GetModuleParameters failed!", false);
>>>>>>>> -  }
>>>>>>>> + COM_VERIFY_OK_(ptrIDebugSymbols->GetModuleParameters(loaded, 
>>>>>>>> nullptr, 0, params),
>>>>>>>> +                 "Windbg Error: GetModuleParameters failed!", 
>>>>>>>> false);
>>>>>>>>
>>>>>>>> 2nd arg of GetModuleParameters is a pointer and 3rd is ulong
>>>>>>>>
>>>>>>>> --alex
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Serguei
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 12/19/19 15:34, Alex Menkov wrote:
>>>>>>>>>> Hi all,
>>>>>>>>>>
>>>>>>>>>> Please review a fix for
>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8235846
>>>>>>>>>> webrev:
>>>>>>>>>> http://cr.openjdk.java.net/~amenkov/jdk15/WinDbg_improve/webrev.01/ 
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Main goal of the change is to improve error reporting (we have 
>>>>>>>>>> several bugs and need at least COM error codes for WinDbg calls).
>>>>>>>>>> Also the fix improves/rearranges this quite old code.
>>>>>>>>>>
>>>>>>>>>> --alex
>>>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>
>>>
> 
> 


More information about the serviceability-dev mailing list