A Discrete-Event Network Simulator
API
system-thread.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2008 INRIA
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Mathieu Lacage <mathieu.lacage.inria.fr>
19 */
20
21#include "fatal-error.h"
22#include "system-thread.h"
23#include "log.h"
24#include <cstring>
25
32namespace ns3 {
33
34NS_LOG_COMPONENT_DEFINE ("SystemThread");
35
36#ifdef HAVE_PTHREAD_H
37
38SystemThread::SystemThread (Callback<void> callback)
39 : m_callback (callback)
40{
41 NS_LOG_FUNCTION (this << &callback);
42}
43
44SystemThread::~SystemThread ()
45{
46 NS_LOG_FUNCTION (this);
47}
48
49void
50SystemThread::Start (void)
51{
52 NS_LOG_FUNCTION (this);
53
54 int rc = pthread_create (&m_thread, NULL, &SystemThread::DoRun,
55 (void *)this);
56
57 if (rc)
58 {
59 NS_FATAL_ERROR ("pthread_create failed: " << rc << "=\"" <<
60 strerror (rc) << "\".");
61 }
62}
63
64void
66{
67 NS_LOG_FUNCTION (this);
68
69 void *thread_return;
70 int rc = pthread_join (m_thread, &thread_return);
71 if (rc)
72 {
73 NS_FATAL_ERROR ("pthread_join failed: " << rc << "=\"" <<
74 strerror (rc) << "\".");
75 }
76}
77
78void *
79SystemThread::DoRun (void *arg)
80{
81 NS_LOG_FUNCTION (arg);
82
83 SystemThread *self = static_cast<SystemThread *> (arg);
84 self->m_callback ();
85
86 return 0;
87}
88SystemThread::ThreadId
89SystemThread::Self (void)
90{
92 return pthread_self ();
93}
94
95bool
96SystemThread::Equals (SystemThread::ThreadId id)
97{
98 NS_LOG_FUNCTION (id);
99 return (pthread_equal (pthread_self (), id) != 0);
100}
101
102#endif /* HAVE_PTHREAD_H */
103
104} // namespace ns3
SystemThread(Callback< void > callback)
Create a SystemThread object.
NS_FATAL_x macro definitions.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
std::string Join(std::list< std::string >::const_iterator begin, std::list< std::string >::const_iterator end)
Join a list of file system path directories into a single file system path.
Definition: system-path.cc:276
Debug message logging.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
System-independent thread class ns3::SystemThread declaration.