contributed by < MuChengChen
>
$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 39 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Vendor ID: GenuineIntel
Model name: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
CPU family: 6
Model: 140
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Stepping: 1
CPU(s) scaling MHz: 21%
CPU max MHz: 4200.0000
CPU min MHz: 400.0000
BogoMIPS: 4838.40
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_
tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg f
ma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l2 cdp_l2
ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdt_a avx512f avx512dq rdseed
adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk dtherm ida arat pln
pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req vnmi avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopc
ntdq rdpid movdiri movdir64b fsrm avx512_vp2intersect md_clear ibt flush_l1d arch_capabilities
Virtualization features:
Virtualization: VT-x
Caches (sum of all):
L1d: 192 KiB (4 instances)
L1i: 128 KiB (4 instances)
L2: 5 MiB (4 instances)
L3: 8 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-7
Vulnerabilities:
Gather data sampling: Mitigation; Microcode
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Reg file data sampling: Not affected
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIBRS SW sequence; BHI SW loop, KVM SW loop
Srbds: Not affected
Tsx async abort: Not affected
q_new
創造空佇列
malloc
取得 list_head 結構體大小的記憶體空間並配置給新的 list_head 結構體指標,若記憶體取得失敗則回傳 NULLINIT_LIST_HEAD
初始化 list_head 結構體指標,將指向的結構體的 next 和 prev 指向結構體本身q_free
釋放所有佇列使用到的記憶體空間
container_of
取得節點的位址list_del
斷掉節點與佇列的連結q_release_element
釋放節點使用的記憶體q_insert_head
插入新的節點到佇列的第一個節點,且節點中的 value 和 s 字串的內容相同
malloc
取得 element_t 結構體大小的記憶體空間並配置給新的 element_t 結構體指標,若記憶體取得失敗則回傳 falsemalloc
取得 s 字串長度 +1 的記憶體空間並配置給 element_t 結構體指標指向的 element_t 結構體中的 value,若記憶體取得失敗則釋放 element_t 結構體中的 value 並回傳 falsestrncpy
將 s 字串複製到 element_t 結構體中的 value 並在最後加上 '\0'list_add
將新的 element_t 結構體連接到佇列的第一個節點並回傳 trueq_insert_tail
插入新的節點到佇列的最後一個節點,且節點中的 value 和 s 字串的內容相同
malloc
取得 element_t 結構體大小的記憶體空間並配置給新的 element_t 結構體指標,若記憶體取得失敗則回傳 falsemalloc
取得 s 字串長度 +1 的記憶體空間並配置給 element_t 結構體指標指向的 element_t 結構體中的 value,若記憶體取得失敗則釋放 element_t 結構體中的 value 並回傳 falsestrncpy
將 s 字串複製到 element_t 結構體中的 value 並在最後加上 '\0'list_add_tail
將新的 element_t 結構體連接到佇列的最後一個節點並回傳 trueq_remove_head
將佇列的第一個節點移除,且將節點中的 value 字串複製到字串 sp
container_of
取得佇列第一個節點的位址strncpy
複製節點的 value 字串到字串 sp 並在最後加上 '\0'list_del
斷掉節點與佇列的連結並回傳節點的位址q_remove_tail
將佇列的最後一個節點移除,且將節點中的 value 字串複製到字串 sp
container_of
取得佇列最後一個節點的位址strncpy
複製節點的 value 字串到字串 sp 並在最後加上 '\0'list_del
斷掉節點與佇列的連結並回傳節點的位址q_size
取得該佇列節點的數量
list_for_each
疊代佇列中所有的節點並加總節點的數量,最後回傳該數量q_delete_mid
移除並釋放佇列中間的節點
container_of
找到該節點的位址list_del
斷開節點和佇列的連結q_delete_dup
移除並釋放佇列中有相同value的相鄰節點
list_for_each_safe
疊代佇列的所有節點q_swap
交換佇列中每兩個節點的位置
list_for_each_safe
疊代佇列中的每個節點,將 node 和 safe 的位置交換q_reverse
倒置佇列中的節點
list_for_each_safe
疊代佇列中的所有節點list_move
將每個疊代到的節點移動成佇列的第一個節點q_reverseK
將佇列中每 k 個節點視為一個要倒置的 list ,若疊代至最後不足 k 個節點則不進行倒置
list_for_each_safe
疊代佇列中的所有節點list_move
將每個疊代到的節點移動成當前要倒置的 list 的第一個節點q_sort
將佇列中的節點依節點的 value 進行升冪或降冪的排序
merge sort
strcmp
比較兩個佇列節點之間的 value 並依此排序與合併,直到合併成一個排序好且完整的佇列q_ascend
將節點中的佇列依升冪的順序排序,若是右邊節點的 value 等於左邊節點的 value 則移除並且釋放此節點
q_sort
進行升冪排序list_for_each_safe
疊代排序好的佇列中的節點strcmp
比較是否右邊節點的 value 等於左邊節點的 value ,若是則使用 list_del
斷掉節點和佇列的連結,最後釋放節點所占用的記憶體q_descend
將節點中的佇列依降冪的順序排序,若是右邊節點的 value 等於左邊節點的 value 則移除並且釋放此節點
q_sort
進行降冪排序list_for_each_safe
疊代排序好的佇列中的節點strcmp
比較是否右邊節點的 value 等於左邊節點的 value ,若是則使用 list_del
斷掉節點和佇列的連結,最後釋放節點所占用的記憶體q_merge
合併所有佇列並且以升冪或降冪排序
strcmp
比較兩個佇列節點之間的 value 並依此排序與合併,直到合併成一個排序好且完整的佇列list_for_each
疊代此佇列的所有節點以此計算節點的總數,最後回傳佇列中節點的總數