Skip to content
This repository has been archived by the owner on Sep 28, 2022. It is now read-only.

fix segmentation fault for distinct coroutine contexts #56

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions php_swoole.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
+----------------------------------------------------------------------+
| Swoole |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the Apache license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.apache.org/licenses/LICENSE-2.0.html |
| If you did not receive a copy of the Apache2.0 license and are unable|
| to obtain it through the world-wide-web, please send a note to |
| [email protected] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Tianfeng Han <[email protected]> |
+----------------------------------------------------------------------+
*/

#ifndef PHP_SWOOLE_H
#define PHP_SWOOLE_H

#include "php.h"
#include "php_ini.h"
#include "php_globals.h"
#include "php_main.h"

#include "php_streams.h"
#include "php_network.h"

#include "zend_variables.h"
#include "zend_interfaces.h"
#include "zend_closures.h"
#include "zend_exceptions.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

extern zend_module_entry swoole_module_entry;
#define phpext_swoole_ptr &swoole_module_entry

PHP_MINIT_FUNCTION(swoole);
PHP_MSHUTDOWN_FUNCTION(swoole);
PHP_RINIT_FUNCTION(swoole);
PHP_RSHUTDOWN_FUNCTION(swoole);
PHP_MINFO_FUNCTION(swoole);

// clang-format off
ZEND_BEGIN_MODULE_GLOBALS(swoole)
zend_bool display_errors;
zend_bool cli;
zend_bool use_shortname;
zend_bool enable_coroutine;
zend_bool enable_preemptive_scheduler;
zend_bool enable_library;
long socket_buffer_size;
int req_status;
ZEND_END_MODULE_GLOBALS(swoole)
// clang-format on

extern ZEND_DECLARE_MODULE_GLOBALS(swoole);

#ifdef ZTS
#define SWOOLE_G(v) TSRMG(swoole_globals_id, zend_swoole_globals *, v)
#else
#define SWOOLE_G(v) (swoole_globals.v)
#endif

#endif /* PHP_SWOOLE_H */
21 changes: 20 additions & 1 deletion swoole_postgresql_coro.cc
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,17 @@ static void _php_pgsql_notice_handler(void *resource_id, const char *message) {
}
}

static void swoole_pgsql_check_and_register(void) {
php_swoole_check_reactor();

if (!swoole_event_isset_handler(PHP_SWOOLE_FD_POSTGRESQL)) {
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_READ, swoole_pgsql_coro_onRead);
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_WRITE, swoole_pgsql_coro_onWrite);
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_ERROR, swoole_pgsql_coro_onError);
}

}

static PHP_METHOD(swoole_postgresql_coro, __construct) {}

static PHP_METHOD(swoole_postgresql_coro, connect) {
Expand Down Expand Up @@ -334,14 +345,16 @@ static PHP_METHOD(swoole_postgresql_coro, connect) {
RETURN_FALSE;
}

swoole_pgsql_check_and_register();
/*
php_swoole_check_reactor();

if (!swoole_event_isset_handler(PHP_SWOOLE_FD_POSTGRESQL)) {
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_READ, swoole_pgsql_coro_onRead);
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_WRITE, swoole_pgsql_coro_onWrite);
swoole_event_set_handler(PHP_SWOOLE_FD_POSTGRESQL | SW_EVENT_ERROR, swoole_pgsql_coro_onError);
}

*/
object->socket = make_socket(fd, (enum swFd_type) PHP_SWOOLE_FD_POSTGRESQL);
if (swoole_event_add(object->socket, SW_EVENT_WRITE) < 0) {
php_swoole_fatal_error(E_WARNING, "swoole_event_add failed");
Expand Down Expand Up @@ -750,6 +763,8 @@ static PHP_METHOD(swoole_postgresql_coro, query) {
pgsql = object->conn;
object->object = ZEND_THIS;

swoole_pgsql_check_and_register();

while ((pgsql_result = PQgetResult(pgsql))) {
PQclear(pgsql_result);
}
Expand Down Expand Up @@ -789,6 +804,8 @@ static PHP_METHOD(swoole_postgresql_coro, prepare) {
pgsql = object->conn;
object->object = ZEND_THIS;

swoole_pgsql_check_and_register();

is_non_blocking = PQisnonblocking(pgsql);

if (is_non_blocking == 0 && PQsetnonblocking(pgsql, 1) == -1) {
Expand Down Expand Up @@ -844,6 +861,7 @@ static PHP_METHOD(swoole_postgresql_coro, execute) {
object->request_type = NORMAL_QUERY;
pgsql = object->conn;
object->object = ZEND_THIS;
swoole_pgsql_check_and_register();

is_non_blocking = PQisnonblocking(pgsql);

Expand Down Expand Up @@ -1108,6 +1126,7 @@ static PHP_METHOD(swoole_postgresql_coro, metaData) {
object->request_type = META_DATA;
pgsql = object->conn;
object->object = ZEND_THIS;
swoole_pgsql_check_and_register();

while ((pg_result = PQgetResult(pgsql))) {
PQclear(pg_result);
Expand Down