summaryrefslogtreecommitdiff
path: root/libs/ode-0.16.1/ode/src/threading_base.cpp
blob: 9272effedaef1865050486b92b21a5680eac8d66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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);
    }
}