mirror of
https://github.com/systemd/systemd.git
synced 2025-02-03 17:47:28 +03:00
journal: replace __sync intrinsics with __atomic
This commit is contained in:
parent
5ba4295bea
commit
60c040f6a7
@ -166,19 +166,28 @@ static void managed_journal_file_set_offline_internal(ManagedJournalFile *f) {
|
||||
|
||||
for (;;) {
|
||||
switch (f->file->offline_state) {
|
||||
case OFFLINE_CANCEL:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_CANCEL, OFFLINE_DONE))
|
||||
case OFFLINE_CANCEL: {
|
||||
OfflineState tmp_state = OFFLINE_CANCEL;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_DONE,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
return;
|
||||
|
||||
case OFFLINE_AGAIN_FROM_SYNCING:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_AGAIN_FROM_SYNCING, OFFLINE_SYNCING))
|
||||
case OFFLINE_AGAIN_FROM_SYNCING: {
|
||||
OfflineState tmp_state = OFFLINE_AGAIN_FROM_SYNCING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_SYNCING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case OFFLINE_AGAIN_FROM_OFFLINING:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_AGAIN_FROM_OFFLINING, OFFLINE_SYNCING))
|
||||
case OFFLINE_AGAIN_FROM_OFFLINING: {
|
||||
OfflineState tmp_state = OFFLINE_AGAIN_FROM_OFFLINING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_SYNCING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case OFFLINE_SYNCING:
|
||||
@ -189,8 +198,12 @@ static void managed_journal_file_set_offline_internal(ManagedJournalFile *f) {
|
||||
|
||||
(void) fsync(f->file->fd);
|
||||
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_SYNCING, OFFLINE_OFFLINING))
|
||||
continue;
|
||||
{
|
||||
OfflineState tmp_state = OFFLINE_SYNCING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_OFFLINING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
|
||||
f->file->header->state = f->file->archive ? STATE_ARCHIVED : STATE_OFFLINE;
|
||||
(void) fsync(f->file->fd);
|
||||
@ -221,9 +234,12 @@ static void managed_journal_file_set_offline_internal(ManagedJournalFile *f) {
|
||||
|
||||
break;
|
||||
|
||||
case OFFLINE_OFFLINING:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_OFFLINING, OFFLINE_DONE))
|
||||
case OFFLINE_OFFLINING: {
|
||||
OfflineState tmp_state = OFFLINE_OFFLINING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_DONE,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
_fallthrough_;
|
||||
case OFFLINE_DONE:
|
||||
return;
|
||||
@ -253,19 +269,28 @@ static bool managed_journal_file_set_offline_try_restart(ManagedJournalFile *f)
|
||||
case OFFLINE_AGAIN_FROM_OFFLINING:
|
||||
return true;
|
||||
|
||||
case OFFLINE_CANCEL:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_CANCEL, OFFLINE_AGAIN_FROM_SYNCING))
|
||||
case OFFLINE_CANCEL: {
|
||||
OfflineState tmp_state = OFFLINE_CANCEL;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_AGAIN_FROM_SYNCING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
return true;
|
||||
|
||||
case OFFLINE_SYNCING:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_SYNCING, OFFLINE_AGAIN_FROM_SYNCING))
|
||||
case OFFLINE_SYNCING: {
|
||||
OfflineState tmp_state = OFFLINE_SYNCING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_AGAIN_FROM_SYNCING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
return true;
|
||||
|
||||
case OFFLINE_OFFLINING:
|
||||
if (!__sync_bool_compare_and_swap(&f->file->offline_state, OFFLINE_OFFLINING, OFFLINE_AGAIN_FROM_OFFLINING))
|
||||
case OFFLINE_OFFLINING: {
|
||||
OfflineState tmp_state = OFFLINE_OFFLINING;
|
||||
if (!__atomic_compare_exchange_n(&f->file->offline_state, &tmp_state, OFFLINE_AGAIN_FROM_OFFLINING,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
return true;
|
||||
|
||||
default:
|
||||
@ -352,7 +377,7 @@ int managed_journal_file_set_offline(ManagedJournalFile *f, bool wait) {
|
||||
bool managed_journal_file_is_offlining(ManagedJournalFile *f) {
|
||||
assert(f);
|
||||
|
||||
__sync_synchronize();
|
||||
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||
|
||||
if (IN_SET(f->file->offline_state, OFFLINE_DONE, OFFLINE_JOINED))
|
||||
return false;
|
||||
|
@ -204,23 +204,32 @@ static int journal_file_set_online(JournalFile *f) {
|
||||
wait = false;
|
||||
break;
|
||||
|
||||
case OFFLINE_SYNCING:
|
||||
if (!__sync_bool_compare_and_swap(&f->offline_state, OFFLINE_SYNCING, OFFLINE_CANCEL))
|
||||
continue;
|
||||
case OFFLINE_SYNCING: {
|
||||
OfflineState tmp_state = OFFLINE_SYNCING;
|
||||
if (!__atomic_compare_exchange_n(&f->offline_state, &tmp_state, OFFLINE_CANCEL,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
/* Canceled syncing prior to offlining, no need to wait. */
|
||||
wait = false;
|
||||
break;
|
||||
|
||||
case OFFLINE_AGAIN_FROM_SYNCING:
|
||||
if (!__sync_bool_compare_and_swap(&f->offline_state, OFFLINE_AGAIN_FROM_SYNCING, OFFLINE_CANCEL))
|
||||
continue;
|
||||
case OFFLINE_AGAIN_FROM_SYNCING: {
|
||||
OfflineState tmp_state = OFFLINE_AGAIN_FROM_SYNCING;
|
||||
if (!__atomic_compare_exchange_n(&f->offline_state, &tmp_state, OFFLINE_CANCEL,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
/* Canceled restart from syncing, no need to wait. */
|
||||
wait = false;
|
||||
break;
|
||||
|
||||
case OFFLINE_AGAIN_FROM_OFFLINING:
|
||||
if (!__sync_bool_compare_and_swap(&f->offline_state, OFFLINE_AGAIN_FROM_OFFLINING, OFFLINE_CANCEL))
|
||||
continue;
|
||||
case OFFLINE_AGAIN_FROM_OFFLINING: {
|
||||
OfflineState tmp_state = OFFLINE_AGAIN_FROM_OFFLINING;
|
||||
if (!__atomic_compare_exchange_n(&f->offline_state, &tmp_state, OFFLINE_CANCEL,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
|
||||
continue;
|
||||
}
|
||||
/* Canceled restart from offlining, must wait for offlining to complete however. */
|
||||
_fallthrough_;
|
||||
default: {
|
||||
@ -1810,7 +1819,7 @@ static int journal_file_link_entry(JournalFile *f, Object *o, uint64_t offset) {
|
||||
if (o->object.type != OBJECT_ENTRY)
|
||||
return -EINVAL;
|
||||
|
||||
__sync_synchronize();
|
||||
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||
|
||||
/* Link up the entry itself */
|
||||
r = link_entry_into_array(f,
|
||||
@ -1910,7 +1919,7 @@ void journal_file_post_change(JournalFile *f) {
|
||||
* trigger IN_MODIFY by truncating the journal file to its
|
||||
* current size which triggers IN_MODIFY. */
|
||||
|
||||
__sync_synchronize();
|
||||
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||
|
||||
if (ftruncate(f->fd, f->last_stat.st_size) < 0)
|
||||
log_debug_errno(errno, "Failed to truncate file to its own size: %m");
|
||||
|
@ -58,7 +58,8 @@ retry:
|
||||
|
||||
fd_inc_sndbuf(fd, SNDBUF_SIZE);
|
||||
|
||||
if (!__sync_bool_compare_and_swap(&fd_plus_one, 0, fd+1)) {
|
||||
if (!__atomic_compare_exchange_n(&fd_plus_one, &(int){0}, fd+1,
|
||||
false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
|
||||
safe_close(fd);
|
||||
goto retry;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user