Skip to content
This repository was archived by the owner on Jul 8, 2022. It is now read-only.

Commit ec8d6e7

Browse files
authored
Merge pull request #681 from bourtemb/9.3-backport-fix-330
9.3 backport to fix #330
2 parents cd47927 + 3b35b49 commit ec8d6e7

File tree

9 files changed

+167
-140
lines changed

9 files changed

+167
-140
lines changed

cpp_test_suite/cpp_test_ds/DevTest.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ void DevTest::init_device()
117117
Short_attr_except = false;
118118
if (tg->is_svr_starting() == true || tg->is_device_restarting(device_name) == true)
119119
Short_attr_w_except = false;
120+
Long_attr_except = false;
120121
event_change_attr_except = false;
121122
event_quality_attr_except = false;
122123
event_throw_out_of_sync = false;
@@ -1281,8 +1282,15 @@ void DevTest::read_Short_attr(Tango::Attribute &att)
12811282

12821283
void DevTest::read_Long_attr(Tango::Attribute &att)
12831284
{
1284-
cout << "[DevTest::read_attr] attribute name Long_attr" << endl;
1285-
att.set_value(&attr_long);
1285+
cout << "[DevTest::read_attr] attribute name Long_attr" << std::endl;
1286+
if (Long_attr_except)
1287+
{
1288+
Tango::Except::throw_exception(
1289+
"Long_attr_except",
1290+
"Test exception is enabled for this attribute",
1291+
"DevTest::read_Long_attr");
1292+
}
1293+
att.set_value(&attr_long);
12861294
}
12871295

12881296
void DevTest::read_Long64_attr(Tango::Attribute &att)

cpp_test_suite/cpp_test_ds/DevTest.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ protected :
289289

290290
bool Short_attr_except;
291291
bool Short_attr_w_except;
292+
bool Long_attr_except;
292293
bool event_change_attr_except;
293294
bool event_quality_attr_except;
294295
bool event_throw_out_of_sync;

cpp_test_suite/cpp_test_ds/IOMisc.cpp

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -665,41 +665,23 @@ CORBA::Any *IOAttrThrowEx::execute(Tango::DeviceImpl *device, const CORBA::Any &
665665
const Tango::DevVarShortArray *in;
666666
extract(in_any, in);
667667

668-
if ((*in)[0] == 0)
669-
{
670-
if ((*in)[1] == 0)
671-
(static_cast<DevTest *>(device))->Short_attr_except = false;
672-
else
673-
(static_cast<DevTest *>(device))->Short_attr_except = true;
674-
}
675-
else if ((*in)[0] == 1)
676-
{
677-
if ((*in)[1] == 0)
678-
(static_cast<DevTest *>(device))->event_change_attr_except = false;
679-
else
680-
(static_cast<DevTest *>(device))->event_change_attr_except = true;
681-
}
682-
else if ((*in)[0] == 2)
683-
{
684-
if ((*in)[1] == 0)
685-
(static_cast<DevTest *>(device))->event_quality_attr_except = false;
686-
else
687-
(static_cast<DevTest *>(device))->event_quality_attr_except = true;
688-
}
689-
else if ((*in)[0] == 3)
690-
{
691-
if ((*in)[1] == 0)
692-
(static_cast<DevTest *>(device))->event_throw_out_of_sync = false;
693-
else
694-
(static_cast<DevTest *>(device))->event_throw_out_of_sync = true;
695-
}
696-
else if ((*in)[0] == 4)
697-
{
698-
if ((*in)[1] == 0)
699-
(static_cast<DevTest *>(device))->Short_attr_w_except = false;
700-
else
701-
(static_cast<DevTest *>(device))->Short_attr_w_except = true;
702-
}
668+
DevTest& dev = static_cast<DevTest&>(*device);
669+
670+
const int flag_disc = (*in)[0];
671+
const bool flag_value = (*in)[1];
672+
bool default_flag = false;
673+
674+
bool& flag =
675+
(flag_disc == 0) ? dev.Short_attr_except :
676+
(flag_disc == 1) ? dev.event_change_attr_except :
677+
(flag_disc == 2) ? dev.event_quality_attr_except :
678+
(flag_disc == 3) ? dev.event_throw_out_of_sync :
679+
(flag_disc == 4) ? dev.Short_attr_w_except :
680+
(flag_disc == 5) ? dev.Long_attr_except :
681+
default_flag;
682+
683+
flag = flag_value;
684+
703685
return insert();
704686
}
705687

cpp_test_suite/cpp_test_ds/TypeCmds.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
#include "TypeCmds.h"
22

3-
#define DEV_DEBUG_STREAM(dev) \
4-
if (dev->get_logger()->is_debug_enabled())\
5-
dev->get_logger()->debug_stream()
6-
73
//+----------------------------------------------------------------------------
84
//
95
// method : IOVoid::IOVoid()

cpp_test_suite/new_tests/cxx_attr_misc.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,63 @@ cout << "status = " << status << endl;
10291029
dout >> status;
10301030
TS_ASSERT(strcmp(status,"The device is in ON state.") == 0);
10311031
}
1032+
1033+
void set_Long_attr_value(DevLong value)
1034+
{
1035+
DeviceData input;
1036+
input << value;
1037+
TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOSetAttr", input));
1038+
}
1039+
1040+
void set_attribute_exception_flag(short attribute_disc, bool enabled)
1041+
{
1042+
std::vector<short> flags(2);
1043+
flags[0] = attribute_disc;
1044+
flags[1] = enabled ? 1 : 0;
1045+
DeviceData data;
1046+
data << flags;
1047+
TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOAttrThrowEx", data));
1048+
}
1049+
1050+
void __assert_dev_state(DevState expected, const char* file, const char* line)
1051+
{
1052+
std::string message = std::string("Called from ") + file + ":" + line;
1053+
1054+
DevState state;
1055+
DeviceData data;
1056+
TSM_ASSERT_THROWS_NOTHING(message, data = device1->command_inout("State"));
1057+
data >> state;
1058+
TSM_ASSERT_EQUALS(message, expected, state);
1059+
}
1060+
1061+
#define __QUOTE(x) #x
1062+
#define QUOTE(x) __QUOTE(x)
1063+
#define assert_dev_state(expected) __assert_dev_state(expected, __FILE__, QUOTE(__LINE__))
1064+
1065+
// Verifies that device state is set correctly when alarm is configured for an attribute
1066+
// but no value is provided for this attribute in user callback (e.g. an exception is thrown).
1067+
1068+
void test_alarm_on_attribute_exception_during_read(void)
1069+
{
1070+
const short EXCEPTION_IN_Long_attr = 5;
1071+
1072+
set_Long_attr_value(2000);
1073+
assert_dev_state(Tango::ALARM);
1074+
1075+
set_attribute_exception_flag(EXCEPTION_IN_Long_attr, true);
1076+
assert_dev_state(Tango::ON);
1077+
1078+
set_attribute_exception_flag(EXCEPTION_IN_Long_attr, false);
1079+
assert_dev_state(Tango::ALARM);
1080+
1081+
set_Long_attr_value(1200);
1082+
assert_dev_state(Tango::ON);
1083+
}
1084+
1085+
#undef assert_dev_state
1086+
#undef QUOTE
1087+
#undef __QUOTE
1088+
10321089
};
10331090
#undef cout
10341091
#endif // AttrMiscTestSuite_h

cppapi/server/attribute.cpp

Lines changed: 52 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2865,54 +2865,67 @@ void Attribute::delete_seq()
28652865
case Tango::DEV_SHORT:
28662866
case Tango::DEV_ENUM:
28672867
delete value.sh_seq;
2868+
value.sh_seq = Tango_nullptr;
28682869
break;
28692870

28702871
case Tango::DEV_LONG:
28712872
delete value.lg_seq;
2873+
value.lg_seq = Tango_nullptr;
28722874
break;
28732875

28742876
case Tango::DEV_LONG64:
28752877
delete value.lg64_seq;
2878+
value.lg64_seq = Tango_nullptr;
28762879
break;
28772880

28782881
case Tango::DEV_DOUBLE:
28792882
delete value.db_seq;
2883+
value.db_seq = Tango_nullptr;
28802884
break;
28812885

28822886
case Tango::DEV_STRING:
28832887
delete value.str_seq;
2888+
value.str_seq = Tango_nullptr;
28842889
break;
28852890

28862891
case Tango::DEV_FLOAT:
28872892
delete value.fl_seq;
2893+
value.fl_seq = Tango_nullptr;
28882894
break;
28892895

28902896
case Tango::DEV_USHORT:
28912897
delete value.ush_seq;
2898+
value.ush_seq = Tango_nullptr;
28922899
break;
28932900

28942901
case Tango::DEV_UCHAR:
28952902
delete value.cha_seq;
2903+
value.cha_seq = Tango_nullptr;
28962904
break;
28972905

28982906
case Tango::DEV_BOOLEAN:
28992907
delete value.boo_seq;
2908+
value.boo_seq = Tango_nullptr;
29002909
break;
29012910

29022911
case Tango::DEV_ULONG:
29032912
delete value.ulg_seq;
2913+
value.ulg_seq = Tango_nullptr;
29042914
break;
29052915

29062916
case Tango::DEV_ULONG64:
29072917
delete value.ulg64_seq;
2918+
value.ulg64_seq = Tango_nullptr;
29082919
break;
29092920

29102921
case Tango::DEV_STATE:
29112922
delete value.state_seq;
2923+
value.state_seq = Tango_nullptr;
29122924
break;
29132925

29142926
case Tango::DEV_ENCODED:
29152927
delete value.enc_seq;
2928+
value.enc_seq = Tango_nullptr;
29162929
break;
29172930
}
29182931
}
@@ -5362,109 +5375,64 @@ void Attribute::log_quality()
53625375
dev = tg->get_device_by_name(d_name);
53635376
}
53645377

5365-
//
5366-
// Log something if the new quality is different than the old one
5367-
//
5378+
const bool has_quality_changed = quality != old_quality;
5379+
const bool has_alarm_changed = alarm != old_alarm;
5380+
const bool is_alarm_set = alarm.any();
53685381

5369-
if (quality != old_quality)
5382+
if (has_quality_changed)
53705383
{
5371-
if (alarm.any() == false)
5384+
if (! is_alarm_set)
53725385
{
5373-
5374-
//
5375-
// No alarm detected
5376-
//
5377-
5378-
switch(quality)
5386+
switch (quality)
53795387
{
5380-
case ATTR_INVALID:
5381-
if (dev->get_logger()->is_error_enabled())
5382-
dev->get_logger()->error_stream() << log4tango::LogInitiator::_begin_log << "INVALID quality for attribute " << name << endl;
5388+
case ATTR_INVALID:
5389+
DEV_ERROR_STREAM(dev) << "INVALID quality for attribute " << name << std::endl;
53835390
break;
53845391

5385-
case ATTR_CHANGING:
5386-
if (dev->get_logger()->is_info_enabled())
5387-
dev->get_logger()->info_stream() << log4tango::LogInitiator::_begin_log << "CHANGING quality for attribute " << name << endl;
5392+
case ATTR_CHANGING:
5393+
DEV_INFO_STREAM(dev) << "CHANGING quality for attribute " << name << std::endl;
53885394
break;
53895395

5390-
case ATTR_VALID:
5391-
if (dev->get_logger()->is_info_enabled())
5392-
dev->get_logger()->info_stream() << log4tango::LogInitiator::_begin_log << "VALID quality for attribute " << name << endl;
5396+
case ATTR_VALID:
5397+
DEV_INFO_STREAM(dev) << "INFO quality for attribute " << name << std::endl;
53935398
break;
53945399

5395-
default:
5400+
default:
53965401
break;
53975402
}
53985403
}
53995404
else
54005405
{
5401-
5402-
//
5403-
// Different log according to which alarm is set
5404-
//
5405-
5406-
if (alarm[min_level] == true)
5407-
{
5408-
if (dev->get_logger()->is_error_enabled())
5409-
dev->get_logger()->error_stream() << log4tango::LogInitiator::_begin_log << "MIN ALARM for attribute " << name << endl;
5410-
}
5411-
else if (alarm[max_level] == true)
5412-
{
5413-
if (dev->get_logger()->is_error_enabled())
5414-
dev->get_logger()->error_stream() << log4tango::LogInitiator::_begin_log << "MAX ALARM for attribute " << name << endl;
5415-
}
5416-
else if (alarm[rds] == true)
5417-
{
5418-
if (dev->get_logger()->is_warn_enabled())
5419-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "RDS (Read Different Set) ALARM for attribute " << name << endl;
5420-
}
5421-
else if (alarm[min_warn] == true)
5422-
{
5423-
if (dev->get_logger()->is_warn_enabled())
5424-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "MIN WARNING for attribute " << name << endl;
5425-
}
5426-
else if (alarm[max_warn] == true)
5427-
{
5428-
if (dev->get_logger()->is_warn_enabled())
5429-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "MAX WARNING for attribute " << name << endl;
5430-
}
5406+
log_alarm_quality();
54315407
}
54325408
}
5433-
else
5409+
else if (has_alarm_changed)
54345410
{
5411+
log_alarm_quality();
5412+
}
5413+
}
54355414

5436-
//
5437-
// The quality is the same but may be the alarm has changed
5438-
//
5439-
5440-
if (alarm != old_alarm)
5441-
{
5442-
if (alarm[min_level] == true)
5443-
{
5444-
if (dev->get_logger()->is_error_enabled())
5445-
dev->get_logger()->error_stream() << log4tango::LogInitiator::_begin_log << "MIN ALARM for attribute " << name << endl;
5446-
}
5447-
else if (alarm[max_level] == true)
5448-
{
5449-
if (dev->get_logger()->is_error_enabled())
5450-
dev->get_logger()->error_stream() << log4tango::LogInitiator::_begin_log << "MAX ALARM for attribute " << name << endl;
5451-
}
5452-
else if (alarm[rds] == true)
5453-
{
5454-
if (dev->get_logger()->is_warn_enabled())
5455-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "RDS (Read Different Set) ALARM for attribute " << name << endl;
5456-
}
5457-
else if (alarm[min_warn] == true)
5458-
{
5459-
if (dev->get_logger()->is_warn_enabled())
5460-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "MIN WARNING for attribute " << name << endl;
5461-
}
5462-
else if (alarm[max_warn] == true)
5463-
{
5464-
if (dev->get_logger()->is_warn_enabled())
5465-
dev->get_logger()->warn_stream() << log4tango::LogInitiator::_begin_log << "MAX WARNING for attribute " << name << endl;
5466-
}
5467-
}
5415+
void Attribute::log_alarm_quality() const
5416+
{
5417+
if (alarm[min_level])
5418+
{
5419+
DEV_ERROR_STREAM(dev) << "MIN ALARM for attribute " << name << std::endl;
5420+
}
5421+
else if (alarm[max_level])
5422+
{
5423+
DEV_ERROR_STREAM(dev) << "MAX ALARM for attribute " << name << std::endl;
5424+
}
5425+
else if (alarm[rds])
5426+
{
5427+
DEV_WARN_STREAM(dev) << "RDS (Read Different Set) ALARM for attribute " << name << std::endl;
5428+
}
5429+
else if (alarm[min_warn])
5430+
{
5431+
DEV_WARN_STREAM(dev) << "MIN WARNING for attribute " << name << std::endl;
5432+
}
5433+
else if (alarm[max_warn])
5434+
{
5435+
DEV_WARN_STREAM(dev) << "MAX WARNING for attribute " << name << std::endl;
54685436
}
54695437
}
54705438

cppapi/server/attribute.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2325,6 +2325,7 @@ class Attribute
23252325
void set_data_size();
23262326
void throw_min_max_value(string &,string &,MinMaxValueCheck);
23272327
void log_quality();
2328+
void log_alarm_quality() const;
23282329

23292330
inline void init_string_prop(vector<AttrProperty> &prop_list, string& attr, const char* attr_name)
23302331
{

0 commit comments

Comments
 (0)