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

Commit 0af852d

Browse files
committed
Protect storing last attribute value with mutex
Fixes data race between: * polling thread (EventSupplier::detect_and_push_xxx_event) * and user thread pushing events (Attribute::fire_xxx_event) This is a backport of 5251bee from tango-9-lts.
1 parent 2dba022 commit 0af852d

File tree

1 file changed

+65
-57
lines changed

1 file changed

+65
-57
lines changed

cppapi/server/attribute.cpp

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4017,54 +4017,58 @@ void Attribute::fire_change_event(DevFailed *except)
40174017
bool force_change = false;
40184018
bool quality_change = false;
40194019

4020-
if ((except != NULL) ||
4021-
(quality == Tango::ATTR_INVALID) ||
4022-
((except == NULL) && (prev_change_event.err == true)) ||
4023-
((quality != Tango::ATTR_INVALID) &&
4024-
(prev_change_event.quality == Tango::ATTR_INVALID)))
4025-
{
4026-
force_change = true;
4027-
}
4028-
40294020
vector<string> filterable_names;
40304021
vector<double> filterable_data;
40314022
vector<string> filterable_names_lg;
40324023
vector<long> filterable_data_lg;
40334024

4034-
if (except != NULL)
4035-
{
4036-
prev_change_event.err = true;
4037-
prev_change_event.except = *except;
4038-
}
4039-
else
40404025
{
4041-
Tango::AttrQuality the_quality;
4026+
omni_mutex_lock oml(EventSupplier::get_event_mutex());
40424027

4043-
if (send_attr_5 != NULL)
4028+
if ((except != NULL) ||
4029+
(quality == Tango::ATTR_INVALID) ||
4030+
((except == NULL) && (prev_change_event.err == true)) ||
4031+
((quality != Tango::ATTR_INVALID) &&
4032+
(prev_change_event.quality == Tango::ATTR_INVALID)))
40444033
{
4045-
the_quality = send_attr_5->quality;
4046-
prev_change_event.value_4 = send_attr_5->value;
4034+
force_change = true;
40474035
}
4048-
else if (send_attr_4 != NULL)
4036+
4037+
if (except != NULL)
40494038
{
4050-
the_quality = send_attr_4->quality;
4051-
prev_change_event.value_4 = send_attr_4->value;
4039+
prev_change_event.err = true;
4040+
prev_change_event.except = *except;
40524041
}
40534042
else
40544043
{
4055-
the_quality = send_attr->quality;
4056-
prev_change_event.value = send_attr->value;
4057-
}
4044+
Tango::AttrQuality the_quality;
40584045

4059-
if (prev_change_event.quality != the_quality)
4060-
{
4061-
quality_change = true;
4062-
}
4046+
if (send_attr_5 != NULL)
4047+
{
4048+
the_quality = send_attr_5->quality;
4049+
prev_change_event.value_4 = send_attr_5->value;
4050+
}
4051+
else if (send_attr_4 != NULL)
4052+
{
4053+
the_quality = send_attr_4->quality;
4054+
prev_change_event.value_4 = send_attr_4->value;
4055+
}
4056+
else
4057+
{
4058+
the_quality = send_attr->quality;
4059+
prev_change_event.value = send_attr->value;
4060+
}
4061+
4062+
if (prev_change_event.quality != the_quality)
4063+
{
4064+
quality_change = true;
4065+
}
40634066

4064-
prev_change_event.quality = the_quality;
4065-
prev_change_event.err = false;
4067+
prev_change_event.quality = the_quality;
4068+
prev_change_event.err = false;
4069+
}
4070+
prev_change_event.inited = true;
40664071
}
4067-
prev_change_event.inited = true;
40684072

40694073
filterable_names.push_back("forced_event");
40704074
if (force_change == true)
@@ -4478,40 +4482,44 @@ void Attribute::fire_archive_event(DevFailed *except)
44784482
vector<string> filterable_names_lg;
44794483
vector<long> filterable_data_lg;
44804484

4481-
if (except != NULL)
44824485
{
4483-
prev_archive_event.err = true;
4484-
prev_archive_event.except = *except;
4485-
}
4486-
else
4487-
{
4488-
Tango::AttrQuality the_quality;
4486+
omni_mutex_lock oml(EventSupplier::get_event_mutex());
44894487

4490-
if (send_attr_5 != Tango_nullptr)
4491-
{
4492-
prev_archive_event.value_4 = send_attr_5->value;
4493-
the_quality = send_attr_5->quality;
4494-
}
4495-
else if (send_attr_4 != Tango_nullptr)
4488+
if (except != NULL)
44964489
{
4497-
prev_archive_event.value_4 = send_attr_4->value;
4498-
the_quality = send_attr_4->quality;
4490+
prev_archive_event.err = true;
4491+
prev_archive_event.except = *except;
44994492
}
45004493
else
45014494
{
4502-
prev_archive_event.value = send_attr->value;
4503-
the_quality = send_attr->quality;
4504-
}
4495+
Tango::AttrQuality the_quality;
45054496

4506-
if (prev_archive_event.quality != the_quality)
4507-
{
4508-
quality_change = true;
4509-
}
4497+
if (send_attr_5 != Tango_nullptr)
4498+
{
4499+
prev_archive_event.value_4 = send_attr_5->value;
4500+
the_quality = send_attr_5->quality;
4501+
}
4502+
else if (send_attr_4 != Tango_nullptr)
4503+
{
4504+
prev_archive_event.value_4 = send_attr_4->value;
4505+
the_quality = send_attr_4->quality;
4506+
}
4507+
else
4508+
{
4509+
prev_archive_event.value = send_attr->value;
4510+
the_quality = send_attr->quality;
4511+
}
45104512

4511-
prev_archive_event.quality = the_quality;
4512-
prev_archive_event.err = false;
4513+
if (prev_archive_event.quality != the_quality)
4514+
{
4515+
quality_change = true;
4516+
}
4517+
4518+
prev_archive_event.quality = the_quality;
4519+
prev_archive_event.err = false;
4520+
}
4521+
prev_archive_event.inited = true;
45134522
}
4514-
prev_archive_event.inited = true;
45154523

45164524
filterable_names.push_back("forced_event");
45174525
if (force_change == true)

0 commit comments

Comments
 (0)