First commit.
This is document describing proper use of the GraphicsLock when extending code. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1270 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -0,0 +1,104 @@
|
|||||||
|
HOW TO NOT GET HOSED BY DOUBLE-LOCK/UNLOCKS WITH GraphicsLock
|
||||||
|
|
||||||
|
For the kinds of modifications you're likely to be doing, there only a
|
||||||
|
few functions that you must take care to ensure that you hold
|
||||||
|
GraphicsLock before calling. There are also some general guidelines.
|
||||||
|
|
||||||
|
GENERAL GUIDELINES
|
||||||
|
|
||||||
|
- Don't hold the GraphicsLock in Generate* functions.
|
||||||
|
|
||||||
|
- Always hold it while doing ship operations - they're all only called
|
||||||
|
by RedrawQueue. (preprocess, postprocess, etc.)
|
||||||
|
|
||||||
|
- On ConcludeTask, you must not be holding *anything* or you could
|
||||||
|
cause a deadlock if the thread you're waiting to conclude needs
|
||||||
|
whatever lock you hold before it can safely exit. It is
|
||||||
|
acceptable to hold the GraphicsLock when merely calling
|
||||||
|
Task_SetState.
|
||||||
|
|
||||||
|
Specific Guidelines:
|
||||||
|
|
||||||
|
Always hold the GraphicsLock when calling...
|
||||||
|
|
||||||
|
- SetFlashRect in sis.c; this changes which part of the screen is
|
||||||
|
flashing. Very common.
|
||||||
|
|
||||||
|
- RedrawQueue in process.c; this is for updating all the the graphics
|
||||||
|
for ship animations.
|
||||||
|
|
||||||
|
- GetMeleeStarShip in pickmele.c. That this is extern at all is
|
||||||
|
probably a sign of lousy code organization.
|
||||||
|
|
||||||
|
- DoMenuOptions in hyper.c; this is a consequence of being called from
|
||||||
|
a ship operation when in hyperspace, which means that it must assume
|
||||||
|
that it's called with the GraphicsLock held.
|
||||||
|
|
||||||
|
- DoDiscoveryReport in planets/report.c; this is called by the
|
||||||
|
Generate* functions, which always start out not holding the Lock.
|
||||||
|
|
||||||
|
- ClearSISRect and DeltaSISGauges in sis.c; you might call these if
|
||||||
|
working on code that modifies fuel or crew somehow.
|
||||||
|
|
||||||
|
THE GORY DETAILS
|
||||||
|
|
||||||
|
[functionname] means that the function is static and demands lockedness.
|
||||||
|
<functionname> means that the function is static and demands unlockedness.
|
||||||
|
*functionname* means that the function is extern and demands lockedness
|
||||||
|
(functionname) means that the function is extern and demands unlockedness.
|
||||||
|
|
||||||
|
This information is incomplete, and the result of a fairly informal
|
||||||
|
hand-analysis of the code. In the case of extern-requires-lock,
|
||||||
|
context and calling sites have been tracked so that all such functions
|
||||||
|
are reached.
|
||||||
|
|
||||||
|
battle.c: (Battle)
|
||||||
|
border.c: (DrawSISFrame)
|
||||||
|
build.c: (ActivateStarShip)
|
||||||
|
clock.c: (clock_task_func)
|
||||||
|
comm.c: (ambient_anim_task) [SpewPhrases] (AlienTalkSegue)
|
||||||
|
<DoCommunication> [HailAlien] (InitCommunication)
|
||||||
|
confirm.c: (DoConfirmExit)
|
||||||
|
credits.c: (Credits) (OutTakes)
|
||||||
|
encount.c: <DoSelectAction> (InitEncounter) [DrawFadeText]
|
||||||
|
(UninitEncounter) (EncounterBattle)
|
||||||
|
fmv.c: (Introduction)
|
||||||
|
gameopt.c: <FeedbackSetting> <FeedbackQuit> <DrawDescriptionString>
|
||||||
|
<DoNaming> <DoSettings> <DoQuitMenu> [ShowSummary]
|
||||||
|
<DoPickGame> <PickGame>
|
||||||
|
hyper.c: *LoadHyperspace* *FreeHyperspace* *DoMenuOptions*
|
||||||
|
init.c: *InitShips* *UninitShips*
|
||||||
|
melee.c: [DrawPickFrame] (flash_selection_func) <DrawMeleeShipStrings>
|
||||||
|
<DoLoadTeam> <DoSaveTeam> <DoEdit> <DoPickShip>
|
||||||
|
<FreeMeleeInfo> <DoMelee>
|
||||||
|
menu.c: (DrawMenuStateStrings)
|
||||||
|
outfit.c: <DoInstallModule> (ChangeFuelQuantity) (DoOutfit)
|
||||||
|
pickmele.c: *GetMeleeStarShip*
|
||||||
|
pickship.c: <DoPickBattleShip> [GetArmadaStarShip]
|
||||||
|
process.c: *RedrawQueue*
|
||||||
|
restart.c: <DrawRestartMenu> <DoRestart> (StartGame)
|
||||||
|
save.c: (SaveProblem)
|
||||||
|
ship.c: *ship_preprocess*
|
||||||
|
shipyard.c: (hangar_anim_func) <DrawRaceStrings> <ShowCombatShip>
|
||||||
|
[CrewTransaction] <DoModifyShips> <DrawBluePrint>
|
||||||
|
(DoShipyard)
|
||||||
|
sis.c: *ClearSISRect* *DeltaSISGauges* (flash_rect_func)
|
||||||
|
*SetFlashRect*
|
||||||
|
starbase.c: (rotate_starbase) (DoStarBase)
|
||||||
|
starcon.c: (arilou_gate_task) (Starcon2Main)
|
||||||
|
utils.c: (PauseGame)
|
||||||
|
cargo.c: (DrawCargoStrings) <DoDiscardCargo> (Cargo)
|
||||||
|
devices.c: <DrawDevices> <DoManipulateDevices> (Devices)
|
||||||
|
lander.c: <ScrollPlanetSide> [AnimateLaunch] <InitPlanetSide>
|
||||||
|
<ReturnToOrbit> (PlanetSide) (InitLander)
|
||||||
|
planets.c: (LoadPlanet) (FreePlanet)
|
||||||
|
plangen.c: (rotate_planet_task)
|
||||||
|
pstarmap.c: (flash_cursor_func) (DrawStarMap) [EraseCursor]
|
||||||
|
<DoMoveCursor> [DoStarMap] (DoFlagshipCommands)
|
||||||
|
report.c: [MakeReport] *DoDiscoveryReport*
|
||||||
|
roster.c: (flash_ship_task) <DoModifyRoster>
|
||||||
|
scan.c: <EraseCoarseScan> <PrintCoarseScanPC> <PrintCoarseScan3DO>
|
||||||
|
<SetPlanetLoc> (flash_planet_loc_func) <PickPlanetSide>
|
||||||
|
<DoScan> (ScanSystem)
|
||||||
|
solarsys.c: <FreeSolarSys> (IPtask_func) <DrawInnerSystem>
|
||||||
|
(ChangeSolarSys) <InitSolarSys>
|
||||||
Reference in New Issue
Block a user