1 #include "ns3/ref-count-base.h"
7 void PythonCompleteConstruct (Ptr<Object> object, TypeId typeId, const AttributeList &attributes)
9 object->SetTypeId (typeId);
10 object->Object::Construct (attributes);
17 class PythonEventImpl : public ns3::EventImpl
23 PythonEventImpl (PyObject *callback, PyObject *args)
25 m_callback = callback;
26 Py_INCREF(m_callback);
30 virtual ~PythonEventImpl ()
32 PyGILState_STATE __py_gil_state;
33 __py_gil_state = (PyEval_ThreadsInitialized() ? PyGILState_Ensure() : (PyGILState_STATE) 0);
35 Py_DECREF(m_callback);
38 if (PyEval_ThreadsInitialized())
39 PyGILState_Release(__py_gil_state);
41 virtual void Notify ()
43 PyGILState_STATE __py_gil_state;
44 __py_gil_state = (PyEval_ThreadsInitialized() ? PyGILState_Ensure() : (PyGILState_STATE) 0);
46 PyObject *retval = PyObject_CallObject(m_callback, m_args);
48 if (retval != Py_None) {
49 PyErr_SetString(PyExc_TypeError, "event callback should return None");
57 if (PyEval_ThreadsInitialized())
58 PyGILState_Release(__py_gil_state);
64 _wrap_Simulator_Schedule(PyNs3Simulator *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs,
65 PyObject **return_exception)
67 PyObject *exc_type, *traceback;
69 PyObject *py_callback;
71 ns3::Ptr<PythonEventImpl> py_event_impl;
72 PyNs3EventId *py_EventId;
74 if (kwargs && PyObject_Length(kwargs) > 0) {
75 PyErr_SetString(PyExc_TypeError, "keyword arguments not supported");
79 if (PyTuple_GET_SIZE(args) < 2) {
80 PyErr_SetString(PyExc_TypeError, "ns3.Simulator.Schedule needs at least 2 arguments");
83 py_time = PyTuple_GET_ITEM(args, 0);
84 py_callback = PyTuple_GET_ITEM(args, 1);
86 if (!PyObject_IsInstance(py_time, (PyObject*) &PyNs3Time_Type)) {
87 PyErr_SetString(PyExc_TypeError, "Parameter 1 should be a ns3.Time instance");
90 if (!PyCallable_Check(py_callback)) {
91 PyErr_SetString(PyExc_TypeError, "Parameter 2 should be callable");
94 user_args = PyTuple_GetSlice(args, 2, PyTuple_GET_SIZE(args));
95 py_event_impl = ns3::Create<PythonEventImpl>(py_callback, user_args);
98 py_EventId = PyObject_New(PyNs3EventId, &PyNs3EventId_Type);
99 py_EventId->obj = new ns3::EventId(
100 ns3::Simulator::Schedule(*((PyNs3Time *) py_time)->obj, py_event_impl));
101 return (PyObject *) py_EventId;
104 PyErr_Fetch(&exc_type, return_exception, &traceback);
105 Py_XDECREF(exc_type);
106 Py_XDECREF(traceback);
112 _wrap_Simulator_ScheduleNow(PyNs3Simulator *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs,
113 PyObject **return_exception)
115 PyObject *exc_type, *traceback;
116 PyObject *py_callback;
118 ns3::Ptr<PythonEventImpl> py_event_impl;
119 PyNs3EventId *py_EventId;
121 if (kwargs && PyObject_Length(kwargs) > 0) {
122 PyErr_SetString(PyExc_TypeError, "keyword arguments not supported");
126 if (PyTuple_GET_SIZE(args) < 1) {
127 PyErr_SetString(PyExc_TypeError, "ns3.Simulator.Schedule needs at least 1 argument");
130 py_callback = PyTuple_GET_ITEM(args, 0);
132 if (!PyCallable_Check(py_callback)) {
133 PyErr_SetString(PyExc_TypeError, "Parameter 2 should be callable");
136 user_args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
137 py_event_impl = ns3::Create<PythonEventImpl>(py_callback, user_args);
138 Py_DECREF(user_args);
140 py_EventId = PyObject_New(PyNs3EventId, &PyNs3EventId_Type);
141 py_EventId->obj = new ns3::EventId(ns3::Simulator::ScheduleNow(py_event_impl));
142 return (PyObject *) py_EventId;
145 PyErr_Fetch(&exc_type, return_exception, &traceback);
146 Py_XDECREF(exc_type);
147 Py_XDECREF(traceback);
153 _wrap_Simulator_ScheduleDestroy(PyNs3Simulator *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs,
154 PyObject **return_exception)
156 PyObject *exc_type, *traceback;
157 PyObject *py_callback;
159 ns3::Ptr<PythonEventImpl> py_event_impl;
160 PyNs3EventId *py_EventId;
162 if (kwargs && PyObject_Length(kwargs) > 0) {
163 PyErr_SetString(PyExc_TypeError, "keyword arguments not supported");
167 if (PyTuple_GET_SIZE(args) < 1) {
168 PyErr_SetString(PyExc_TypeError, "ns3.Simulator.Schedule needs at least 1 argument");
171 py_callback = PyTuple_GET_ITEM(args, 0);
173 if (!PyCallable_Check(py_callback)) {
174 PyErr_SetString(PyExc_TypeError, "Parameter 2 should be callable");
177 user_args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
178 py_event_impl = ns3::Create<PythonEventImpl>(py_callback, user_args);
179 Py_DECREF(user_args);
181 py_EventId = PyObject_New(PyNs3EventId, &PyNs3EventId_Type);
182 py_EventId->obj = new ns3::EventId(ns3::Simulator::ScheduleDestroy(py_event_impl));
183 return (PyObject *) py_EventId;
186 PyErr_Fetch(&exc_type, return_exception, &traceback);
187 Py_XDECREF(exc_type);
188 Py_XDECREF(traceback);
194 _wrap_TypeId_LookupByNameFailSafe(PyNs3TypeId *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs,
195 PyObject **return_exception)
202 const char *keywords[] = {"name", NULL};
204 if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *) "s#", (char **) keywords, &name, &name_len)) {
205 PyObject *exc_type, *traceback;
206 PyErr_Fetch(&exc_type, return_exception, &traceback);
207 Py_XDECREF(exc_type);
208 Py_XDECREF(traceback);
211 ok = ns3::TypeId::LookupByNameFailSafe(std::string(name, name_len), &tid);
214 PyErr_Format(PyExc_KeyError, "The ns3 type with name `%s' is not registered", name);
218 py_tid = PyObject_New(PyNs3TypeId, &PyNs3TypeId_Type);
219 py_tid->obj = new ns3::TypeId (tid);
220 PyNs3TypeId_wrapper_registry[(void *) py_tid->obj] = (PyObject *) py_tid;
222 return (PyObject *) py_tid;
226 class CommandLinePythonValueSetter : public ns3::RefCountBase
228 PyObject *m_namespace;
229 std::string m_variable;
231 CommandLinePythonValueSetter (PyObject *ns, std::string const &variable) {
234 m_variable = variable;
236 bool Parse (std::string value) {
237 PyObject *pyvalue = PyString_FromStringAndSize (value.data(), value.size());
238 PyObject_SetAttrString (m_namespace, (char *) m_variable.c_str(), pyvalue);
239 if (PyErr_Occurred()) {
245 virtual ~CommandLinePythonValueSetter () {
246 Py_DECREF (m_namespace);
253 _wrap_CommandLine_AddValue(PyNs3CommandLine *self, PyObject *args, PyObject *kwargs,
254 PyObject **return_exception)
256 const char *name, *help, *variable = NULL;
257 PyObject *py_namespace = NULL;
258 const char *keywords[] = {"name", "help", "variable", "namespace", NULL};
260 if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *) "ss|sO", (char **) keywords, &name, &help, &variable, &py_namespace)) {
261 PyObject *exc_type, *traceback;
262 PyErr_Fetch(&exc_type, return_exception, &traceback);
263 Py_XDECREF(exc_type);
264 Py_XDECREF(traceback);
268 if (variable == NULL) {
271 if (py_namespace == NULL) {
272 py_namespace = (PyObject *) self;
275 ns3::Ptr<CommandLinePythonValueSetter> setter = ns3::Create<CommandLinePythonValueSetter> (py_namespace, variable);
276 self->obj->AddValue (name, help, ns3::MakeCallback (&CommandLinePythonValueSetter::Parse, setter));
284 _wrap_Simulator_Run(PyNs3Simulator *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs,
285 PyObject **return_exception)
287 const char *keywords[] = {"signal_check_frequency", NULL};
288 int signal_check_frequency = 100;
290 if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *) "|i", (char **) keywords, &signal_check_frequency)) {
291 PyObject *exc_type, *traceback;
292 PyErr_Fetch(&exc_type, return_exception, &traceback);
293 Py_XDECREF(exc_type);
294 Py_XDECREF(traceback);
298 PyThreadState *py_thread_state = NULL;
300 if (signal_check_frequency == -1)
302 if (PyEval_ThreadsInitialized ())
303 py_thread_state = PyEval_SaveThread();
304 ns3::Simulator::Run();
306 PyEval_RestoreThread(py_thread_state);
308 while (!ns3::Simulator::IsFinished())
310 if (PyEval_ThreadsInitialized())
311 py_thread_state = PyEval_SaveThread();
313 for (int n = signal_check_frequency; n > 0 && !ns3::Simulator::IsFinished(); --n)
315 ns3::Simulator::RunOneEvent();
319 PyEval_RestoreThread(py_thread_state);
320 PyErr_CheckSignals();
321 if (PyErr_Occurred())