Skip to content
This repository has been archived by the owner on Sep 4, 2021. It is now read-only.

Commit

Permalink
Merge pull request #5 from nemomobile/staging
Browse files Browse the repository at this point in the history
out-of-source build, use cor cmake macros, generic actor implementation
  • Loading branch information
Denis Zalevskiy committed Feb 9, 2015
2 parents 74e1d1e + bf7f438 commit 5e336c8
Show file tree
Hide file tree
Showing 8 changed files with 520 additions and 41 deletions.
40 changes: 8 additions & 32 deletions CMakeLists.txt
Expand Up @@ -9,52 +9,28 @@ IF(NOT DEFINED LONG_VERSION OR LONG_VERSION STREQUAL "")
set(LONG_VERSION ${VERSION})
ENDIF(NOT DEFINED LONG_VERSION OR LONG_VERSION STREQUAL "")

option(ENABLE_MULTIARCH "Enable support for multi-arch distros (lib64)" OFF)
IF(ENABLE_MULTIARCH)
IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
SET(LIB_SUFFIX "")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 4)
SET(LIB_SUFFIX 64)
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 4)
ELSE()
SET(LIB_SUFFIX "")
ENDIF()
set(DST_LIB lib${LIB_SUFFIX})

message(STATUS "Version ${VERSION}")
message(STATUS "Long version is ${LONG_VERSION}")
message(STATUS "Multiarch is ${ENABLE_MULTIARCH}")

find_package(Cor REQUIRED)
find_package(PkgConfig REQUIRED)
find_package(Qt5Core REQUIRED)

set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -fPIC -W -Wall -Wextra -Werror -g -O2 -std=c++0x")

#-Wno-psabi is to remove next g++ warning/note:
#the mangling of 'va_list' has changed in GCC 4.4
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wno-psabi")

# fix for gcc 4.6 specific compiling/linking issues, no dwarf-4
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -gdwarf-3"
)

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
)

pkg_check_modules(COR cor REQUIRED)

include_directories(
${COR_INCLUDE_DIRS}
)
link_directories(
${COR_LIBRARY_DIRS}
)

set(QTAROUND_DBUS_HEADERS ${CMAKE_SOURCE_DIR}/include/qtaround/dbus.hpp)
set(QTAROUND_DBUS_MOC_HEADERS
${CMAKE_SOURCE_DIR}/include/qtaround/dbus.hpp
)

set(QTAROUND_MOC_HEADERS
${CMAKE_SOURCE_DIR}/include/qtaround/mt.hpp
)

add_subdirectory(src)
add_subdirectory(tests)
Expand Down
81 changes: 81 additions & 0 deletions include/qtaround/mt.hpp
@@ -0,0 +1,81 @@
#ifndef _QTAROUND_MT_HPP_
#define _QTAROUND_MT_HPP_
/**
* @file mt.hpp
* @brief Concurrency support
* @copyright (C) 2014 Jolla Ltd.
* @par License: LGPL 2.1 http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
*/

#include <qtaround/util.hpp>
#include <QThread>
#include <QCoreApplication>

namespace qtaround { namespace mt {

class Actor;

typedef std::shared_ptr<Actor> ActorHandle;
typedef std::function<UNIQUE_PTR(QObject) ()> qobj_ctor_type;
typedef std::function<void (ActorHandle)> actor_callback_type;

class ActorImpl;

class Actor : public QObject
{
Q_OBJECT
public:
Actor(QObject *parent);
virtual ~Actor();

Actor(Actor const&) = delete;
Actor& operator = (Actor const&) = delete;

static void create(qobj_ctor_type
, actor_callback_type
, QObject *parent = nullptr);

static ActorHandle createSync
(qobj_ctor_type, QObject *parent = nullptr);

bool postEvent(QEvent *);
bool sendEvent(QEvent *);
void quit();
bool quitSync(unsigned long timeout);

signals:
void finished(Actor*);

private:
friend class ActorImpl;
ActorImpl *impl_;
};

template <typename T>
void startActor
(std::function<UNIQUE_PTR(T) ()> ctor
, actor_callback_type cb
, QObject *parent = nullptr
, typename std::enable_if<std::is_convertible<T*, QObject*>::value>::type* = 0)
{
auto qobj_ctor = [ctor]() {
return static_cast_qobject_unique<QObject>(ctor());
};
Actor::create(qobj_ctor, cb, parent);
}

template <typename T>
ActorHandle startActorSync
(std::function<UNIQUE_PTR(T) ()> ctor, QObject *parent = nullptr
, typename std::enable_if<std::is_convertible<T*, QObject*>::value>::type* = 0)
{
auto qobj_ctor = [ctor]() {
return static_cast_qobject_unique<QObject>(ctor());
};
return Actor::createSync(qobj_ctor, parent);
}

void deleteOnApplicationExit(ActorHandle);
}}

#endif // _QTAROUND_MT_HPP_
33 changes: 33 additions & 0 deletions include/qtaround/util.hpp
Expand Up @@ -333,6 +333,24 @@ UNIQUE_PTR(T) make_qobject_unique(Args &&...args)
, get_qobject_deleter<T>());
}

template <typename T>
UNIQUE_PTR(T) acquire_qobject_unique(T *p)
{
return UNIQUE_PTR(T)(p, get_qobject_deleter<T>());
}

template <typename T>
UNIQUE_PTR(T) null_qobject_unique()
{
return acquire_qobject_unique<T>(nullptr);
}

template <typename To, typename From>
UNIQUE_PTR(To) static_cast_qobject_unique(UNIQUE_PTR(From) from)
{
return acquire_qobject_unique<To>(static_cast<To*>(from.release()));
}

template <typename T, typename ... Args>
std::shared_ptr<T> make_qobject_shared(Args &&...args)
{
Expand All @@ -353,6 +371,21 @@ std::shared_ptr<T> qobject_shared(UNIQUE_PTR(T) p)
return std::shared_ptr<T>(p.release(), get_qobject_deleter<T>());
}

template <typename T>
std::shared_ptr<QObject> qobject_shared_cast
(UNIQUE_PTR(T) p, typename std::enable_if
<std::is_convertible<T*, QObject*>::value>::type* = 0)
{
return qobject_shared(static_cast<QObject*>(p.release()));
}

template <typename To, typename From>
std::shared_ptr<To> static_cast_qobject_shared(UNIQUE_PTR(From) from)
{
auto p = static_cast_qobject_unique<To>(from);
return qobject_shared(std::move(p));
}

template <typename T>
UNIQUE_PTR(T) qobject_box(T &&v)
{
Expand Down
11 changes: 9 additions & 2 deletions rpm/qtaround.spec
@@ -1,3 +1,5 @@
%{!?cmake_install: %global cmake_install make install DESTDIR=%{buildroot}}

Summary: QtAround library
Name: qtaround
Version: 0.0.0
Expand All @@ -7,7 +9,7 @@ Group: Development/Liraries
URL: https://github.com/nemomobile/qtaround
Source0: %{name}-%{version}.tar.bz2
BuildRequires: cmake >= 2.8
BuildRequires: pkgconfig(cor) >= 0.1.16
BuildRequires: pkgconfig(cor) >= 0.1.17
BuildRequires: pkgconfig(tut) >= 0.0.3
BuildRequires: pkgconfig(Qt5Core) >= 5.2.0
Requires(post): /sbin/ldconfig
Expand Down Expand Up @@ -48,7 +50,11 @@ License: LGPLv2.1
Group: System Environment/Libraries
Requires: %{name} = %{version}-%{release}
Requires: %{name}-dbus = %{version}-%{release}
%if %{undefined suse_version}
Requires: btrfs-progs
%else
Requires: btrfsprogs
%endif
%description tests
%summary

Expand All @@ -61,7 +67,7 @@ make %{?jobs:-j%jobs}

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=%{buildroot}
%cmake_install

%clean
rm -rf $RPM_BUILD_ROOT
Expand All @@ -81,6 +87,7 @@ rm -rf $RPM_BUILD_ROOT
%{_includedir}/qtaround/subprocess.hpp
%{_includedir}/qtaround/sys.hpp
%{_includedir}/qtaround/util.hpp
%{_includedir}/qtaround/mt.hpp

%files dbus
%defattr(-,root,root,-)
Expand Down
7 changes: 6 additions & 1 deletion src/CMakeLists.txt
@@ -1,7 +1,12 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC TRUE)

qt5_wrap_cpp(QTAROUND_MOC_SRC ${QTAROUND_MOC_HEADERS})

add_library(qtaround SHARED
${QTAROUND_MOC_SRC}
debug.cpp os.cpp json.cpp sys.cpp subprocess.cpp util.cpp
mt.cpp
)
qt5_use_modules(qtaround Core)
target_link_libraries(qtaround ${COR_LIBRARIES})
Expand All @@ -11,7 +16,7 @@ set_target_properties(qtaround PROPERTIES
)
install(TARGETS qtaround DESTINATION ${DST_LIB})

qt5_wrap_cpp(QTAROUND_DBUS_SRC ${QTAROUND_DBUS_HEADERS})
qt5_wrap_cpp(QTAROUND_DBUS_SRC ${QTAROUND_DBUS_MOC_HEADERS})

add_library(qtaround-dbus SHARED
dbus.cpp
Expand Down

0 comments on commit 5e336c8

Please sign in to comment.