Lock furi record for the whole notification process (#119)
Co-authored-by: aanper <mail@s3f.ru>
This commit is contained in:
parent
892a3b16da
commit
06ee165ab6
@ -209,8 +209,8 @@ void furi_give(FuriRecordSubscriber* handler) {
|
|||||||
void furi_commit(FuriRecordSubscriber* handler) {
|
void furi_commit(FuriRecordSubscriber* handler) {
|
||||||
if(handler == NULL || handler->record == NULL) return;
|
if(handler == NULL || handler->record == NULL) return;
|
||||||
|
|
||||||
furi_give(handler);
|
|
||||||
furi_notify(handler, handler->record->value, handler->record->size);
|
furi_notify(handler, handler->record->value, handler->record->size);
|
||||||
|
furi_give(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool furi_read(FuriRecordSubscriber* handler, void* value, size_t size) {
|
bool furi_read(FuriRecordSubscriber* handler, void* value, size_t size) {
|
||||||
@ -227,8 +227,8 @@ bool furi_read(FuriRecordSubscriber* handler, void* value, size_t size) {
|
|||||||
|
|
||||||
furi_take(handler);
|
furi_take(handler);
|
||||||
memcpy(value, handler->record->value, size);
|
memcpy(value, handler->record->value, size);
|
||||||
furi_give(handler);
|
|
||||||
furi_notify(handler, value, size);
|
furi_notify(handler, value, size);
|
||||||
|
furi_give(handler);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -272,17 +272,17 @@ bool furi_write(FuriRecordSubscriber* handler, const void* value, size_t size) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
furi_take(handler);
|
||||||
if(handler->record->value != NULL) {
|
if(handler->record->value != NULL) {
|
||||||
// real write to value
|
// real write to value
|
||||||
furi_take(handler);
|
|
||||||
memcpy(handler->record->value, value, size);
|
memcpy(handler->record->value, value, size);
|
||||||
furi_give(handler);
|
|
||||||
|
|
||||||
// notify subscribers
|
// notify subscribers
|
||||||
furi_notify(handler, handler->record->value, handler->record->size);
|
furi_notify(handler, handler->record->value, handler->record->size);
|
||||||
} else {
|
} else {
|
||||||
furi_notify(handler, value, size);
|
furi_notify(handler, value, size);
|
||||||
}
|
}
|
||||||
|
furi_give(handler);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user