diff --git a/.travis.yml b/.travis.yml index 09b7eaa69..193e88287 100644 --- a/.travis.yml +++ b/.travis.yml @@ -95,7 +95,6 @@ after_success: deploy: - provider: script script: bash .travis/deploy.sh - skip_cleanup: true on: tags: true diff --git a/.travis/debian10/Dockerfile b/.travis/debian10/Dockerfile index c036e8c4d..efa0cff3f 100644 --- a/.travis/debian10/Dockerfile +++ b/.travis/debian10/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/debian8/Dockerfile b/.travis/debian8/Dockerfile index 5fcc76cdc..b3ba73f59 100644 --- a/.travis/debian8/Dockerfile +++ b/.travis/debian8/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN sed -i '/jessie-updates/d' /etc/apt/sources.list # Now archived RUN apt-get update && apt-get install -y \ diff --git a/.travis/debian9/Dockerfile b/.travis/debian9/Dockerfile index 388778fa7..cd6edd5b5 100644 --- a/.travis/debian9/Dockerfile +++ b/.travis/debian9/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/gcc-latest/Dockerfile b/.travis/gcc-latest/Dockerfile index c09dbc110..822a84e01 100644 --- a/.travis/gcc-latest/Dockerfile +++ b/.travis/gcc-latest/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/llvm-latest/Dockerfile b/.travis/llvm-latest/Dockerfile index 2d428aed3..c588d8e43 100644 --- a/.travis/llvm-latest/Dockerfile +++ b/.travis/llvm-latest/Dockerfile @@ -8,6 +8,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/ubuntu-20.04/Dockerfile b/.travis/ubuntu-20.04/Dockerfile index 791659a4f..243a09a10 100644 --- a/.travis/ubuntu-20.04/Dockerfile +++ b/.travis/ubuntu-20.04/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ff570e54..758277ee5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,6 @@ if (USE_PCH AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU|MSVC|Clang")) set(USE_PCH OFF) endif() -enable_testing() #need to define the version of the library set(MAJOR_VERSION "9") set(MINOR_VERSION "4") @@ -29,7 +28,7 @@ endif() #convenient versions set(LIBRARY_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}") -set(SO_VERSION "${MAJOR_VERSION}") +set(SO_VERSION "${MAJOR_VERSION}${MINOR_VERSION}") set(TANGO_HOST $ENV{TANGO_HOST}) include(configure/CMakeLists.txt) @@ -46,9 +45,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/log4tango/include) #source code add_subdirectory("log4tango") add_subdirectory("cppapi") -if(NOT WIN32) + +if(BUILD_TESTING) add_subdirectory("cpp_test_suite") -endif(NOT WIN32) +endif() if(WIN32) include(configure/cmake_win.cmake) diff --git a/INSTALL.md b/INSTALL.md index 38b530b21..009d3559d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -28,6 +28,7 @@ - `-DCMAKE_VERBOSE_MAKEFILE=true` - `-DTANGO_USE_USING_NAMESPACE=` choose `OFF` for modern builds - `-DUSE_PCH=` +- `-DBUILD_TESTING=` Build the test suite (`ON` by default) Typical output: diff --git a/appveyor.yml b/appveyor.yml index a1edcf666..07ae6a0d7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -135,16 +135,17 @@ install: - cmd: cd "C:\projects\cppTango" - cmd: set BOOST_ROOT=%BOOST_ROOT% - cmd: set ZMQ_BASE=C:/projects/zeromq/ + - cmd: set CPPZMQ_BASE=C:/projects/zeromq/ - cmd: set IDL_BASE=%IDL_BIN% - cmd: set OMNI_BASE=C:/projects/omniorb/ - cmd: set PTHREAD_WIN=C:/projects/pthreads-win32/ - cmd: if not defined USE_PCH set USE_PCH=OFF #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE . #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%CPPZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% -DBUILD_TESTING=OFF . - cmd: cd c:/projects/debug_build #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE -DCMAKE_BUILD_TYPE=Debug . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%CPPZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% -DBUILD_TESTING=OFF . clone_folder: C:\projects\cppTango @@ -189,9 +190,26 @@ on_finish: on_failure: #RDP for failure - - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) artifacts: - path: ./*.exe - path: ./*.zip - path: ./*.msi + +deploy: +- provider: GitHub + tag: $(APPVEYOR_REPO_TAG_NAME) + description: "Release $(APPVEYOR_REPO_TAG_NAME)" + auth_token: + # User: cppTango-bot + # Personal Access token with repo scope, encrypted via https://ci.appveyor.com/tools/encrypt + secure: KnvPAbdhmiTQxTLOGq7nyNs6d1JYbKVKspPgigzQ3fDrI+nkaxqWCw6UmRkS2Gqe + artifact: /.*/ + repository: tango-controls/cppTango + draft: true + prerelease: true + force_update: true + # deploy on tag push only + on: + APPVEYOR_REPO_TAG: true diff --git a/configure/CMakeLists.txt b/configure/CMakeLists.txt index 34e98406b..8dbae7717 100644 --- a/configure/CMakeLists.txt +++ b/configure/CMakeLists.txt @@ -239,3 +239,4 @@ include(GNUInstallDirs) include(configure/coveralls.cmake) option(TANGO_USE_USING_NAMESPACE "Use \"using namespace\" in header files (deprecated, but ON for backwards compatibility.)." ON) +option(TANGO_JPEG_MMX "Build MMX support" ON) diff --git a/configure/cmake_win.cmake b/configure/cmake_win.cmake index 8e6c2adba..8fca82497 100644 --- a/configure/cmake_win.cmake +++ b/configure/cmake_win.cmake @@ -165,8 +165,8 @@ install(DIRECTORY $ENV{OMNI_BASE}/include/omniVms DESTINATION include COMPONENT install(FILES $ENV{OMNI_BASE}/include/omniconfig.h DESTINATION include COMPONENT headers) install(FILES $ENV{OMNI_BASE}/include/omnithread.h DESTINATION include COMPONENT headers) install(FILES $ENV{ZMQ_BASE}/include/zmq.h DESTINATION include COMPONENT headers) -install(FILES $ENV{ZMQ_BASE}/include/zmq.hpp DESTINATION include COMPONENT headers) -install(FILES $ENV{ZMQ_BASE}/include/zmq_addon.hpp DESTINATION include COMPONENT headers) +install(FILES $ENV{CPPZMQ_BASE}/include/zmq.hpp DESTINATION include COMPONENT headers) +install(FILES $ENV{CPPZMQ_BASE}/include/zmq_addon.hpp DESTINATION include COMPONENT headers) install(FILES $ENV{ZMQ_BASE}/include/zmq_utils.h DESTINATION include COMPONENT headers) if (CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/cpp_test_suite/new_tests/cxx_dserver_misc.cpp b/cpp_test_suite/new_tests/cxx_dserver_misc.cpp index be97a45c4..3cbb353e9 100644 --- a/cpp_test_suite/new_tests/cxx_dserver_misc.cpp +++ b/cpp_test_suite/new_tests/cxx_dserver_misc.cpp @@ -6,6 +6,26 @@ #undef SUITE_NAME #define SUITE_NAME DServerMiscTestSuite +struct EventCallback : public Tango::CallBack +{ + EventCallback() + : num_of_all_events(0) + , num_of_error_events(0) + {} + + void push_event(Tango::EventData* event) + { + num_of_all_events++; + if (event->err) + { + num_of_error_events++; + } + } + + int num_of_all_events; + int num_of_error_events; +}; + class DServerMiscTestSuite: public CxxTest::TestSuite { protected: @@ -203,6 +223,38 @@ cout << "str = " << str << endl; TS_ASSERT(dserver->info().server_id == full_ds_name); TS_ASSERT(dserver->info().server_version == server_version); } + + /* Tests that subscriber can receive events immediately after + * a device restart without a need to wait for re-subscription. + */ + void test_event_subscription_recovery_after_device_restart() + { + EventCallback callback{}; + + std::string attribute_name = "event_change_tst"; + + TS_ASSERT_THROWS_NOTHING(device1->subscribe_event( + attribute_name, + Tango::USER_EVENT, + &callback)); + + TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOPushEvent")); + Tango_sleep(2); + TS_ASSERT_EQUALS(2, callback.num_of_all_events); + TS_ASSERT_EQUALS(0, callback.num_of_error_events); + + { + Tango::DeviceData input{}; + input << device1_name; + TS_ASSERT_THROWS_NOTHING(dserver->command_inout("DevRestart", input)); + } + + TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOPushEvent")); + Tango_sleep(2); + TS_ASSERT_EQUALS(3, callback.num_of_all_events); + TS_ASSERT_EQUALS(0, callback.num_of_error_events); + } + }; #undef cout #endif // DServerMiscTestSuite_h diff --git a/cppapi/client/attr_proxy.cpp b/cppapi/client/attr_proxy.cpp index 230b0d060..bb4dbffa3 100644 --- a/cppapi/client/attr_proxy.cpp +++ b/cppapi/client/attr_proxy.cpp @@ -412,14 +412,6 @@ void AttributeProxy::parse_name(std::string &full_name) { name_wo_prot = full_name.substr(pos + 3); } - else if (protocol == TACO_PROTOCOL) - { - TangoSys_OMemStream desc; - desc << "Taco protocol is not supported" << std::ends; - ApiWrongNameExcept::throw_exception((const char*)"API_UnsupportedProtocol", - desc.str(), - (const char*)"AttributeProxy::parse_name()"); - } else { TangoSys_OMemStream desc; diff --git a/cppapi/client/devapi.h b/cppapi/client/devapi.h index 11c16740a..9821c85e1 100644 --- a/cppapi/client/devapi.h +++ b/cppapi/client/devapi.h @@ -424,7 +424,6 @@ enum cb_sub_model #define CONNECTION_NOTOK 0 #define PROT_SEP "://" -#define TACO_PROTOCOL "taco" #define TANGO_PROTOCOL "tango" #define MODIFIER '#' diff --git a/cppapi/client/devapi_base.cpp b/cppapi/client/devapi_base.cpp index 10d3a52ba..83d1a9c94 100644 --- a/cppapi/client/devapi_base.cpp +++ b/cppapi/client/devapi_base.cpp @@ -2059,14 +2059,6 @@ void DeviceProxy::parse_name(std::string &full_name) { name_wo_prot = full_name_low.substr(pos + 3); } - else if (protocol == TACO_PROTOCOL) - { - TangoSys_OMemStream desc; - desc << "Taco protocol is not supported" << std::ends; - ApiWrongNameExcept::throw_exception((const char *) "API_UnsupportedProtocol", - desc.str(), - (const char *) "DeviceProxy::parse_name()"); - } else { TangoSys_OMemStream desc; diff --git a/cppapi/server/CMakeLists.txt b/cppapi/server/CMakeLists.txt index 2b9557324..4fd6c8377 100644 --- a/cppapi/server/CMakeLists.txt +++ b/cppapi/server/CMakeLists.txt @@ -128,7 +128,8 @@ set(HEADERS attrdesc.h w_pipe.tpp subdev_diag.h encoded_attribute.h - encoded_format.h) + encoded_format.h + event_subscription_state.h) add_subdirectory(idl) add_subdirectory(jpeg) diff --git a/cppapi/server/attribute.cpp b/cppapi/server/attribute.cpp index 8c8e3a941..d56ba9079 100644 --- a/cppapi/server/attribute.cpp +++ b/cppapi/server/attribute.cpp @@ -5313,7 +5313,7 @@ DeviceClass *Attribute::get_att_device_class(std::string &dev_name) // Check whether our device is listed in this class for (size_t i = 0; i < dev_list.size(); ++i) { - if (dev_list[i]->name() == dev_name) + if (dev_list[i]->get_name() == dev_name) { // Our device is listed in this class, returns the corresponding DeviceClass pointer return tmp_cl_list[loop]; @@ -5912,21 +5912,18 @@ bool Attribute::data_ready_event_subscribed() // //-------------------------------------------------------------------------------------------------------------------- -void Attribute::set_client_lib(int _l,std::string &ev_name) +void Attribute::set_client_lib(int client_lib_version, EventType event_type) { - cout4 << "Attribute::set_client_lib(" << _l << "," << ev_name << ")" << std::endl; - int i; - for (i = 0; i < numEventType; i++) - { - if (ev_name == EventName[i]) - { - break; - } - } + cout4 << "Attribute::set_client_lib(" + << client_lib_version << "," + << EventName[event_type] << ")" << std::endl; - if (count(client_lib[i].begin(), client_lib[i].end(), _l) == 0) + if (0 == count( + client_lib[event_type].begin(), + client_lib[event_type].end(), + client_lib_version)) { - client_lib[i].push_back(_l); + client_lib[event_type].push_back(client_lib_version); } } diff --git a/cppapi/server/attribute.h b/cppapi/server/attribute.h index 2a89a3d63..edd0940b1 100644 --- a/cppapi/server/attribute.h +++ b/cppapi/server/attribute.h @@ -2308,9 +2308,9 @@ class Attribute bool is_mem_exception() {return att_mem_exception;} virtual bool is_fwd_att() {return false;} - void set_client_lib(int,std::string &); + void set_client_lib(int, EventType); std::vector &get_client_lib(EventType _et) {return client_lib[_et];} - void remove_client_lib(int,const std::string &); + void remove_client_lib(int, const std::string &); void add_config_5_specific(AttributeConfig_5 &); void add_startup_exception(std::string,const DevFailed &); diff --git a/cppapi/server/device.cpp b/cppapi/server/device.cpp index d9834374c..d0ad011b1 100644 --- a/cppapi/server/device.cpp +++ b/cppapi/server/device.cpp @@ -6106,17 +6106,17 @@ void DeviceImpl::remove_local_command(const std::string &cmd_name) // //------------------------------------------------------------------------------------------------------------------ -void DeviceImpl::get_event_param(std::vector &eve) +void DeviceImpl::get_event_param(EventSubscriptionStates& eve) { ZmqEventSupplier *event_supplier_zmq = Util::instance()->get_zmq_event_supplier(); if (event_supplier_zmq->any_dev_intr_client(this) == true) { - EventPar ep; + EventSubscriptionState ep; ep.notifd = false; ep.zmq = true; - ep.attr_id = -1; + ep.attribute_name = ""; ep.quality = false; ep.data_ready = false; ep.dev_intr_change = true; @@ -6139,11 +6139,11 @@ void DeviceImpl::get_event_param(std::vector &eve) // //------------------------------------------------------------------------------------------------------------------ -void DeviceImpl::set_event_param(std::vector &eve) +void DeviceImpl::set_event_param(const EventSubscriptionStates& eve) { for (size_t loop = 0; loop < eve.size(); loop++) { - if (eve[loop].attr_id == -1) + if (eve[loop].attribute_name.empty()) { if (eve[loop].dev_intr_change == true) { diff --git a/cppapi/server/device.h b/cppapi/server/device.h index ed856a49b..30945bd83 100644 --- a/cppapi/server/device.h +++ b/cppapi/server/device.h @@ -45,6 +45,7 @@ #include #include #include +#include "event_subscription_state.h" namespace Tango { @@ -3423,8 +3424,8 @@ class DeviceImpl : public virtual POA_Tango::Device void disable_intr_change_ev() {intr_change_ev = false;} bool is_intr_change_ev_enable() {return intr_change_ev;} - void get_event_param(std::vector &); - void set_event_param(std::vector &); + void get_event_param(EventSubscriptionStates&); + void set_event_param(const EventSubscriptionStates&); void set_client_lib(int _l) {if (count(client_lib.begin(),client_lib.end(),_l)==0)client_lib.push_back(_l);} diff --git a/cppapi/server/dserver.cpp b/cppapi/server/dserver.cpp index c0eff10d0..049684b1c 100644 --- a/cppapi/server/dserver.cpp +++ b/cppapi/server/dserver.cpp @@ -882,7 +882,7 @@ void DServer::restart(std::string &d_name) std::vector &p_obj = dev_to_del->get_poll_obj_list(); std::vector dev_pol; - std::vector eve; + EventSubscriptionStates eve; for (i = 0;i < p_obj.size();i++) { @@ -1193,7 +1193,7 @@ void ServRestartThread::run(void *ptr) // Memorize event parameters and devices interface // - std::map > map_events; + ServerEventSubscriptionState map_events; std::map map_dev_inter; dev->mem_event_par(map_events); @@ -1977,14 +1977,14 @@ void DServer::mcast_event_for_att(std::string &dev_name,std::string &att_name,st // //------------------------------------------------------------------------------------------------------------------ -void DServer::mem_event_par(std::map > &_map) +void DServer::mem_event_par(ServerEventSubscriptionState& _map) { for (size_t i = 0;i < class_list.size();i++) { std::vector &dev_list = class_list[i]->get_device_list(); for (size_t j = 0;j < dev_list.size();j++) { - std::vector eve; + EventSubscriptionStates eve; dev_list[j]->get_device_attr()->get_event_param(eve); dev_list[j]->get_event_param(eve); @@ -2010,7 +2010,7 @@ void DServer::mem_event_par(std::map > &_map) // //------------------------------------------------------------------------------------------------------------------ -void DServer::apply_event_par(std::map > &_map) +void DServer::apply_event_par(const ServerEventSubscriptionState& _map) { for (size_t i = 0;i < class_list.size();i++) { @@ -2018,8 +2018,8 @@ void DServer::apply_event_par(std::map > &_map for (size_t j = 0;j < dev_list.size();j++) { std::string &dev_name = dev_list[j]->get_name(); - std::map >::iterator ite; - ite = _map.find(dev_name); + + const auto ite = _map.find(dev_name); if (ite != _map.end()) { diff --git a/cppapi/server/dserver.h b/cppapi/server/dserver.h index eff64b6af..922ff107f 100644 --- a/cppapi/server/dserver.h +++ b/cppapi/server/dserver.h @@ -38,6 +38,7 @@ #define _DSERVER_H #include +#include "event_subscription_state.h" namespace Tango { @@ -128,8 +129,8 @@ public : void _create_cpp_class(const char *c1,const char *c2) {this->create_cpp_class(c1,c2);} void mcast_event_for_att(std::string &,std::string &,std::vector &); - void mem_event_par(std::map > &); - void apply_event_par(std::map > &); + void mem_event_par(ServerEventSubscriptionState&); + void apply_event_par(const ServerEventSubscriptionState&); void mem_devices_interface(std::map &); void changed_devices_interface(std::map &); diff --git a/cppapi/server/event_subscription_state.h b/cppapi/server/event_subscription_state.h new file mode 100644 index 000000000..e72e3a225 --- /dev/null +++ b/cppapi/server/event_subscription_state.h @@ -0,0 +1,37 @@ +#ifndef _EVENT_SUBSCRIPTION_STATE_H +#define _EVENT_SUBSCRIPTION_STATE_H + +#include +#include +#include + +namespace Tango +{ + +using EventClientLibVersion = int; +using EventClientLibVersions = std::vector; + +struct EventSubscriptionState +{ + std::string attribute_name; + + EventClientLibVersions change; + EventClientLibVersions archive; + EventClientLibVersions periodic; + EventClientLibVersions user; + EventClientLibVersions att_conf; + + bool quality; + bool data_ready; + bool dev_intr_change; + + bool notifd; + bool zmq; +}; + +using EventSubscriptionStates = std::vector; +using ServerEventSubscriptionState = std::map; + +} + +#endif diff --git a/cppapi/server/eventcmds.cpp b/cppapi/server/eventcmds.cpp index 01564a15c..91976d024 100644 --- a/cppapi/server/eventcmds.cpp +++ b/cppapi/server/eventcmds.cpp @@ -581,10 +581,13 @@ void DServer::event_subscription(std::string &dev_name,std::string &obj_name,std // if (client_lib != 0) - { - omni_mutex_lock oml(EventSupplier::get_event_mutex()); - attribute.set_client_lib(client_lib,event); - } + { + EventType event_type = CHANGE_EVENT; + tg->event_name_2_event_type(event, event_type); + + omni_mutex_lock oml(EventSupplier::get_event_mutex()); + attribute.set_client_lib(client_lib, event_type); + } } else if (event == EventName[PIPE_EVENT]) { diff --git a/cppapi/server/idl/CMakeLists.txt b/cppapi/server/idl/CMakeLists.txt index 0d8e61bca..d74a8367a 100644 --- a/cppapi/server/idl/CMakeLists.txt +++ b/cppapi/server/idl/CMakeLists.txt @@ -6,16 +6,16 @@ message("Using IDL=${IDL_PKG_INCLUDE_DIRS}") find_program(OMNIIDL NAMES omniidl PATHS ${OMNIIDL_PATH}) -if(${OMNIIDL-NOTFOUND}) +if(NOT OMNIIDL) message(FATAL_ERROR "Could not find omniidl") endif() execute_process(COMMAND ${OMNIIDL} -I${IDL_PKG_INCLUDE_DIRS} -bcxx -Wbh=.h -Wbs=SK.cpp -Wbd=DynSK.cpp -Wba ${IDL_PKG_INCLUDE_DIRS}/tango.idl WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - RESULT_VARIABLE FAILED) + RESULT_VARIABLE OMNIIDL_RETURN_CODE) -if(${FAILED}) - message(SEND_ERROR " Failed to generate source files from idl. rv=${FAILED}") +if(OMNIIDL_RETURN_CODE) + message(SEND_ERROR " Failed to generate source files from idl. rv=${OMNIIDL_RETURN_CODE}") endif() function(replace_in_file FILENAME SEARCH NEW_CONTENT) diff --git a/cppapi/server/jpeg_mmx/CMakeLists.txt b/cppapi/server/jpeg_mmx/CMakeLists.txt index 927e902c7..441776349 100644 --- a/cppapi/server/jpeg_mmx/CMakeLists.txt +++ b/cppapi/server/jpeg_mmx/CMakeLists.txt @@ -20,21 +20,29 @@ if(WIN32) target_compile_definitions(jpeg_mmx_objects_sta PRIVATE _64BITS) else() target_compile_options(jpeg_mmx_objects_dyn PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects_dyn PRIVATE JPG_USE_ASM) target_compile_options(jpeg_mmx_objects_sta PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects_sta PRIVATE JPG_USE_ASM) + if(TANGO_JPEG_MMX) + target_compile_definitions(jpeg_mmx_objects_dyn PRIVATE JPG_USE_ASM) + target_compile_definitions(jpeg_mmx_objects_sta PRIVATE JPG_USE_ASM) + endif() endif() else(WIN32) add_library(jpeg_mmx_objects OBJECT ${SOURCES}) - target_compile_options(jpeg_mmx_objects PRIVATE -mmmx -fPIC) + if(TANGO_JPEG_MMX) + target_compile_options(jpeg_mmx_objects PRIVATE -mmmx -fPIC) + else() + target_compile_options(jpeg_mmx_objects PRIVATE -fPIC) + endif() if(${PLATFORM} EQUAL 64) target_compile_definitions(jpeg_mmx_objects PRIVATE _64BITS) else() target_compile_options(jpeg_mmx_objects PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects PRIVATE JPG_USE_ASM) + if(TANGO_JPEG_MMX) + target_compile_definitions(jpeg_mmx_objects PRIVATE JPG_USE_ASM) + endif() endif() endif(WIN32) diff --git a/cppapi/server/multiattribute.cpp b/cppapi/server/multiattribute.cpp index 2d85d9c37..5391fdf21 100644 --- a/cppapi/server/multiattribute.cpp +++ b/cppapi/server/multiattribute.cpp @@ -1449,7 +1449,7 @@ void MultiAttribute::read_alarm(std::string &status) // //------------------------------------------------------------------------------------------------------------------ -void MultiAttribute::get_event_param(std::vector &eve) +void MultiAttribute::get_event_param(EventSubscriptionStates& eve) { unsigned int i; @@ -1508,7 +1508,7 @@ void MultiAttribute::get_event_param(std::vector &eve) if (once_more == true) { - EventPar ep; + EventSubscriptionState ep; if (attr_list[i]->use_notifd_event() == true) ep.notifd = true; @@ -1520,7 +1520,7 @@ void MultiAttribute::get_event_param(std::vector &eve) else ep.zmq = false; - ep.attr_id = i; + ep.attribute_name = attr_list[i]->get_name(); ep.change = ch; ep.quality = qu; ep.archive = ar; @@ -1548,46 +1548,61 @@ void MultiAttribute::get_event_param(std::vector &eve) // //------------------------------------------------------------------------------------------------------------------ -void MultiAttribute::set_event_param(std::vector &eve) +void MultiAttribute::set_event_param(const EventSubscriptionStates& eve) { for (size_t i = 0;i < eve.size();i++) { - if (eve[i].attr_id != -1) + if (! eve[i].attribute_name.empty()) { - Tango::Attribute &att = get_attr_by_ind(eve[i].attr_id); + Tango::Attribute &att = get_attr_by_name(eve[i].attribute_name.c_str()); { omni_mutex_lock oml(EventSupplier::get_event_mutex()); - std::vector::iterator ite; + std::vector::const_iterator ite; if (eve[i].change.empty() == false) { for (ite = eve[i].change.begin();ite != eve[i].change.end();++ite) + { att.set_change_event_sub(*ite); + att.set_client_lib(*ite, CHANGE_EVENT); + } } if (eve[i].periodic.empty() == false) { for (ite = eve[i].periodic.begin();ite != eve[i].periodic.end();++ite) + { att.set_periodic_event_sub(*ite); + att.set_client_lib(*ite, PERIODIC_EVENT); + } } if (eve[i].archive.empty() == false) { for (ite = eve[i].archive.begin();ite != eve[i].archive.end();++ite) + { att.set_archive_event_sub(*ite); + att.set_client_lib(*ite, ARCHIVE_EVENT); + } } if (eve[i].att_conf.empty() == false) { for (ite = eve[i].att_conf.begin();ite != eve[i].att_conf.end();++ite) + { att.set_att_conf_event_sub(*ite); + att.set_client_lib(*ite, ATTR_CONF_EVENT); + } } if (eve[i].user.empty() == false) { for (ite = eve[i].user.begin();ite != eve[i].user.end();++ite) + { att.set_user_event_sub(*ite); + att.set_client_lib(*ite, USER_EVENT); + } } if (eve[i].quality == true) diff --git a/cppapi/server/multiattribute.h b/cppapi/server/multiattribute.h index ed3cb7111..a861f66c4 100644 --- a/cppapi/server/multiattribute.h +++ b/cppapi/server/multiattribute.h @@ -38,6 +38,7 @@ #define _MULTIATTRIBUTE_H #include +#include "event_subscription_state.h" namespace Tango { @@ -45,21 +46,6 @@ namespace Tango class AttrProperty; class DeviceClass; -struct EventPar -{ - long attr_id; - std::vector change; - std::vector archive; - bool quality; - std::vector periodic; - std::vector user; - std::vector att_conf; - bool data_ready; - bool dev_intr_change; - bool notifd; - bool zmq; -}; - //============================================================================= // // The MultiAttribute class @@ -280,8 +266,8 @@ class MultiAttribute void remove_attribute(std::string &,bool); std::vector &get_w_attr_list() {return writable_attr_list;} bool is_att_quality_alarmed(); - void get_event_param(std::vector &); - void set_event_param(std::vector &); + void get_event_param(EventSubscriptionStates&); + void set_event_param(const EventSubscriptionStates&); void add_alarmed_quality_factor(std::string &); void add_default(std::vector &,std::string &,std::string &,long); void add_attr(Attribute *att);