contributed by < cyrong >
這個程式有兩個主要的結構體
hp_t
和 domain_t
hp_t
也就是 hazard pointer 的本體,用來指向需要被保護的資料
domain_t
是在每個 thread 中存放所有 hazard pointer 的結構,其中包含了 hazard pointer(s) 和 retired list
而還有一個結構體 config_t
是被共用的資源的結構
shared_config
是被 hazard pointers 共用的資料
config_dom
是每個 thread 中管理 hazard pointer(s) 和 retired list 的結構
reader thread 執行兩個函式 load
和 drop
load
為取值 prot_ptr
後將此 val
放進 dom
中的 hazard pointer list ,首先先找沒有使用的 node 若沒有找到則建立一個新的 node
drop
為將已經是 safe 的 val
從 hazard pointer list 中設定為 0,在這之後可以給其他需要放進 dom
的值使用
而在 reader thread 中是 load shared_config
後 print_config
,接著 drop 此 val
writer thread
writer thread 為建立新的 config_t
new_config
後將其與 shared_config
進行對調
而在進行對調後函式 swap
會呼叫 cleanup_ptr
,用以釋放 (呼叫 deallocator) 舊的值,而如果還有 reader 正在使用舊的值,則等待至沒有任何 reader 使用後釋放
swap
中根據 flags
來分別不同的實作
flags & DEFER_DEALLOC
0 : 不進行等待,只在當下沒有任何 reader reference 時進行釋放,否則等待到下次 cleanup 被呼叫
flags & DEFER_DEALLOC
0 : 等待至沒有任何 reader reference 此 pointer 後釋放