Timer absolut yang terikat ke CLOCK_REALTIME memiliki ketergantungan yang tidak dimiliki deadline monotonic: administrator, layanan sinkronisasi, atau proses berprivilege dapat memindahkan wall clock secara diskontinu ketika timer masih aktif. Linux timerfd dapat mengekspos kejadian itu secara eksplisit. Dengan TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, perubahan clock yang memenuhi syarat membuat read() saat ini atau berikutnya pada descriptor timer gagal dengan ECANCELED.
Perilaku ini memisahkan dua kejadian yang mudah tercampur: tercapainya waktu wall clock yang dijadwalkan dan tidak berlakunya basis clock yang dipakai saat jadwal dibuat.
Cancellation hanya berlaku pada konfigurasi timer tertentu
TFD_TIMER_CANCEL_ON_SET relevan ketika timer memakai CLOCK_REALTIME atau CLOCK_REALTIME_ALARM dan diaktifkan sebagai timer absolut dengan TFD_TIMER_ABSTIME. Flag tersebut menandai timer agar dapat dibatalkan jika realtime clock kemudian berubah secara diskontinu, misalnya melalui clock_settime() atau settimeofday().
Kombinasi ini memiliki batas yang jelas. Durasi relatif tidak menyatakan komitmen yang sama terhadap satu waktu wall clock tertentu, sedangkan monotonic clock dirancang agar tidak mengikuti koreksi wall clock.
Secara konseptual:
CLOCK_REALTIME = 10:00
deadline absolut = 10:30
clock melompat ke 11:00
read(timerfd) -> -1
errno -> ECANCELEDError tersebut bukan expiration count biasa. Nilai itu menyatakan bahwa basis realtime timer berubah secara diskontinu setelah timer absolut yang cancelable diaktifkan.
timerfd biasanya mengembalikan expiration count
Descriptor timerfd menghubungkan timer dengan event loop berbasis file descriptor. Setelah satu atau beberapa expiration, read() yang berhasil mengembalikan integer unsigned delapan byte berisi jumlah expiration sejak read sukses sebelumnya atau sejak konfigurasi timer diubah.
Pada timer periodik, consumer yang terlambat dapat menerima nilai lebih besar dari satu:
interval = 1 detik
consumer tertunda sekitar 4 interval
read -> expiration count yang mencerminkan expiration yang berlaluECANCELED memakai jalur semantik yang berbeda. Read yang gagal tersebut tidak mengembalikan expiration count delapan byte. Caller menerima -1 lalu memeriksa errno.
Pemisahan ini memungkinkan event loop memperlakukan perubahan clock diskontinu sebagai invalidasi state, bukan sebagai firing timer biasa.
Deadline realtime absolut mewarisi mutabilitas wall clock
TFD_TIMER_ABSTIME mengubah it_value dari durasi relatif menjadi nilai absolut pada clock yang dipilih. Untuk CLOCK_REALTIME, nilai tersebut berada pada clock yang dapat diatur. Perubahan diskontinu dapat memindahkan nilai clock saat ini melewati deadline yang diprogram atau menjauhinya secara signifikan.
Tanpa cancellation eksplisit, state aplikasi dapat menjadi ambigu. Sebuah komponen mungkin telah menghitung state lain dari nilai realtime sebelumnya, menyimpan deadline yang terkait, atau mengoordinasikan deadline dengan sistem eksternal. Timer event saja tidak menyatakan bahwa basis clock tetap kontinu.
TFD_TIMER_CANCEL_ON_SET menyediakan indikasi kegagalan terpisah. Aplikasi dapat menghitung ulang state yang berasal dari wall clock sesuai kebijakannya sendiri, alih-alih menganggap perubahan clock sebagai perjalanan waktu biasa.
Flag ini bukan subscription umum untuk perubahan clock
Mekanisme cancellation melekat pada konfigurasi timer. Mekanisme ini bukan stream yang memuat setiap perubahan clock dan bukan pengganti mekanisme audit umum untuk operasi pengaturan waktu.
Kondisi yang didokumentasikan adalah perubahan diskontinu pada realtime clock terkait ketika timer absolut yang memenuhi syarat sedang aktif. Disiplin clock secara bertahap tidak identik dengan pengaturan diskontinu eksplisit pada interface ini. Kontrak yang relevan bersifat spesifik: timer realtime absolut yang cancelable dapat melaporkan bahwa basis waktunya diubah secara diskontinu.
Properti ini juga tidak berlaku begitu saja pada CLOCK_MONOTONIC. Clock tersebut tidak dapat diatur dan ditujukan untuk penjadwalan berbasis elapsed time, sehingga koreksi wall clock tidak mendefinisikan ulang deadline.
Rearming memiliki edge case khusus Linux
Linux mendokumentasikan satu kasus penting setelah cancellation. Jika timer CLOCK_REALTIME atau CLOCK_REALTIME_ALARM diaktifkan dengan kedua flag, clock berubah secara diskontinu, lalu caller memanggil timerfd_settime() lagi tanpa membaca descriptor lebih dulu, pemanggilan rearm tersebut dapat mengembalikan -1 dengan errno bernilai ECANCELED sambil tetap berhasil menerapkan konfigurasi timer baru.
Manual Linux menyebut perilaku ini dipertahankan untuk kompatibilitas. Karena itu, kode yang melakukan rearm setelah lompatan clock tidak dapat menganggap bahwa ECANCELED pada urutan khusus ini berarti konfigurasi baru dibuang.
Ini merupakan detail interface Linux yang implementation-specific, bukan prinsip timer secara umum. State machine yang memakai jalur ini perlu memperhitungkan error report sekaligus efek rearm yang didokumentasikan.
Cancellation membuat batas penjadwalan wall clock eksplisit
Penjadwalan realtime tepat ketika deadline menunjuk waktu sipil tertentu, bukan sekadar durasi yang telah berlalu. Pilihan tersebut membawa mutabilitas wall clock ke dalam semantik timer.
Timerfd yang cancelable membuat satu batas penting terlihat: pengaturan clock secara diskontinu tidak harus tampak sebagai progres deadline normal. ECANCELED memberi kode berbasis descriptor jalur terpisah untuk membangun kembali state setelah basis clock berubah, sedangkan read yang berhasil tetap menyatakan expiration count.