summaryrefslogtreecommitdiff
path: root/libs/ode-0.16.1/ode/src/threading_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ode-0.16.1/ode/src/threading_base.cpp')
-rw-r--r--libs/ode-0.16.1/ode/src/threading_base.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/libs/ode-0.16.1/ode/src/threading_base.cpp b/libs/ode-0.16.1/ode/src/threading_base.cpp
new file mode 100644
index 0000000..9272eff
--- /dev/null
+++ b/libs/ode-0.16.1/ode/src/threading_base.cpp
@@ -0,0 +1,135 @@
+/*************************************************************************
+ * *
+ * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. *
+ * All rights reserved. Email: russ@q12.org Web: www.q12.org *
+ * *
+ * Threading base wrapper class implementation file. *
+ * Copyright (C) 2011-2019 Oleh Derevenko. All rights reserved. *
+ * e-mail: odar@eleks.com (change all "a" to "e") *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of EITHER: *
+ * (1) The GNU Lesser General Public License as published by the Free *
+ * Software Foundation; either version 2.1 of the License, or (at *
+ * your option) any later version. The text of the GNU Lesser *
+ * General Public License is included with this library in the *
+ * file LICENSE.TXT. *
+ * (2) The BSD-style license that is included with this library in *
+ * the file LICENSE-BSD.TXT. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
+ * *
+ *************************************************************************/
+
+/*
+ * Threading base class to be used for inheritance by dxWorld, dxSpace and others
+ * to take advantage of threaded execution.
+ */
+
+
+#include <ode/common.h>
+#include "config.h"
+#include "error.h"
+#include "threading_base.h"
+
+
+dxThreadingBase::~dxThreadingBase()
+{
+ DoFreeStockCallWait();
+}
+
+
+void dxThreadingBase::PostThreadedCallsGroup(
+ int *out_summary_fault/*=NULL*/,
+ ddependencycount_t member_count, dCallReleaseeID dependent_releasee/*=NULL*/,
+ dThreadedCallFunction *call_func, void *call_context,
+ const char *call_name/*=NULL*/) const
+{
+ dIASSERT(member_count != 0);
+
+ dThreadingImplementationID impl;
+ const dxThreadingFunctionsInfo *functions = FindThreadingImpl(impl);
+
+ for (unsigned member_index = 0; member_index != member_count; ++member_index) {
+ // Post individual group member jobs
+ functions->post_call(impl, out_summary_fault, NULL, 0, dependent_releasee, NULL, call_func, call_context, member_index, call_name);
+ }
+}
+
+void dxThreadingBase::PostThreadedCallsIndexOverridenGroup(int *out_summary_fault/*=NULL*/,
+ ddependencycount_t member_count, dCallReleaseeID dependent_releasee/*=NULL*/,
+ dThreadedCallFunction *call_func, void *call_context, unsigned index_override,
+ const char *call_name/*=NULL*/) const
+{
+ dIASSERT(member_count != 0);
+
+ dThreadingImplementationID impl;
+ const dxThreadingFunctionsInfo *functions = FindThreadingImpl(impl);
+
+ for (unsigned member_index = 0; member_index != member_count; ++member_index) {
+ // Post individual group member jobs
+ functions->post_call(impl, out_summary_fault, NULL, 0, dependent_releasee, NULL, call_func, call_context, index_override, call_name);
+ }
+}
+
+void dxThreadingBase::PostThreadedCallForUnawareReleasee(
+ int *out_summary_fault/*=NULL*/,
+ dCallReleaseeID *out_post_releasee/*=NULL*/, ddependencycount_t dependencies_count, dCallReleaseeID dependent_releasee/*=NULL*/,
+ dCallWaitID call_wait/*=NULL*/,
+ dThreadedCallFunction *call_func, void *call_context, dcallindex_t instance_index,
+ const char *call_name/*=NULL*/) const
+{
+ dThreadingImplementationID impl;
+ const dxThreadingFunctionsInfo *functions = FindThreadingImpl(impl);
+
+ functions->alter_call_dependencies_count(impl, dependent_releasee, 1);
+ functions->post_call(impl, out_summary_fault, out_post_releasee, dependencies_count, dependent_releasee, call_wait, call_func, call_context, instance_index, call_name);
+}
+
+
+const dxThreadingFunctionsInfo *dxThreadingBase::FindThreadingImpl(dThreadingImplementationID &out_impl_found) const
+{
+ const dxThreadingFunctionsInfo *functions_found = GetFunctionsInfo();
+
+ if (functions_found != NULL)
+ {
+ out_impl_found = GetThreadingImpl();
+ }
+ else
+ {
+ functions_found = m_default_impl_provider->retrieveThreadingDefaultImpl(out_impl_found);
+ }
+
+ return functions_found;
+}
+
+
+dCallWaitID dxThreadingBase::DoAllocateStockCallWait()
+{
+ dIASSERT(GetStockCallWait() == NULL);
+
+ dCallWaitID stock_wait_id = AllocThreadedCallWait();
+
+ if (stock_wait_id != NULL)
+ {
+ SetStockCallWait(stock_wait_id);
+ }
+
+ return stock_wait_id;
+}
+
+void dxThreadingBase::DoFreeStockCallWait()
+{
+ dCallWaitID stock_wait_id = GetStockCallWait();
+
+ if (stock_wait_id != NULL)
+ {
+ FreeThreadedCallWait(stock_wait_id);
+
+ SetStockCallWait(NULL);
+ }
+}
+