Commit 19af9398 authored by neverlord's avatar neverlord

debugging

parent 1620b8ab
CXX = /opt/local/bin/g++-mp-4.5
CXXFLAGS = -std=c++0x -pedantic -Wall -Wextra -g -O0 -I/opt/local/include/
LIBS = -L/opt/local/lib -lboost_thread-mt
......@@ -60,15 +60,15 @@
<valuemap type="QVariantMap">
<value key="ProjectExplorer.BuildConfiguration.DisplayName" type="QString">all</value>
<valuelist key="abstractProcess.Environment" type="QVariantList">
<value type="QString">Apple_PubSub_Socket_Render=/tmp/launch-gSC9AO/Render</value>
<value type="QString">Apple_PubSub_Socket_Render=/tmp/launch-Ii2KqP/Render</value>
<value type="QString">COMMAND_MODE=unix2003</value>
<value type="QString">DISPLAY=/tmp/launch-1vsPWG/org.x:0</value>
<value type="QString">DISPLAY=/tmp/launch-6FAyZP/org.x:0</value>
<value type="QString">HOME=/Users/neverlord</value>
<value type="QString">LOGNAME=neverlord</value>
<value type="QString">PATH=/usr/bin:/bin:/usr/sbin:/sbin</value>
<value type="QString">SHELL=/bin/bash</value>
<value type="QString">SSH_AUTH_SOCK=/tmp/launch-H5MBik/Listeners</value>
<value type="QString">TMPDIR=/var/folders/SE/SEReyCW0H-yDPCnNCe8mN++++TI/-Tmp-/</value>
<value type="QString">SSH_AUTH_SOCK=/tmp/launch-vifjfO/Listeners</value>
<value type="QString">TMPDIR=/var/folders/1p/1p6iuPgbH7GoDkrjrT20tU+++TI/-Tmp-/</value>
<value type="QString">USER=neverlord</value>
<value type="QString">__CF_USER_TEXT_ENCODING=0x1F5:0:3</value>
</valuelist>
......
......@@ -21,9 +21,9 @@ class ref_counted_impl
inline void ref() { ++m_rc; }
inline bool deref() { return (--m_rc > 0); }
inline bool deref() { return --m_rc > 0; }
inline bool unique() { return (m_rc == 1); }
inline bool unique() { return m_rc == 1; }
};
......
......@@ -44,7 +44,13 @@ class intrusive_ptr : detail::comparable<intrusive_ptr<T>, T*>,
set_ptr(const_cast<Y*>(other.get()));
}
~intrusive_ptr() { if (m_ptr && !m_ptr->deref()) delete m_ptr; }
~intrusive_ptr()
{
if (m_ptr && !m_ptr->deref())
{
delete m_ptr;
}
}
T* get() { return m_ptr; }
......@@ -71,8 +77,11 @@ class intrusive_ptr : detail::comparable<intrusive_ptr<T>, T*>,
intrusive_ptr& operator=(const intrusive_ptr& other)
{
intrusive_ptr tmp(other);
swap(tmp);
if (get() != other.get())
{
intrusive_ptr tmp(other);
swap(tmp);
}
return *this;
}
......
......@@ -23,7 +23,10 @@ class message
const untyped_tuple data;
content(const actor& s, const message_receiver& r,
const untyped_tuple& ut)
: sender(s), receiver(r), data(ut)
: ref_counted(), sender(s), receiver(r), data(ut)
{
}
~content()
{
}
};
......@@ -41,8 +44,8 @@ class message
message(const actor& from, const message_receiver& to, const untyped_tuple& ut)
: m_content(new content(from, to, ut)) { }
message(const actor& from, const message_receiver& to, untyped_tuple&& ut)
: m_content(new content(from, to, std::move(ut))) { }
// message(const actor& from, const message_receiver& to, untyped_tuple&& ut)
// : m_content(new content(from, to, std::move(ut))) { }
message() : m_content(new content(0, 0, tuple<int>(0))) { }
......
......@@ -61,7 +61,7 @@ CPPA_ANNOUNCE(std::uint64_t);
CPPA_ANNOUNCE(float);
CPPA_ANNOUNCE(double);
CPPA_ANNOUNCE(long double);
*/
CPPA_ANNOUNCE(std::string);
*/
#endif // UNIFORM_TYPE_INFO_HPP
......@@ -18,6 +18,16 @@ class singly_linked_list
singly_linked_list() : m_head(0), m_tail(0) { }
~singly_linked_list()
{
while (m_head)
{
T* next = m_head->next;
delete m_head;
m_head = next;
}
}
inline bool empty() const { return m_head == 0; }
void push_back(element_type* what)
......
......@@ -18,6 +18,6 @@ cppa::deserializer& operator>>(cppa::deserializer& d, std::string& str)
d.read(str_size, cbuf);
cbuf[str_size] = 0;
str = cbuf;
delete cbuf;
delete[] cbuf;
return d;
}
......@@ -11,7 +11,7 @@ struct actor_message
{
actor_message* next;
cppa::message msg;
actor_message(const cppa::message& from) : msg(from) { }
actor_message(const cppa::message& from) : next(0), msg(from) { }
};
struct actor_impl;
......@@ -31,6 +31,11 @@ struct actor_impl : cppa::detail::actor_private
actor_impl(cppa::detail::behavior* b = 0) : m_behavior(b) { }
~actor_impl()
{
if (m_behavior) delete m_behavior;
}
virtual void enqueue_msg(const cppa::message& msg)
{
mailbox.push_back(new actor_message(msg));
......@@ -98,7 +103,6 @@ struct actor_ptr
{
cppa::intrusive_ptr<actor_impl> m_impl;
actor_ptr(actor_impl* ai) : m_impl(ai) { }
actor_ptr(actor_ptr&& other) : m_impl(std::move(other.m_impl)) { }
actor_ptr(const actor_ptr&) = default;
void operator()()
{
......@@ -131,7 +135,8 @@ actor spawn_impl(behavior* actor_behavior)
{
actor_ptr aptr(new actor_impl(actor_behavior));
boost::thread(aptr).detach();
return actor(std::move(aptr.m_impl));
return actor(aptr.m_impl);
// return actor(std::move(aptr.m_impl));
}
} } // namespace cppa::detail
#include <limits>
#include <vector>
#include <string>
#include <memory>
#include <cstdint>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <stdexcept>
#include <atomic>
#include "cppa/config.hpp"
#include "cppa/uniform_type_info.hpp"
......@@ -23,29 +27,53 @@ typedef std::map<std::string, std::string> string_map;
template<int Size, bool IsSigned>
struct int_helper { };
template<> struct int_helper<1,true> { static const char* name; };
const char* int_helper<1,true>::name = "int8_t";
template<>
struct int_helper<1, true>
{
static std::string name() { return "@i8"; }
};
template<> struct int_helper<2,true> { static const char* name; };
const char* int_helper<2,true>::name = "int16_t";
template<>
struct int_helper<2, true>
{
static std::string name() { return "@i16"; }
};
template<> struct int_helper<4,true> { static const char* name; };
const char* int_helper<4,true>::name = "int32_t";
template<>
struct int_helper<4, true>
{
static std::string name() { return "@i32"; }
};
template<> struct int_helper<8,true> { static const char* name; };
const char* int_helper<8,true>::name = "int64_t";
template<>
struct int_helper<8, true>
{
static std::string name() { return "@i64"; }
};
template<> struct int_helper<1,false> { static const char* name; };
const char* int_helper<1,false>::name = "uint8_t";
template<>
struct int_helper<1, false>
{
static std::string name() { return "@u8"; }
};
template<> struct int_helper<2,false> { static const char* name; };
const char* int_helper<2,false>::name = "uint16_t";
template<>
struct int_helper<2, false>
{
static std::string name() { return "@u16"; }
};
template<> struct int_helper<4,false> { static const char* name; };
const char* int_helper<4,false>::name = "uint32_t";
template<>
struct int_helper<4, false>
{
static std::string name() { return "@u32"; }
};
template<> struct int_helper<8,false> { static const char* name; };
const char* int_helper<8,false>::name = "uint64_t";
template<>
struct int_helper<8, false>
{
static std::string name() { return "@u64"; }
};
template<typename T>
struct uniform_int : int_helper<sizeof(T), std::numeric_limits<T>::is_signed>{};
......@@ -56,13 +84,12 @@ std::map<std::string, cppa::utype*>* ut_map = 0;
template<typename T>
std::string raw_name()
{
std::string result;
size_t size;
int status;
char* undecorated = abi::__cxa_demangle(typeid(T).name(),
NULL, &size, &status);
assert(status == 0);
result = undecorated;
std::string result(undecorated, size);
free(undecorated);
return result;
}
......@@ -74,147 +101,120 @@ const char* raw_name()
}
#endif
string_map* btm_ptr = 0;
//string_map* btm_ptr = 0;
std::unique_ptr<string_map> btm_ptr;
const string_map& builtin_type_mappings()
{
if (!btm_ptr)
{
btm_ptr = new string_map
string_map* value = new string_map
{
{ raw_name<char>(),
uniform_int<char>::name },
uniform_int<char>::name() },
{ raw_name<signed char>(),
uniform_int<signed char>::name },
uniform_int<signed char>::name() },
{ raw_name<unsigned char>(),
uniform_int<unsigned char>::name },
uniform_int<unsigned char>::name() },
{ raw_name<short>(),
uniform_int<short>::name },
uniform_int<short>::name() },
{ raw_name<signed short>(),
uniform_int<signed short>::name },
uniform_int<signed short>::name() },
{ raw_name<unsigned short>(),
uniform_int<unsigned short>::name },
uniform_int<unsigned short>::name() },
{ raw_name<short int>(),
uniform_int<short int>::name },
uniform_int<short int>::name() },
{ raw_name<signed short int>(),
uniform_int<signed short int>::name },
uniform_int<signed short int>::name() },
{ raw_name<unsigned short int>(),
uniform_int<unsigned short int>::name },
uniform_int<unsigned short int>::name() },
{ raw_name<int>(),
uniform_int<int>::name },
uniform_int<int>::name() },
{ raw_name<signed int>(),
uniform_int<signed int>::name },
uniform_int<signed int>::name() },
{ raw_name<unsigned int>(),
uniform_int<unsigned int>::name },
uniform_int<unsigned int>::name() },
{ raw_name<long>(),
uniform_int<long>::name },
uniform_int<long>::name() },
{ raw_name<signed long>(),
uniform_int<signed long>::name },
uniform_int<signed long>::name() },
{ raw_name<unsigned long>(),
uniform_int<unsigned long>::name },
uniform_int<unsigned long>::name() },
{ raw_name<long int>(),
uniform_int<long int>::name },
uniform_int<long int>::name() },
{ raw_name<signed long int>(),
uniform_int<signed long int>::name },
uniform_int<signed long int>::name() },
{ raw_name<unsigned long int>(),
uniform_int<unsigned long int>::name },
uniform_int<unsigned long int>::name() },
{ raw_name<long long>(),
uniform_int<long long>::name },
uniform_int<long long>::name() },
{ raw_name<signed long long>(),
uniform_int<signed long long>::name },
uniform_int<signed long long>::name() },
{ raw_name<unsigned long long>(),
uniform_int<unsigned long long>::name },
// GCC dosn't return a standard compliant name for the std::string typedef
# ifdef CPPA_GCC
{ raw_name<std::string>(),
"std::basic_string<char,std::char_traits<char>,std::allocator<char>>" }
# endif
uniform_int<unsigned long long>::name() },
{ raw_name<std::string>(),
"@str" },
{ raw_name<std::wstring>(),
"@wstr" }
// "std::basic_string<char,std::char_traits<char>,std::allocator<char>>" }
};
btm_ptr.reset(value);
return *btm_ptr;
}
else
{
return *btm_ptr;
}
return *btm_ptr;
}
} // namespace <anonymous>
namespace cppa { namespace detail {
std::string demangle(const char* type_name)
std::string demangle_impl(const char* begin, const char* end, size_t size)
{
std::string result;
# ifdef CPPA_WINDOWS
result = type_name;
std::vector<std::string> needles;
needles.push_back("class ");
needles.push_back("struct ");
// the VC++ compiler adds "class " and "struct " before a type names
for (size_t i = 0; i < needles.size(); ++i)
// demangling of a template?
const char* pos = std::find(begin, end, '<');
if (pos == end)
{
const std::string& needle = needles[i];
bool string_changed = false;
do
{
// result is our haystack
size_t pos = result.find(needle);
if (pos != std::string::npos)
{
result.erase(pos, needle.size());
string_changed = true;
}
else string_changed = false;
}
while (string_changed);
return std::string(begin, size);
}
# elif defined(CPPA_GCC)
size_t size;
int status;
char* undecorated = abi::__cxa_demangle(type_name,
NULL, &size, &status);
assert(status == 0);
result = undecorated;
free(undecorated);
# else
# error "Unsupported plattform"
# endif
// template class?
std::string::size_type pos = result.find('<');
if (pos != std::string::npos)
else
{
// map every single template argument to uniform names
// skip leading '<'
++pos;
std::string processed_name(result, 0, pos);
processed_name.reserve(result.size());
std::string processed(begin, pos);
std::string tmp;
// replace all simple type names
for (std::string::size_type p = pos; p < result.size(); ++p)
// skip leading '<'
for ( ++pos; pos != end; ++pos)
{
switch (result[p])
char c = *pos;
switch (c)
{
case ',':
case '>':
case '<':
case ',':
case '>':
case '<':
{
// erase trailing whitespaces
while (!tmp.empty() && tmp[tmp.size() - 1] == ' ')
while (!tmp.empty() && (*(tmp.rbegin()) == ' '))
{
tmp.erase(tmp.size() - 1);
tmp.resize(tmp.size() - 1);
}
auto i = builtin_type_mappings().find(tmp);
if (i != builtin_type_mappings().end())
{
processed_name += i->second;
processed += i->second;
}
else
{
processed_name += tmp;
processed += tmp;
}
}
processed_name += result[p];
processed += c;
tmp.clear();
break;
case ' ':
case ' ':
if (tmp == "class" || tmp == "struct")
{
tmp.clear();
......@@ -226,38 +226,57 @@ std::string demangle(const char* type_name)
}
break;
default:
tmp += result[p];
default:
tmp += c;
break;
}
}
/*
if (!m_complex_mappings.empty())
return processed;
}
}
std::string demangle(const char* decorated_type_name)
{
# ifdef CPPA_WINDOWS
result = type_name;
std::vector<std::string> needles;
needles.push_back("class ");
needles.push_back("struct ");
// the VC++ compiler adds "class " and "struct " before a type names
for (size_t i = 0; i < needles.size(); ++i)
{
const std::string& needle = needles[i];
bool string_changed = false;
do
{
// perform a lookup for complex types, such as template types
for (string_map::const_iterator i = m_complex_mappings.begin();
i != m_complex_mappings.end();
++i)
// result is our haystack
size_t pos = result.find(needle);
if (pos != std::string::npos)
{
const std::string& needle = i->first;
std::string::size_type x = processed_name.find(needle);
if (x != std::string::npos)
{
processed_name.replace(x, needle.size(), i->second);
}
result.erase(pos, needle.size());
string_changed = true;
}
else string_changed = false;
}
*/
result = processed_name;
while (string_changed);
}
else
# elif defined(CPPA_GCC)
size_t size = 0;
int status = 0;
char* undecorated = abi::__cxa_demangle(decorated_type_name,
NULL, &size, &status);
assert(status == 0);
std::string result = demangle_impl(undecorated, undecorated + size, size);
free(undecorated);
# else
# error "Unsupported plattform"
# endif
// template class?
auto i = builtin_type_mappings().find(result);
if (i != builtin_type_mappings().end())
{
auto i = builtin_type_mappings().find(result);
if (i != builtin_type_mappings().end())
{
result = i->second;
}
result = i->second;
}
return result;
}
......
......@@ -26,6 +26,7 @@ using std::endl;
int main(int argc, char** c_argv)
{
std::vector<std::string> argv;
for (int i = 1; i < argc; ++i)
{
......
......@@ -34,10 +34,6 @@ if ((lhs_loc) != (rhs_loc)) \
++error_count; \
} ((void) 0)
unsigned int hash_of(const char* what, int what_length);
unsigned int hash_of(const std::string& what);
std::size_t test__type_list();
std::size_t test__a_matches_b();
std::size_t test__atom();
......
......@@ -3,6 +3,7 @@
#include <iostream>
#include "test.hpp"
#include "hash_of.hpp"
#include "cppa/util.hpp"
using std::cout;
......
#include "test.hpp"
#include "hash_of.hpp"
#include "cppa/on.hpp"
#include "cppa/spawn.hpp"
......@@ -124,11 +125,19 @@ group_table<100> m_groups;
} // namespace <anonymous>
namespace {
intrusive_ptr<group> local_group = new group;
}
struct
{
intrusive_ptr<group> operator/(const std::string& group_name)
intrusive_ptr<group> operator/(const std::string& /*group_name*/)
{
return m_groups[group_name];
return local_group;
// return m_groups[group_name];
}
}
local;
......@@ -159,15 +168,29 @@ struct storage
};
template<typename... Args>
void send(std::list<actor>& actors, const Args&... args)
{
for (auto i = actors.begin(); i != actors.end(); ++i)
{
i->send(args...);
}
}
void foo_actor()
{
auto x = (local/"foobar")->subscribe(this_actor());
receive(on<int, int, int>() >> []() {
reply(23.f);
});
receive(on<int>() >> [](int i) {
reply(i);
});
// auto x = (local/"foobar")->subscribe(this_actor());
auto rules = (
on<int, int, int>() >> []() {
reply(23.f);
},
on<int>() >> [](int i) {
reply(i);
}
);
receive(rules);
receive(rules);
// reply(1);
}
std::size_t test__local_group()
......@@ -188,29 +211,32 @@ std::size_t test__local_group()
*/
auto g = local/"foobar";
// auto g = local/"foobar";
std::list<actor> m_slaves;
for (int i = 0; i < 5; ++i)
{
spawn(foo_actor).send(1, 2, 3);
m_slaves.push_back(spawn(foo_actor));
}
send(m_slaves, 1, 2, 3);
send(m_slaves, 1);
for (int i = 0; i < 5; ++i)
{
receive(on<float>() >> []() { });
}
g->send(1);
// g->send(1);
int result = 0;
auto rule = on<int>() >> [&result](int x) {
result += x;
};
for (int i = 0; i < 5; ++i)
{
receive(rule);
receive(on<int>() >> [&result](int x) {
result += x;
});
}
CPPA_CHECK_EQUAL(result, 5);
......
......@@ -195,7 +195,7 @@ struct obj_types : util::abstract_type_list
~obj_types()
{
delete m_arr;
delete[] m_arr;
}
virtual std::size_t size() const { return m_size; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment