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(&currentTaskKey,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) # スケジュールループ

議事録

発表資料

togetter

#readghc 第一回 - Togetter

録画と写真

写真

録画1 録画2 録画3

録画1は途中まで音が入ってないです。ごめんなさい。。。

ネタ案出し

懇親会

ピザ頼んだ。

■ご注文明細
└─────────────
 ----------------------------------------
 ○マルゲリータ
  レギュラークラスト Lサイズ
  数量:1 計:2,800円
 ----------------------------------------
 ○ドミノ・デラックス
  レギュラークラスト Lサイズ
  数量:1 計:3,000円
 ----------------------------------------
 ○グリル野菜たっぷりのピッツァ
  レギュラークラスト Lサイズ
  数量:1 計:3,280円
 ----------------------------------------
 △ネット注文特典 5%OFF
  数量:1 計:454円引き
 ----------------------------------------

 合計金額 8,626円(うち消費税410円)

他会計。ビアバッシュ安いですね。

次回

2