traceprof: enforce native stderr on Windows to avoid crash

Summary:
On Windows `FILE*` seems to be different in traceprofimpl.cpp and Python:

```
# fp passed from traceprof.pyx:profile(fp=sys.stderr) to traceprofimpl.cpp
0x0000000000d23cc0 {_Placeholder=0x0000000000d23360 }
    _Placeholder: 0x0000000000d23360

# stderr as seen from traceprofimpl.cpp natively
ucrtbase.dll!0x00007ffb29465510 (load symbols for additional information) {_Placeholder=0x0000000000000000 }
    _Placeholder: 0x0000000000000000
```

Workaround that by enforcing output Windows to use stderr for now.

Test Plan:
```
C:\hg> python2 setup.py build_ext -i
...

C:\hg> type a.py
import sys
from mercurial import ui
from hgext import traceprof
def f(): g(1)
def g(x): print(x)
with traceprof.profile(ui.ui(), sys.stderr): f()

C:\hg> python2 a.py
1
    | <module>                                  a.py:1
    | __exit__                                  C:\...\contextlib.py:21
Total time: 0 ms
```

Reviewers: #mercurial

Differential Revision: https://phabricator.intern.facebook.com/D6686958
This commit is contained in:
Jun Wu 2018-01-09 13:26:14 -08:00
parent dcbc5e9b19
commit 04f520998c

View File

@ -36,7 +36,10 @@ import gc
cdef extern from "extlib/traceprofimpl.cpp":
void enable()
void disable()
void report(FILE *)
IF UNAME_SYSNAME == "Windows":
void report()
ELSE:
void report(FILE *)
void settimethreshold(double)
void setcountthreshold(size_t)
void setdedup(int)
@ -63,5 +66,10 @@ def profile(ui, fp):
yield
finally:
disable()
report(PyFile_AsFile(<PyObject *>fp))
IF UNAME_SYSNAME == "Windows":
# On Windows, "FILE*" could be incompatible between Python.exe and
# traceimpl.exp. Use stderr from traceimpl.exp conservatively.
report()
ELSE:
report(PyFile_AsFile(<PyObject *>fp))
clear()