forked from panda3d/panda3d
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpythonTask.h
More file actions
150 lines (117 loc) · 4.03 KB
/
pythonTask.h
File metadata and controls
150 lines (117 loc) · 4.03 KB
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file pythonTask.h
* @author drose
* @date 2008-09-16
*/
#ifndef PYTHONTASK_H
#define PYTHONTASK_H
#include "pandabase.h"
#include "asyncTask.h"
#ifdef HAVE_PYTHON
#include "py_panda.h"
#include "extension.h"
/**
* This class exists to allow association of a Python function or coroutine
* with the AsyncTaskManager.
*/
class PythonTask final : public AsyncTask {
PUBLISHED:
PythonTask(PyObject *function = Py_None, const std::string &name = std::string());
virtual ~PythonTask();
ALLOC_DELETED_CHAIN(PythonTask);
void set_function(PyObject *function);
INLINE PyObject *get_function();
void set_args(PyObject *args, bool append_task);
PyObject *get_args();
void set_upon_death(PyObject *upon_death);
INLINE PyObject *get_upon_death();
void set_owner(PyObject *owner);
INLINE PyObject *get_owner() const;
INLINE void set_result(PyObject *result);
public:
// This is exposed only for the result() function in asyncFuture_ext.cxx
// to use, which is why it is not published.
PyObject *get_result() const;
//PyObject *exception() const;
PUBLISHED:
int __setattr__(PyObject *self, PyObject *attr, PyObject *v);
int __delattr__(PyObject *self, PyObject *attr);
PyObject *__getattribute__(PyObject *self, PyObject *attr) const;
int __traverse__(visitproc visit, void *arg);
int __clear__();
PUBLISHED:
// The amount of seconds that have elapsed since the task was started,
// according to the task manager's clock.
MAKE_PROPERTY(time, get_elapsed_time);
// If this task has been added to an AsyncTaskManager with a delay in
// effect, this contains the time at which the task is expected to awaken.
// It has no meaning of the task has not yet been added to a queue, or if
// there was no delay in effect at the time the task was added. If the
// task's status is not S_sleeping, this contains 0.0.
MAKE_PROPERTY(wake_time, get_wake_time);
// Alias of wake_time.
MAKE_PROPERTY(wakeTime, get_wake_time);
// The delay value that has been set on this task, if any, or None.
MAKE_PROPERTY2(delay_time, has_delay, get_delay, set_delay, clear_delay);
// Alias of delay_time.
MAKE_PROPERTY2(delayTime, has_delay, get_delay, set_delay, clear_delay);
// The number of frames that have elapsed since the task was started,
// according to the task manager's clock.
MAKE_PROPERTY(frame, get_elapsed_frames);
// This is a special variable to hold the instance dictionary in which
// custom variables may be stored.
PyObject *__dict__;
protected:
virtual bool cancel();
virtual bool is_runnable();
virtual DoneStatus do_task();
DoneStatus do_python_task();
virtual void upon_birth(AsyncTaskManager *manager);
virtual void upon_death(AsyncTaskManager *manager, bool clean_exit);
private:
void register_to_owner();
void unregister_from_owner();
void call_owner_method(const char *method_name);
void call_function(PyObject *function);
private:
PyObject *_function;
PyObject *_args;
PyObject *_upon_death;
PyObject *_owner;
PyObject *_exception;
PyObject *_exc_value;
PyObject *_exc_traceback;
PyObject *_generator;
PyObject *_future_done;
bool _append_task;
bool _ignore_return;
bool _registered_to_owner;
mutable bool _retrieved_exception;
bool _must_cancel = false;
friend class Extension<AsyncFuture>;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
AsyncTask::init_type();
register_type(_type_handle, "PythonTask",
AsyncTask::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
};
#include "pythonTask.I"
#endif // HAVE_PYTHON
#endif