Compare commits

..

1 Commits
master ... sync

@ -1,42 +0,0 @@
BasedOnStyle: LLVM
Language: Cpp
Standard: c++11
DerivePointerAlignment: true
SortIncludes: false
ReflowComments: false
PointerAlignment: Left
AlignAfterOpenBracket: AlwaysBreak
AlignOperands: AlignAfterOperator
BreakConstructorInitializers: AfterColon
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
ExperimentalAutoDetectBinPacking: true
BreakBeforeBraces: Custom
BraceWrapping:
AfterFunction: true
ColumnLimit: 100
AllowAllConstructorInitializersOnNextLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
PenaltyBreakBeforeFirstCallParameter: 0
PenaltyReturnTypeOnItsOwnLine: 1000000
PenaltyBreakAssignment: 1000000
PenaltyExcessCharacter: 10
IndentCaseLabels: true
IndentWidth: 4
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
SpaceAfterTemplateKeyword: false
AccessModifierOffset: -4
AllowShortBlocksOnASingleLine: Always
IndentPPDirectives: BeforeHash
Cpp11BracedListStyle: false
BreakStringLiterals: false

59
.gitignore vendored

@ -1,59 +0,0 @@
*.o
*.a
*.d
*.swp
.DS_Store
ws
test_adapter
.gnupg
.pEp*
lib
local.conf
build/
# Default ignored files
?idea/
# Windows
build-windows/Debug/
build-windows/Release/
build-windows/libpEpAdapter.vcxproj.user
*.dSYM
test_group
test_adapter_cxx
test_ensure_passphrase
test_leave_device_group
test_library
test_message_cache
test_passphrase_cache
test_semaphore
test_lm_dummy
test_sqlite3
test_pEpsqlite
test_listmanager_dummy
test_tofu_react
test_pEpLog_basic
/test/pitytest_data
*.db
/test/pitytest11/test/test_transport
/test/pitytest11/test/test_processdirs
/test/pitytest11/test/test_execmodes
/test/pitytest11/test/test_linear
/test/pitytest11/test/test_model
/test/pitytest11/pitytest_data/*
/test/pitytest11/test/test_swarm
/test/test_update_ident
/test/test_template_swarm_single
/test/test_template_swarm_multi
/test/pitytest11/test/test_copy
/test/pitytest11/test/test_pitytree
/test/test_suite_all
/test/test_sync_init
/test/test_tofu2
/test/pitytest11/test/test_assert
/test/test_tofu
/test/test_tofu_one2many
/test/test_swarm_group
/test/pitytest11/test/pitytest_data/
/test/test_pEpSQLite
/test/test_swarm_tofu

@ -1,22 +0,0 @@
.ensure_docker: &ensure_docker
# Check for docker and install if missing
- 'which docker || ( sudo apt-get update -y && sudo apt-get install docker.io -y )'
.ensure_rsync: &ensure_rsync
# Install rsync and deps if missing
- 'which ssh-agent || ( sudo apt-get update -y && sudo apt-get install openssh-client -y )'
- 'which rsync || ( sudo apt-get update -y && sudo apt-get install rsync -y )'
- 'which make || ( sudo apt-get update -y && sudo apt-get install make -y )'
.standard_job:
tags: [kvm]
before_script:
- *ensure_docker
- *ensure_rsync
.make_in_docker:
extends: .standard_job
script:
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PASS} ${DOCKER_REGISTRY_HOST}
- cd scripts/${CI_DISTRO_TARGET}
- make

@ -1,27 +0,0 @@
include:
- '.gitlab-ci-files/common-prepare.yml'
stages:
- build
# Debian
debian10:build:
extends: .make_in_docker
stage: build
variables:
CI_DISTRO_TARGET: "debian10"
DEBIAN_FRONTEND: "noninteractive"
rules:
- if: '$CI_COMMIT_TAG !~ /^Release_[0-9]+\.[0-9]+\.[0-9]+$/'
debian10:tagged-build:
extends: .make_in_docker
stage: build
variables:
CI_DISTRO_TARGET: "debian10"
DEBIAN_FRONTEND: "noninteractive"
TAGGED_BUILD: "true"
rules:
- if: '$CI_COMMIT_TAG =~ /^Release_[0-9]+\.[0-9]+\.[0-9]+$/'

@ -0,0 +1,13 @@
syntax: glob
*.o
*.a
*.swp
ws
test_adapter
.gnupg
.pEp*
lib
local.conf
build/
# Default ignored files
.idea/workspace.xml

@ -0,0 +1,138 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#include "Adapter.hh"
#include <sstream>
#include <iomanip>
#include <assert.h>
#include "status_to_string.hh"
#include "pEpLog.hh"
using namespace std;
namespace pEp {
void throw_status(PEP_STATUS status)
{
if (status == PEP_STATUS_OK)
return;
if (status >= 0x400 && status <= 0x4ff)
return;
if (status == PEP_OUT_OF_MEMORY)
throw bad_alloc();
if (status == PEP_ILLEGAL_VALUE)
throw invalid_argument("illegal value");
string _status = status_to_string(status);
throw RuntimeError(_status, status);
}
RuntimeError::RuntimeError(const std::string& _text, PEP_STATUS _status)
: std::runtime_error(_text.c_str()), text(_text), status(_status)
{
}
namespace Adapter {
messageToSend_t _messageToSend = nullptr;
notifyHandshake_t _notifyHandshake = nullptr;
std::thread *_sync_thread = nullptr;
::utility::locked_queue< SYNC_EVENT, ::free_Sync_event > q;
std::mutex m;
int _inject_sync_event(SYNC_EVENT ev, void *management)
{
try {
if (ev == nullptr) {
q.clear();
q.push_back(ev);
}
else {
q.push_front(ev);
}
}
catch (exception&) {
return 1;
}
if (ev == nullptr) {
if (!on_sync_thread()) {
if(_sync_thread->joinable()) {
pEpLog("Waiting for Sync thread to join...");
_sync_thread->join();
delete _sync_thread;
_sync_thread = nullptr;
pEpLog("...thread joined");
q.clear();
} else {
//FATAL
pEpLog("FATAL: sync thread not joinable/detached");
}
}
}
return 0;
}
// threshold: max waiting time in seconds
SYNC_EVENT _retrieve_next_sync_event(void *management, unsigned threshold)
{
SYNC_EVENT syncEvent = nullptr;
const bool success = q.try_pop_front(syncEvent, std::chrono::seconds(threshold));
if (!success)
return new_sync_timeout_event();
return syncEvent;
}
bool on_sync_thread()
{
if (_sync_thread && _sync_thread->get_id() == this_thread::get_id())
return true;
else
return false;
}
PEP_SESSION session(session_action action)
{
std::lock_guard<mutex> lock(m);
bool in_sync = on_sync_thread();
thread_local static PEP_SESSION _session = nullptr;
PEP_STATUS status = PEP_STATUS_OK;
switch (action) {
case release:
if (_session) {
::release(_session);
_session = nullptr;
}
break;
case init:
if (!_session)
status = ::init(&_session, _messageToSend, _inject_sync_event);
break;
default:
status = PEP_ILLEGAL_VALUE;
}
throw_status(status);
return _session;
}
void shutdown()
{
pEpLog("called");
if (_sync_thread) {
pEpLog("sync_is_running - injecting null event");
_inject_sync_event(nullptr, nullptr);
}
}
bool is_sync_running()
{
return _sync_thread != nullptr;
}
}
}

@ -0,0 +1,53 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#pragma once
#include <functional>
#include <string>
#include <pEp/sync_api.h>
#include <stdexcept>
namespace pEp {
// throws std::bad_alloc if status==PEP_OUT_OF_MEMORY,
// throws std::invalid_argument if status==PEP_ILLEGAL_VALUE,
// throws RuntimeError when 'status' represents another exceptional value.
void throw_status(PEP_STATUS status);
struct RuntimeError : std::runtime_error {
RuntimeError(const std::string& _text, PEP_STATUS _status);
std::string text;
PEP_STATUS status;
};
namespace Adapter {
int _inject_sync_event(SYNC_EVENT ev, void *management);
template<class T = void>
void startup(
messageToSend_t messageToSend,
notifyHandshake_t notifyHandshake,
T *obj = nullptr,
std::function< void (T *) > _startup = nullptr,
std::function< void (T *) > _shutdown = nullptr
) throw (RuntimeError);
// returns 'true' when called from the "sync" thread, 'false' otherwise.
bool on_sync_thread();
enum session_action {
init,
release
};
PEP_SESSION session(session_action action = init);
// injects a NULL event into sync_event_queue to denote sync thread to shutdown,
// and joins & removes the sync thread
void shutdown();
bool is_sync_running();
}
}
#include "Adapter.hxx"

@ -0,0 +1,93 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#pragma once
#include <thread>
#include "locked_queue.hh"
#include <cassert>
#include "pEpLog.hh"
namespace pEp {
namespace Adapter {
using std::function;
extern messageToSend_t _messageToSend;
extern notifyHandshake_t _notifyHandshake;
extern std::thread *_sync_thread;
extern ::utility::locked_queue< SYNC_EVENT, ::free_Sync_event > q;
extern std::mutex m;
SYNC_EVENT _retrieve_next_sync_event(void *management, unsigned threshold);
static std::exception_ptr _ex;
static bool register_done = false;
template< class T > void sync_thread(T *obj, function< void(T *) > _startup, function< void(T *) > _shutdown)
{
_ex = nullptr;
assert(_messageToSend);
assert(_notifyHandshake);
if (obj && _startup)
_startup(obj);
session();
{
PEP_STATUS status = register_sync_callbacks(session(), nullptr,
_notifyHandshake, _retrieve_next_sync_event);
try {
throw_status(status);
register_done = true;
}
catch (...) {
_ex = std::current_exception();
register_done = true;
return;
}
}
pEpLog("sync protocol loop started");
do_sync_protocol(session(), (void *)obj);
pEpLog("sync protocol loop ended");
unregister_sync_callbacks(session());
session(release);
if (obj && _shutdown)
_shutdown(obj);
}
template< class T > void startup(
messageToSend_t messageToSend,
notifyHandshake_t notifyHandshake,
T *obj,
function< void(T *) > _startup,
function< void(T *) > _shutdown
)
throw (RuntimeError)
{
if (messageToSend)
_messageToSend = messageToSend;
if (notifyHandshake)
_notifyHandshake = notifyHandshake;
session();
if (!_sync_thread) {
register_done = false;
_sync_thread = new std::thread(sync_thread<T>, obj, _startup, _shutdown);
while (!register_done)
std::this_thread::sleep_for(std::chrono::milliseconds(100));
if (_ex) {
delete _sync_thread;
_sync_thread = nullptr;
std::rethrow_exception(_ex);
}
}
}
}
}

@ -1,12 +0,0 @@
# 1st Party Dependencies
## Prefer git tags instead of SHA hashes when possible.
# Change:
# libpEpAdapter does not specify any dependencies atm.
# libpEpAdapter is always being used as part of an adapter
# This adapter has to specify the pEpEngine version .e.g
# fdik: dep graph has to be taken from DEP file
# fdik: dependencies need to be resolved recursively from top to bottom
# fdik: stack then needs to be built from the bottom up

@ -3,22 +3,47 @@
# This file may be used under the terms of the GNU General Public License version 3
# see LICENSE.txt
.PHONY: src test install uninstall clean
include Makefile.conf
all: src
ifneq ($(wildcard local.conf),)
$(info ================================================)
$(info Overrides in `local.conf` are used.)
$(info ================================================)
endif
src:
$(MAKE) -C src
ifdef BUILD_CONFIG
$(info ================================================)
$(info Overrides in `$(BUILD_CONFIG)` are used.)
$(info ================================================)
endif
test: src
$(MAKE) -C test
.PHONY: all, lib, test, install, uninstall, clean
SOURCE=$(wildcard *.cc)
HEADERS=$(wildcard *.hh *.hxx)
OBJECTS=$(subst .cc,.o,$(SOURCE))
TARGET=libpEpAdapter.a
lib: $(TARGET)
all: lib test
test: lib
$(MAKE) -C test all
$(TARGET): $(OBJECTS)
$(AR) -rc $@ $^
clean:
$(MAKE) -C src clean
rm -vf $(TARGET) $(OBJECTS)
$(MAKE) -C test clean
install:
$(MAKE) -C src install
install: $(TARGET)
mkdir -p $(PREFIX)/include/pEp
mkdir -p $(PREFIX)/lib
cp -v $(HEADERS) $(PREFIX)/include/pEp/
cp -v $(TARGET) $(PREFIX)/lib/
uninstall:
$(MAKE) -C src uninstall
cd $(PREFIX)/include/pEp && rm -vf $(HEADERS)
cd $(PREFIX)/lib && rm -vf $(TARGET)

@ -1,40 +1,53 @@
# Copyright 2018, pEp Foundation
# This file is part of libpEpAdapter
# This file is part of lib pEp Adapter
# This file may be used under the terms of the GNU General Public License version 3
# see LICENSE.txt
HERE:=$(dir $(lastword $(MAKEFILE_LIST)))
TARGET=libpEpAdapter.a
# Build config
# Defaults
DEBUG=1
PREFIX?=$(HOME)
CXXFLAGS+=-std=c++11 -fPIC
PREFIX=$(HOME)
CXXFLAGS=-std=c++11
# Overrides
-include $(HERE)local.conf
# Build target
BUILD_FOR:=$(shell uname)
# Constants
CXXFLAGS+=-std=c++11 -fPIC
CXXFLAGS+=-I$(PREFIX)/include
LDFLAGS+=-L$(PREFIX)/lib
ifneq (,$(findstring g++,$(CXX)))
CXXFLAGS+=-fdiagnostics-color=always
else ifneq (,$(findstring clang,$(CXX)))
CXXFLAGS+=-fcolor-diagnostics
ifeq ($(BUILD_FOR),Linux)
$(info Building for Linux)
CXX=g++
CXXFLAGS+=-fdiagnostics-color=always -O0 $(ENGINE_INC) -fPIC
else ifeq ($(BUILD_FOR),Darwin)
$(info Building for Darwin)
CXX=clang
CXXFLAGS+=-fcolor-diagnostics -O0 $(ENGINE_INC)
endif
# Debug or Release build
DEBUG=1
ifeq ($(DEBUG),1)
CXXFLAGS+=-g -O0
$(info Debug build (set DEBUG=0 for release build))
CXXFLAGS+=-g
else
CXXFLAGS+=-DNDEBUG=1 -O3
$(info Release Build (set DEBUG=1 for debug build))
CXXFLAGS+=-DNDEBUG=1
endif
ifndef ENGINE_TEST
ENGINE_TEST = \"$(HOME)/dev/pEpEngine/test\"
######### Engine #########
ENGINE_LIB_PATH=$(HOME)/lib
ENGINE_INC_PATH=$(HOME)/include
######### Overrides #########
-include $(HERE)/local.conf
# Add -L Prefixes to LIB/INC paths,
# if not already explicitly set in local.conf
ifndef ENGINE_LIB
ENGINE_LIB=-L$(ENGINE_LIB_PATH)
endif
ifndef ENGINE_INC
ENGINE_INC=-I$(ENGINE_INC_PATH)
endif
ifdef BUILD_CONFIG
include $(BUILD_CONFIG)
endif

@ -18,14 +18,17 @@ LOCAL_CPPFLAGS += -std=c++14 -DANDROID_STL=c++_shared
STUB = $(shell sh $(LOCAL_PATH)/../takeOutHeaderFiles.sh $(LOCAL_PATH)/../../../pEpEngine/ $(LOCAL_PATH)/../../)
$(info $(STUB))
LIB_PEP_ADAPTER_INCLUDE_FILES := $(wildcard $(LOCAL_PATH)/../../src/*.h*)
LIB_PEP_ADAPTER_INCLUDE_FILES := $(wildcard $(LOCAL_PATH)/../../*.h*)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../pEpEngine/build-android/include \
$(LIB_PEP_ADAPTER_INCLUDE_FILES:%=%)
LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)../include
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../src/*.cc)
LOCAL_SRC_FILES += $(LOCAL_PATH)/../../Adapter.cc \
$(LOCAL_PATH)/../../slurp.cc \
$(LOCAL_PATH)/../../call_with_lock.cc \
$(LOCAL_PATH)/../../status_to_string.cc
include $(BUILD_STATIC_LIBRARY)

@ -6,5 +6,5 @@ engine_dir="$1"
adapter_dir="$2"
mkdir -p "$engine_dir/build-android/include/pEp"
cp $2/src/*.h* "$engine_dir/build-android/include/pEp"
cp $2/*.h* "$engine_dir/build-android/include/pEp"

@ -1,450 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\*.cc">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\*.hh">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

@ -0,0 +1,8 @@
// this file is under GNU GPL 3.0, see LICENSE.txt
#include "call_with_lock.hh"
namespace pEp
{
std::mutex call_with_lock_mutex;
}

@ -0,0 +1,25 @@
// this file is under GNU GPL 3.0, see LICENSE.txt
#ifndef PEP_CALL_WITH_LOCK_HH
#define PEP_CALL_WITH_LOCK_HH
#include <mutex>
namespace pEp
{
extern std::mutex call_with_lock_mutex;
// TODO: use && and std::forward<> to avoid copying of the arguments.
// It is not relevant, yet, because at the moment we use this function template only
// for init() and release() which have cheap-to-copy pointer parameters only
template<class R, class... Args>
R call_with_lock( R(*fn)(Args...), Args... args)
{
std::lock_guard<std::mutex> L(call_with_lock_mutex);
return fn(args...);
}
}
#endif // PEP_CALL_WITH_LOCK_HH

@ -58,13 +58,18 @@
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_LIB;_EXPORT_PEP_ENGINE_DLL;_CRT_SECURE_NO_WARNINGS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<EnablePREfast>false</EnablePREfast>
<AdditionalIncludeDirectories>$(ProjectDir)src;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
<PostBuildEvent>
<Command>xcopy /i/y "$(ProjectDir)..\slurp.hh" "$(SolutionDir)pEp\"
xcopy /i/y "$(ProjectDir)..\locked_queue.hh" "$(SolutionDir)pEp\"
xcopy /i/y "$(ProjectDir)..\status_to_string.hh" "$(SolutionDir)pEp\"
xcopy /i/y "$(ProjectDir)..\call_with_lock.hh" "$(SolutionDir)pEp\"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
@ -74,32 +79,37 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_LIB;_EXPORT_PEP_ENGINE_DLL;_CRT_SECURE_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<EnablePREfast>false</EnablePREfast>
<AdditionalIncludeDirectories>$(ProjectDir)src;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent>
<Command>xcopy /i/y "$(ProjectDir)..\slurp.hh" "$(SolutionDir)pEp\"
xcopy /i/y "$(ProjectDir)..\locked_queue.hh" "$(SolutionDir)pEp\"
xcopy /i/y "$(ProjectDir)..\status_to_string.hh" "$(SolutionDir)pEp\"
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\*.cc" />
<ClCompile Include="..\..\pEpEngine\src\sqlite3.c" />
<ClCompile Include="..\Adapter.cc" />
<ClCompile Include="..\call_with_lock.cc" />
<ClCompile Include="..\slurp.cc" />
<ClCompile Include="..\status_to_string.cc" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\*.h" />
<ClInclude Include="..\src\*.hh" />
<ClInclude Include="..\src\*.hxx" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\pEpEngine\build-windows\pEpEngine.vcxproj">
<Project>{146e69f8-e1da-456a-b048-6dd29d9acf6b}</Project>
</ProjectReference>
<ClInclude Include="..\Adapter.hh" />
<ClInclude Include="..\Adapter.hxx" />
<ClInclude Include="..\locked_queue.hh" />
<ClInclude Include="..\pc_container.hh" />
<ClInclude Include="..\slurp.hh" />
<ClInclude Include="..\status_to_string.hh" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\Adapter.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\status_to_string.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\call_with_lock.cc">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\slurp.cc">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Adapter.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\locked_queue.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\pc_container.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Adapter.hxx">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="..\status_to_string.hh">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\slurp.hh">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

@ -1,16 +0,0 @@
# This is an Example build config file (local.conf)
# you might not need this file, but if the defaults dont work for you
# You can override them here.
# Tweak the values to your needs and rename it to local.conf
######### C++ Compiler #########
# Should work with clang and g++
# CXX=g++
# DEBUG=1 # DEBUG Build (Default)
# DEBUG=0 # RELEASE Build
############# DIRS #############
# PREFIX=$(HOME)/local
# ENGINE_LIB_PATH=$(PREFIX)/lib
# ENGINE_INC_PATH=$(PREFIX)/include
# ENGINE_TEST=

@ -1,23 +1,23 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#ifndef LIBPEPADAPTER_LOCKED_QUEUE_HH
#define LIBPEPADAPTER_LOCKED_QUEUE_HH
#pragma once
#include <deque>
#include <list>
#include <condition_variable>
#include <mutex>
namespace utility {
template<class T, void (*Deleter)(T) = nullptr>
class locked_queue {
typedef std::recursive_mutex Mutex;
typedef std::unique_lock<Mutex> Lock;
int _waiting = 0;
Mutex _mtx;
std::condition_variable_any _cv;
std::deque<T> _q;
namespace utility
{
template<class T, void(*Deleter)(T) = nullptr>
class locked_queue
{
typedef std::recursive_mutex Mutex;
typedef std::unique_lock<Mutex> Lock;
Mutex _mtx;
std::condition_variable_any _cv;
std::list<T> _q;
public:
~locked_queue()
@ -28,29 +28,27 @@ namespace utility {
void clear()
{
Lock L(_mtx);
if (Deleter != nullptr) {
for (auto q : _q) {
if(Deleter != nullptr)
{
for(auto q : _q)
{
Deleter(q);
}
}
_q.clear();
}
// defined behavior when queue empty
T back()
// undefined behavior when queue empty
T& back()
{
Lock lg(_mtx);
if (_q.empty())
throw std::underflow_error("queue empty");
return _q.back();
}
// defined behavior when queue empty
T front()
// undefined behavior when queue empty
T& front()
{
Lock lg(_mtx);
if (_q.empty())
throw std::underflow_error("queue empty");
return _q.front();
}
@ -59,7 +57,7 @@ namespace utility {
T pop_back()
{
Lock L(_mtx);
_cv.wait(L, [&] { return !_q.empty(); });
_cv.wait(L, [&]{ return !_q.empty(); } );
T r{std::move(_q.back())};
_q.pop_back();
return r;
@ -70,7 +68,7 @@ namespace utility {
T pop_front()
{
Lock L(_mtx);
_cv.wait(L, [&] { return !_q.empty(); });
_cv.wait(L, [&]{ return !_q.empty(); } );
T r{std::move(_q.front())};
_q.pop_front();
return r;
@ -81,30 +79,26 @@ namespace utility {
bool try_pop_back(T& out, std::chrono::steady_clock::time_point end_time)
{
Lock L(_mtx);
++_waiting;
if (!_cv.wait_until(L, end_time, [this] { return !_q.empty(); })) {
--_waiting;
if(! _cv.wait_until(L, end_time, [this]{ return !_q.empty(); } ) )
{
return false;
}
--_waiting;
out = std::move(_q.back());
_q.pop_back();
return true;
}
// returns true and set a copy of the first element and pop it from queue if there is any
// returns false and leaves 'out' untouched if queue is empty even after 'end_time'
bool try_pop_front(T& out, std::chrono::steady_clock::time_point end_time)
{
Lock L(_mtx);
++_waiting;
if (!_cv.wait_until(L, end_time, [this] { return !_q.empty(); })) {
--_waiting;
if(! _cv.wait_until(L, end_time, [this]{ return !_q.empty(); } ) )
{
return false;
}
--_waiting;
out = std::move(_q.front());
_q.pop_front();
return true;
@ -115,13 +109,11 @@ namespace utility {
bool try_pop_front(T& out, std::chrono::seconds duration)
{
Lock L(_mtx);
++_waiting;
if (!_cv.wait_for(L, duration, [this] { return !_q.empty(); })) {
--_waiting;
if(! _cv.wait_for(L, duration, [this]{ return !_q.empty(); } ) )
{
return false;
}
--_waiting;
out = std::move(_q.front());
_q.pop_front();
return true;
@ -166,15 +158,6 @@ namespace utility {
Lock lg(_mtx);
return _q.empty();
}
// returns the number of threads that are waiting in pop_...() or try_pop_...()
int waiting()
{
Lock L(_mtx);
return _waiting;
}
};
}
} // end of namespace utility
#endif // LIBPEPADAPTER_LOCKED_QUEUE_HH

@ -0,0 +1,7 @@
// TODO: put into not yet existing libpEpAdapter_utils.h, to be across whole libpEpAdapter
#ifdef NDEBUG
#define pEpLog(msg) do{}while(0)
#else
#include <iostream>
#define pEpLog(msg) do{std::cerr << __FILE__ << "::" << __FUNCTION__ << " - " << msg << '\n';} while(0)
#endif

@ -1,14 +1,12 @@
// This file is under GNU General Public License 3.0
// see LICENSE.txt
#ifndef LIBPEPADAPTER_PC_CONTAINER_HH
#define LIBPEPADAPTER_PC_CONTAINER_HH
#pragma once
// Container adapter that contains a container and a producer/consume queue
// Conainer adapter that contains a container and a producer/consume queue
// that holds references to all changed elements
#include <functional>
#include <list>
#include "locked_queue.hh"
namespace pEp
@ -83,5 +81,4 @@ private:
};
} // end of namespace pEp
#endif // LIBPEPADAPTER_PC_CONTAINER_HH

@ -1,15 +0,0 @@
CURRENT_DISTRO=$(shell basename $(shell pwd))
LIBPEPADAPTER_VERSION=$(shell git rev-parse --short=8 HEAD)
IMAGE_NAME=${DOCKER_REGISTRY_HOST}/pep-$(CURRENT_DISTRO)-libpepadapter
DOCKERFILE=libpEpAdapter.$(CURRENT_DISTRO).Dockerfile
all:
-docker pull $(IMAGE_NAME):latest
cd ../../ && docker build --build-arg CURRENT_DISTRO=$(CURRENT_DISTRO) \
--build-arg DOCKER_REGISTRY_HOST=${DOCKER_REGISTRY_HOST} \
--build-arg LIBPEPADAPTER_VERSION=$(LIBPEPADAPTER_VERSION) \
--cache-from $(IMAGE_NAME):latest \
--tag=$(IMAGE_NAME):$(LIBPEPADAPTER_VERSION) \
--tag=$(IMAGE_NAME):latest \
-f scripts/${CURRENT_DISTRO}/$(DOCKERFILE) .
docker push $(IMAGE_NAME):${LIBPEPADAPTER_VERSION}
docker push $(IMAGE_NAME):latest

@ -1,8 +0,0 @@
#!/usr/bin/env sh
set -exo
echo "ENGINE_LIB_PATH=${INSTPREFIX}/lib" >> local.conf
echo "ENGINE_INC_PATH=${INSTPREFIX}/include" >> local.conf
make