2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* physics_server_2d_wrap_mt.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 00:50:27 +01:00
2020-03-27 15:21:27 -03:00
# include "physics_server_2d_wrap_mt.h"
2015-05-26 01:05:08 -03:00
2024-04-23 12:01:23 +02:00
void PhysicsServer2DWrapMT : : _assign_mt_ids ( WorkerThreadPool : : TaskID p_pump_task_id ) {
server_thread = Thread : : get_caller_id ( ) ;
server_task_id = p_pump_task_id ;
2015-05-26 01:05:08 -03:00
}
2024-04-23 12:01:23 +02:00
void PhysicsServer2DWrapMT : : _thread_exit ( ) {
exit = true ;
2015-05-26 01:05:08 -03:00
}
2024-04-23 12:01:23 +02:00
void PhysicsServer2DWrapMT : : _thread_loop ( ) {
2024-04-04 10:18:08 +02:00
while ( ! exit ) {
WorkerThreadPool : : get_singleton ( ) - > yield ( ) ;
2025-08-13 22:51:44 +02:00
if ( ! doing_sync . is_set ( ) ) {
command_queue . flush_all ( ) ;
}
2015-05-26 01:05:08 -03:00
}
}
2025-08-13 22:51:44 +02:00
void PhysicsServer2DWrapMT : : _thread_sync ( ) {
doing_sync . set ( ) ;
}
2015-05-26 01:05:08 -03:00
/* EVENT QUEUING */
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : step ( real_t p_step ) {
2015-05-26 01:05:08 -03:00
if ( create_thread ) {
2024-04-23 12:01:23 +02:00
command_queue . push ( physics_server_2d , & PhysicsServer2D : : step , p_step ) ;
2015-05-26 01:05:08 -03:00
} else {
2022-04-26 22:52:53 -05:00
physics_server_2d - > step ( p_step ) ;
2015-05-26 01:05:08 -03:00
}
}
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : sync ( ) {
2021-01-19 13:29:41 +01:00
if ( create_thread ) {
2025-08-13 22:51:44 +02:00
command_queue . push_and_sync ( this , & PhysicsServer2DWrapMT : : _thread_sync ) ;
2024-04-23 12:01:23 +02:00
} else {
command_queue . flush_all ( ) ; // Flush all pending from other threads.
2015-05-26 01:30:36 -03:00
}
2022-04-26 22:52:53 -05:00
physics_server_2d - > sync ( ) ;
2015-05-26 01:05:08 -03:00
}
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : flush_queries ( ) {
2022-04-26 22:52:53 -05:00
physics_server_2d - > flush_queries ( ) ;
2015-05-26 01:05:08 -03:00
}
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : end_sync ( ) {
2022-04-26 22:52:53 -05:00
physics_server_2d - > end_sync ( ) ;
2025-08-13 22:51:44 +02:00
if ( create_thread ) {
doing_sync . clear ( ) ;
}
2015-05-26 01:05:08 -03:00
}
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : init ( ) {
2015-05-26 01:05:08 -03:00
if ( create_thread ) {
2025-07-16 23:31:35 -07:00
WorkerThreadPool : : TaskID tid = WorkerThreadPool : : get_singleton ( ) - > add_task ( callable_mp ( this , & PhysicsServer2DWrapMT : : _thread_loop ) , true , " Physics server 2D pump task " , true ) ;
2024-04-23 12:01:23 +02:00
command_queue . set_pump_task_id ( tid ) ;
command_queue . push ( this , & PhysicsServer2DWrapMT : : _assign_mt_ids , tid ) ;
command_queue . push_and_sync ( physics_server_2d , & PhysicsServer2D : : init ) ;
DEV_ASSERT ( server_task_id = = tid ) ;
2015-05-26 01:05:08 -03:00
} else {
2024-04-23 12:01:23 +02:00
server_thread = Thread : : MAIN_ID ;
2022-04-26 22:52:53 -05:00
physics_server_2d - > init ( ) ;
2015-05-26 01:05:08 -03:00
}
}
2020-03-27 15:21:27 -03:00
void PhysicsServer2DWrapMT : : finish ( ) {
2024-04-04 10:18:08 +02:00
if ( create_thread ) {
2024-04-23 12:01:23 +02:00
command_queue . push ( physics_server_2d , & PhysicsServer2D : : finish ) ;
command_queue . push ( this , & PhysicsServer2DWrapMT : : _thread_exit ) ;
2024-04-04 10:18:08 +02:00
if ( server_task_id ! = WorkerThreadPool : : INVALID_TASK_ID ) {
WorkerThreadPool : : get_singleton ( ) - > wait_for_task_completion ( server_task_id ) ;
server_task_id = WorkerThreadPool : : INVALID_TASK_ID ;
}
2024-04-23 12:01:23 +02:00
server_thread = Thread : : MAIN_ID ;
2015-05-26 01:05:08 -03:00
} else {
2022-04-26 22:52:53 -05:00
physics_server_2d - > finish ( ) ;
2015-05-26 01:05:08 -03:00
}
}
2024-04-04 10:18:08 +02:00
PhysicsServer2DWrapMT : : PhysicsServer2DWrapMT ( PhysicsServer2D * p_contained , bool p_create_thread ) {
2022-04-26 22:52:53 -05:00
physics_server_2d = p_contained ;
2017-03-05 16:44:50 +01:00
create_thread = p_create_thread ;
2015-05-26 01:05:08 -03:00
}
2020-03-27 15:21:27 -03:00
PhysicsServer2DWrapMT : : ~ PhysicsServer2DWrapMT ( ) {
2022-04-26 22:52:53 -05:00
memdelete ( physics_server_2d ) ;
2015-05-26 01:05:08 -03:00
}