contributed by < cymizer >
qtest
提供新的命令 shuffle
,允許藉由 Fisher–Yates shuffle 演算法,對佇列中所有節點進行洗牌 (shuffle) 操作qtest
提供新的命令 web
,提供 web 伺服器功能,注意: web 伺服器運作過程中,qtest 仍可接受其他命令
分配記憶體空間失敗
,則會回傳 NULL
.INIT_LIST_HEAD(head)
來做簡化.NULL
list_for_each_safe()
來尋訪 list 之 node 並從 list 中移除,在閱讀 list.h
裡面相關的註解,可以知道用此 api 去保證在尋訪 list node 並移除時的安全,因為他多使用了一個 list_head *safe
來保存下一個 node.container_of
來得到 entry address,透過 element_t pointer
釋放其資源.element *ele
,接著檢查是否 allocate 成功ele->value
,再做完之後檢查是否有 allocate 成功。list_add()
將 node 加入 list 中list_add_tail()
即可head->next
本身 element_t
的 addresshead->next
從 list 的 head 移除\0
當做*prev = head->prev;
,和 line 6,7 改動為 next
=> prev
即可list_for_each()
尋訪 list ,最後回傳 list 長度list_empty()
的檢查。 如果沒有做檢查的話,會造成後面程式執行的 invalid memory access。list_for_each()
尋訪 list nodenext
之外,還特別使用 safe
來保存下下個 nodestrcmp = 0
,則將該 node 移除list_for_each()
尋訪list_for_each_safe()
走訪並將其 node 移到 head 的位置移除的節點
並加入 head
時會發生錯誤。如果使用原本的 code,會讀取到 head list 中的下個 node ,而非原本的所預期的 l or r 的 list node 中所指向的下個 node。將 line 1, 9, 10 移除,改成 line 10 才會符合預期情況。會執行 Makefile
裡面valgrind
的部份
會產生以下相關錯誤訊息
錯誤訊息告訴我們記憶體 still reachable
,代表程式結束時仍有記憶體未釋放。
依照錯誤訊息查看相關程式碼
它做的事情是將 HISTORY_FILE = .cmd_history
的資料載入到在 linenoise.c:132
的 static char **history
。
註: HISTORY_FILE 可以用
grep -r HISTORY_FILE
找到在console.c
定義
可以發現無相關釋放記憶體的程式碼在其中。所以嘗試在程式碼中搜尋 free
關鍵字可以找到 freeHistory
。以 freeHistory
為關鍵字搜尋可以找到在 linenoiseAtExit
被使用。
呼叫關係為 run_console() => linenosie() => linenoiseRaw() => enableRawMode() => atexit(linenoiseAtExit()) => freeHistory(),其中 atexit()
是去註冊在程序離開結束被調用指定的函數。
所以將 main.c:975 => 移到 console.c:651 更為合理,在有 infile 的時候才會去載入HISTORY_FILE
console_init()
init 的 cmd_list 沒有被 release 掉因為在使用 make valgrind
的時候會造成運算速度下降導致 不是constant time
,近而造成 ok
這個 flag 變成 false
,因為使用 &&
連帶影響到不會執行finish_cmd()
。所以將其順序調換就可以進行 finish_cmd()
的動作。
qtest.c
shuffle
, web_server
it
可以透過 it RAND N
N= the number of elementtime command
來對後面的 command 來進行 profiling