summaryrefslogtreecommitdiff
path: root/inference-engine/thirdparty/clDNN/src/include/event_impl.h
blob: a8adc745fb337491cc2db4ff03c713d9fc6fd2c8 (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
/*
// Copyright (c) 2016 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "api_impl.h"
#include "refcounted_obj.h"

#include <list>
#include <mutex>

namespace cldnn
{
struct user_event;

struct event_impl : public refcounted_obj<event_impl>
{
public:
    event_impl() = default;

    void wait();
    bool is_set();
    
    //returns true if handler has been successfully added
    bool add_event_handler(cldnn_event_handler handler, void* data);
    
    const std::list<cldnn_profiling_interval>& get_profiling_info();

private:
    std::mutex _handlers_mutex;
    std::list<std::pair<cldnn_event_handler, void*>> _handlers;

    bool _profiling_captured = false;
    std::list<cldnn_profiling_interval> _profiling_info;

protected:
    bool _set = false;

    void call_handlers();

    virtual void wait_impl() = 0;
    virtual bool is_set_impl() = 0;
    virtual bool add_event_handler_impl(cldnn_event_handler, void*) { return true; }

    //returns whether profiling info has been captures successfully and there's no need to call this impl a second time when user requests to get profling info
    virtual bool get_profiling_info_impl(std::list<cldnn_profiling_interval>&) { return true; };
};

struct user_event : virtual public event_impl
{
public:
    user_event(bool set = false)
    {
        _set = set;
    }

    void set()
    { 
        if (_set)
            return;
        _set = true;
        set_impl();
        call_handlers();
    }

private:
    virtual void set_impl() = 0;
};

}

API_CAST(::cldnn_event, cldnn::event_impl)