Workshop/ReadGHC/1
調整/当日スケジュール
(日程調整中) GHCソースコードリーディング勉強会 第1回(RTS編?) - [PARTAKE]
会場案
- @kazu_yamamoto : @master_q GHC ソースコードリーディングですが、6月9日以降の土日なら、IIJ の会議室 を貸し出せると思います。
- 田町のミラクルリナックス会議室を貸してもらえそう 最大15人が限界
- 結局ミラクルリナックスで開催となった。
資料
GHC RTS起動時のコールグラフ
hs_init(int *argc, char **argv[])
-> hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
-> initScheduler()
-> initCapabilities()
-> moreCapabilities(0, RtsFlags.ParFlags.nNodes)
for i in 0..RtsFlags.ParFlags.nNodes
-> initCapability(&capabilities[i], i)
initMutex(capabilities[i].lock)
# その他capabilities[i]のメンバーを初期値でうめる
n_capabilities = RtsFlags.ParFlags.nNodes
enabled_capabilities = n_capabilities
last_free_capability = &capabilities[0] # 後でIOスレッド用に使う
-> initTaskManager()
-> startWorkerTasks(1, n_capabilities)
for i in 1..n_capabilities
-> startWorkerTask(&capabilities[i])
task = newTask(rtsTrue)
task->cap = &capabilities[i]
capabilities[i].running_task = task
createOSThread(&tid, (OSThreadProc*)workerStart, task)
-> workerStart(Task *task) # 新しいスレッド
-> setMyTask(task)
setThreadLocalVar(¤tTaskKey,task)
-> newInCall(task)
incall = stgMallocBytes((sizeof(InCall)), "newBoundTask")
incall->task = task
incall->prev_stack = task->incall
task->incall = incall
-> scheduleWorker(task->cap,task)
cap = schedule(task->cap,task) # スケジュールループ
releaseCapability_(cap,rtsFalse)
workerTaskStop(task)
task->id = tid
# これでCapabilityの数だけWorkerスレッド(Task)を作れた
# この時点ではCapability<=>Task<=>InCallは1対1対1写像
-> initStorage()
xxxxxxxxxxxxxxxxxxxxxxxx この中はもっと読む必要有り
-> getStablePtr((StgPtr)xxxx_closure) # xxxxxxxxx GCルートの設定?
-> initTimer()
-> startTimer()
-> ioManagerStart()
-> cap = rts_lock()
-> task = newBoundTask()
-> task = allocTask()
-> task = myTask()
task = newTask(rtsFalse)
ask->id = osThreadId()
setMyTask(task)
return task
newInCall(task)
-> waitForReturnCapability(&cap, task)
cap = last_free_capability
task->cap = cap
cap->running_task = task
return cap
-> ioManagerStartCap(&cap)
-> rts_evalIO(cap,&base_GHCziConcziIO_ensureIOManagerIsRunning_closure,NULL)
-> tso = createStrictIOThread(*cap, RtsFlags.GcFlags.initialStkSize, p)
-> StgTSO *t = createThread(cap, stack_size)
stack = (StgStack *)allocate(cap, stack_size)
tso = (StgTSO *)allocate(cap, sizeofW(StgTSO))
tso->what_next = ThreadRunGHC
tso->stackobj = stack
tso->id = next_thread_id++
tso->global_link = g0->threads
g0->threads = tso
pushClosure(t, (W_)&stg_forceIO_info)
pushClosure(t, (W_)&stg_ap_v_info)
pushClosure(t, (W_)closure) # base_GHCziConcziIO_ensureIOManagerIsRunning_closure
pushClosure(t, (W_)&stg_enter_info)
# xxxxx このクロージャの設定がHaskell worldとの橋?
# pushClosureを読むかぎりだとStgTSOのスタックに積むだけ
return t
-> scheduleWaitThread(tso,ret,cap)
task = cap->running_task
tso->bound = task->incall
tso->cap = cap
task->incall->tso = tso
-> appendToRunQueue(cap,tso)
cap->run_queue_hd = tso
tso->block_info.prev = END_TSO_QUEUE
cap->run_queue_tl = tso
cap = schedule(cap,task) # スケジュールループ
議事録
発表資料
- GCをみればRTSが見えてくる、かも。。。
- ghc llvm backend — LLVM 0.1 documentation
- GHC へのプログラム変換パスの追加(pdf)
- Dive into RTS - another side
togetter
録画と写真
録画1は途中まで音が入ってないです。ごめんなさい。。。
ネタ案出し
懇親会
ピザ頼んだ。
■ご注文明細
└─────────────
----------------------------------------
○マルゲリータ
レギュラークラスト Lサイズ
数量:1 計:2,800円
----------------------------------------
○ドミノ・デラックス
レギュラークラスト Lサイズ
数量:1 計:3,000円
----------------------------------------
○グリル野菜たっぷりのピッツァ
レギュラークラスト Lサイズ
数量:1 計:3,280円
----------------------------------------
△ネット注文特典 5%OFF
数量:1 計:454円引き
----------------------------------------
合計金額 8,626円(うち消費税410円)
他会計。ビアバッシュ安いですね。