X Tutup
Skip to content

Commit 7f1e84b

Browse files
committed
Fix segmentation fault during release of shared request context (cztomczak#333)
1 parent 36faf91 commit 7f1e84b

File tree

4 files changed

+34
-47
lines changed

4 files changed

+34
-47
lines changed

src/browser.pyx

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,6 @@ cdef void RemovePyBrowser(int browserId) except *:
121121
# Called from LifespanHandler_OnBeforeClose().
122122
global g_pyBrowsers, g_unreferenced_browsers
123123
if browserId in g_pyBrowsers:
124-
if len(g_pyBrowsers) == 1:
125-
# This is the last browser remaining.
126-
if g_sharedRequestContext.get():
127-
# A similar release is done in Shutdown and CloseBrowser.
128-
# noinspection PyUnresolvedReferences
129-
Debug("RemovePyBrowser: releasing shared request context")
130-
g_sharedRequestContext.Assign(NULL)
131124
# noinspection PyUnresolvedReferences
132125
Debug("del g_pyBrowsers[%s]" % browserId)
133126
del g_pyBrowsers[browserId]
@@ -302,13 +295,6 @@ cdef class PyBrowser:
302295
pass
303296

304297
cpdef py_void CloseBrowser(self, py_bool forceClose=False):
305-
if len(g_pyBrowsers) == 1:
306-
# This is the last browser remaining.
307-
if g_sharedRequestContext.get():
308-
# A similar release is done in Shutdown
309-
# and RemovePyBrowser.
310-
Debug("CloseBrowser: releasing shared request context")
311-
g_sharedRequestContext.Assign(NULL)
312298
Debug("CefBrowser::CloseBrowser(%s)" % forceClose)
313299
cdef int browserId = self.GetCefBrowser().get().GetIdentifier()
314300
self.GetCefBrowserHost().get().CloseBrowser(bool(forceClose))

src/cefpython.pyx

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,8 @@ END OF: CHANGES in CEF since v31..v47.
198198
# | cdef cppclass _Object "Object":
199199
#
200200
# - Supporting operators that are not yet supported:
201-
# | CefRefPtr[T]& Assign "operator="(T* p)
202-
# | cefBrowser.Assign(CefBrowser*)
201+
# | RetValue& Assign "operator="(T* p)
202+
# | object.Assign(T*)
203203
# In the same way you can import function with a different name, this one
204204
# imports a static method Create() while adding a prefix "CefSome_":
205205
# | cdef extern from "..":
@@ -390,9 +390,14 @@ from cef_types cimport (
390390
int32, uint32, int64, uint64,
391391
)
392392

393+
# noinspection PyUnresolvedReferences
394+
from cef_ptr cimport CefRefPtr
395+
396+
# noinspection PyUnresolvedReferences
397+
from cef_scoped_ptr cimport scoped_ptr
398+
393399
from cef_task cimport *
394400
from cef_platform cimport *
395-
from cef_ptr cimport *
396401
from cef_app cimport *
397402
from cef_browser cimport *
398403
# noinspection PyUnresolvedReferences
@@ -428,9 +433,6 @@ from cef_path_util cimport *
428433
from cef_drag_data cimport *
429434
from cef_image cimport *
430435
from main_message_loop cimport *
431-
# noinspection PyUnresolvedReferences
432-
from cef_scoped_ptr cimport scoped_ptr
433-
434436

435437
# -----------------------------------------------------------------------------
436438
# GLOBAL VARIABLES
@@ -445,19 +447,19 @@ g_debugFile = "debug.log"
445447
g_applicationSettings = {"string_encoding": "utf-8"}
446448
g_commandLineSwitches = {}
447449

450+
# If ApplicationSettings.unique_request_context_per_browser is False
451+
# then a shared request context is used for all browsers. Otherwise
452+
# a unique one is created for each call to CreateBrowserSync.
453+
# noinspection PyUnresolvedReferences
454+
cdef CefRefPtr[CefRequestContext] g_shared_request_context
455+
448456
cdef scoped_ptr[MainMessageLoopExternalPump] g_external_message_pump
449457

450458
cdef py_bool g_MessageLoop_called = False
451459
cdef py_bool g_MessageLoopWork_called = False
452460

453461
cdef dict g_globalClientCallbacks = {}
454462

455-
# If ApplicationSettings.unique_request_context_per_browser is False
456-
# then a shared request context is used for all browsers. Otherwise
457-
# a unique one is created for each call to CreateBrowserSync.
458-
# noinspection PyUnresolvedReferences
459-
cdef CefRefPtr[CefRequestContext] g_sharedRequestContext
460-
461463
# -----------------------------------------------------------------------------
462464

463465
include "utils.pyx"
@@ -735,7 +737,8 @@ def Initialize(applicationSettings=None, commandLineSwitches=None, **kwargs):
735737
# External message pump
736738
if GetAppSetting("external_message_pump")\
737739
and not g_external_message_pump.get():
738-
g_external_message_pump.Assign(MainMessageLoopExternalPump.Create())
740+
g_external_message_pump.reset(
741+
MainMessageLoopExternalPump.Create().get())
739742

740743
Debug("CefInitialize()")
741744
cdef cpp_bool ret
@@ -786,7 +789,6 @@ def CreateBrowserSync(windowInfo=None,
786789
cdef CefWindowInfo cefWindowInfo
787790
SetCefWindowInfo(cefWindowInfo, windowInfo)
788791

789-
790792
navigateUrl = GetNavigateUrl(navigateUrl)
791793
Debug("navigateUrl: %s" % navigateUrl)
792794
cdef CefString cefNavigateUrl
@@ -798,7 +800,7 @@ def CreateBrowserSync(windowInfo=None,
798800
cdef CefRefPtr[CefBrowser] cefBrowser
799801

800802
# Request context - part 1/2.
801-
createSharedRequestContext = bool(not g_sharedRequestContext.get())
803+
createSharedRequestContext = bool(not g_shared_request_context.get())
802804
cdef CefRefPtr[CefRequestContext] cefRequestContext
803805
cdef CefRefPtr[RequestContextHandler] requestContextHandler =\
804806
<CefRefPtr[RequestContextHandler]?>new RequestContextHandler(
@@ -807,15 +809,13 @@ def CreateBrowserSync(windowInfo=None,
807809
cefRequestContext = CefRequestContext.CreateContext(
808810
CefRequestContext.GetGlobalContext(),
809811
<CefRefPtr[CefRequestContextHandler]?>requestContextHandler)
812+
elif createSharedRequestContext:
813+
cefRequestContext = CefRequestContext.CreateContext(
814+
CefRequestContext.GetGlobalContext(),
815+
<CefRefPtr[CefRequestContextHandler]?>requestContextHandler)
816+
g_shared_request_context.Assign(cefRequestContext.get())
810817
else:
811-
if createSharedRequestContext:
812-
cefRequestContext = CefRequestContext.CreateContext(
813-
CefRequestContext.GetGlobalContext(),
814-
<CefRefPtr[CefRequestContextHandler]?>\
815-
requestContextHandler)
816-
g_sharedRequestContext.Assign(cefRequestContext.get())
817-
else:
818-
cefRequestContext.Assign(g_sharedRequestContext.get())
818+
cefRequestContext.Assign(g_shared_request_context.get())
819819

820820
# CEF browser creation.
821821
with nogil:
@@ -881,11 +881,12 @@ def QuitMessageLoop():
881881
CefQuitMessageLoop()
882882

883883
def Shutdown():
884-
if g_sharedRequestContext.get():
885-
# A similar release is done in RemovePyBrowser and CloseBrowser.
886-
# This one is probably redundant. Additional testing should be done.
887-
Debug("Shutdown: releasing shared request context")
888-
g_sharedRequestContext.Assign(NULL)
884+
Debug("Shutdown()")
885+
886+
# Release shared request context. This is sometimes causing
887+
# segmentation fault, so disabling it for now. See Issue #333:
888+
# https://github.com/cztomczak/cefpython/issues/333
889+
# OFF: g_shared_request_context.Assign(NULL)
889890

890891
# Run some message loop work, force closing browsers and then run
891892
# some message loop work again for the browsers to close cleanly.
@@ -968,7 +969,7 @@ def Shutdown():
968969
NonCriticalError("Shutdown called, but there are still browser"
969970
" references alive")
970971

971-
Debug("Shutdown()")
972+
Debug("CefShutdown()")
972973
with nogil:
973974
CefShutdown()
974975

src/extern/cef/cef_ptr.pxd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ cdef extern from "include/internal/cef_ptr.h":
1010
# noinspection PyUnresolvedReferences
1111
CefRefPtr(const CefRefPtr[T]& r)
1212
# noinspection PyUnresolvedReferences
13-
CefRefPtr[T]& Assign "operator="(T* p) # cefBrowser.Assign(CefBrowser*)
14-
# noinspection PyUnresolvedReferences
1513
T* get()
1614
# noinspection PyUnresolvedReferences
1715
void swap(CefRefPtr[T]& r)
16+
# noinspection PyUnresolvedReferences
17+
CefRefPtr[T]& Assign "operator="(T* p)

src/extern/cef/cef_scoped_ptr.pxd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ cdef extern from "include/base/cef_scoped_ptr.h":
1010
# noinspection PyUnresolvedReferences
1111
void reset()
1212
# noinspection PyUnresolvedReferences
13-
T* get()
13+
void reset(T* p)
1414
# noinspection PyUnresolvedReferences
15-
scoped_ptr[T]& Assign "operator="(scoped_ptr[T]& p)
15+
T* get()

0 commit comments

Comments
 (0)
X Tutup