// Start the link void StartLink(LINK *k) { PACKET_ADAPTER *pa; // Validate arguments if (k == NULL) { return; } LockLink(k); { if (k->Started || k->Halting) { UnlockLink(k); return; } k->Started = true; } UnlockLink(k); // Connect the client session pa = LinkGetPacketAdapter(); pa->Param = (void *)k; LockLink(k); { k->ClientSession = NewClientSession(k->Cedar, k->Option, k->Auth, pa); } UnlockLink(k); }
// リンクの開始 void StartLink(LINK *k) { PACKET_ADAPTER *pa; // 引数チェック if (k == NULL) { return; } LockLink(k); { if (k->Started || k->Halting) { UnlockLink(k); return; } k->Started = true; } UnlockLink(k); // クライアントセッション接続 pa = LinkGetPacketAdapter(); pa->Param = (void *)k; LockLink(k); { k->ClientSession = NewClientSession(k->Cedar, k->Option, k->Auth, pa); } UnlockLink(k); }
BYTE NameCaptain (QUEUE *pQueue, SPECIES_ID SpeciesID) { BYTE name_index; HLINK hStarShip; assert (GetLinkSize (pQueue) == sizeof (STARSHIP) || GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT)); do { HLINK hNextShip; name_index = PickCaptainName (); for (hStarShip = GetHeadLink (pQueue); hStarShip; hStarShip = hNextShip) { SHIP_BASE *ShipPtr; BYTE test_name_index = -1; ShipPtr = (SHIP_BASE *) LockLink (pQueue, hStarShip); hNextShip = _GetSuccLink (ShipPtr); if (ShipPtr->SpeciesID == SpeciesID) test_name_index = ShipPtr->captains_name_index; UnlockLink (pQueue, hStarShip); if (name_index == test_name_index) break; } } while (hStarShip /* name matched another ship */); return name_index; }
// Stop the link void StopLink(LINK *k) { // Validate arguments if (k == NULL) { return; } LockLink(k); { if (k->Started == false) { UnlockLink(k); return; } k->Started = false; k->Halting = true; Dec(k->Cedar->CurrentActiveLinks); } UnlockLink(k); if (k->ClientSession != NULL) { // Disconnect the client session StopSession(k->ClientSession); LockLink(k); { ReleaseSession(k->ClientSession); k->ClientSession = NULL; } UnlockLink(k); } LockLink(k); { k->Halting = false; } UnlockLink(k); }
// リンクの停止 void StopLink(LINK *k) { // 引数チェック if (k == NULL) { return; } LockLink(k); { if (k->Started == false) { UnlockLink(k); return; } k->Started = false; k->Halting = true; } UnlockLink(k); if (k->ClientSession != NULL) { // クライアントセッション切断 StopSession(k->ClientSession); LockLink(k); { ReleaseSession(k->ClientSession); k->ClientSession = NULL; } UnlockLink(k); } LockLink(k); { k->Halting = false; } UnlockLink(k); }
HLINK GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index) { HLINK hStarShip, hNextShip; for (hStarShip = GetHeadLink (pShipQ); Index > 0 && hStarShip; hStarShip = hNextShip, --Index) { LINK *StarShipPtr; StarShipPtr = LockLink (pShipQ, hStarShip); hNextShip = _GetSuccLink (StarShipPtr); UnlockLink (pShipQ, hStarShip); } return (hStarShip); }
COUNT GetIndexFromStarShip (QUEUE *pShipQ, HLINK hStarShip) { COUNT Index; Index = 0; while (hStarShip != GetHeadLink (pShipQ)) { HLINK hNextShip; LINK *StarShipPtr; StarShipPtr = LockLink (pShipQ, hStarShip); hNextShip = _GetPredLink (StarShipPtr); UnlockLink (pShipQ, hStarShip); hStarShip = hNextShip; ++Index; } return Index; }
// Allocate a new STARSHIP or SHIP_FRAGMENT and put it in the queue HLINK Build (QUEUE *pQueue, SPECIES_ID SpeciesID) { HLINK hNewShip; SHIP_BASE *ShipPtr; assert (GetLinkSize (pQueue) == sizeof (STARSHIP) || GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT)); hNewShip = AllocLink (pQueue); if (!hNewShip) return 0; ShipPtr = (SHIP_BASE *) LockLink (pQueue, hNewShip); memset (ShipPtr, 0, GetLinkSize (pQueue)); ShipPtr->SpeciesID = SpeciesID; UnlockLink (pQueue, hNewShip); PutQueue (pQueue, hNewShip); return hNewShip; }