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
|
//
// libavg - Media Playback Engine.
// Copyright (C) 2003-2014 Ulrich von Zadow
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// 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 GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Current versions can be found at www.libavg.de
//
#include "Timeout.h"
#include "BoostPython.h"
#include "../base/Exception.h"
#include "../base/ObjectCounter.h"
#include <iostream>
using namespace std;
namespace avg {
// Hack to make sure ids don't overlap with publisher/subsriber ids
int Timeout::s_LastID = 100000;
Timeout::Timeout(int time, PyObject * pyfunc, bool isInterval, long long startTime)
: m_Interval(time),
m_PyFunc(pyfunc),
m_IsInterval(isInterval)
{
ObjectCounter::get()->incRef(&typeid(*this));
m_NextTimeout = m_Interval+startTime;
s_LastID++;
m_ID = s_LastID;
Py_INCREF(m_PyFunc);
}
Timeout::~Timeout()
{
Py_DECREF(m_PyFunc);
ObjectCounter::get()->decRef(&typeid(*this));
}
bool Timeout::isReady(long long time) const
{
return m_NextTimeout <= time;
}
bool Timeout::isInterval() const
{
return m_IsInterval;
}
void Timeout::fire(long long curTime)
{
if (m_IsInterval) {
m_NextTimeout = m_Interval + curTime;
}
PyObject * arglist = Py_BuildValue("()");
PyObject * result = PyEval_CallObject(m_PyFunc, arglist);
// XXX: After the call to python, this might have been deleted
// by a call to clearTimeout()!
Py_DECREF(arglist);
if (!result) {
throw py::error_already_set();
}
Py_DECREF(result);
}
int Timeout::getID() const
{
return m_ID;
}
bool Timeout::operator <(const Timeout& other) const
{
return m_NextTimeout < other.m_NextTimeout;
}
}
|