このクラスには、この例に関する 2 つの問題に対処するメソッドが含まれています。1 つ目は、ログされるメッセージおよびログに送信されるメッセージとその後の表示の両方をアーカイブ処理するメソッドを保持するために必要な構造体の初期化です。
2 つ目の一連のメソッドは、プロデューサとコンシューマを識別するための番号付けされた順序の名前の生成を処理します。これは厳密には必要ありません。その理由は $JOB コマンドによって提供される InterSystems IRIS のプロセス ID でも行われるためです。ただし、読みやすいラベルを使用する方が簡単です。
/// Utility class
Class Semaphore.Util Extends %RegisteredObject [ ProcedureBlock ]
{
/// The name of the shared semaphore
Parameter ME = "Util";
/// initialize output log
ClassMethod InitLog()
{
// initialize the logging global
Kill ^SemaphoreLog
Set ^SemaphoreLog = 0
Quit
}
/// Enter messages as received into a global
/// for logging purposes
ClassMethod Logger(sender As %String, msg As %String)
{
Set inx = $INCREMENT(^SemaphoreLog)
Set ^SemaphoreLog(inx, 0) = $JOB
Set ^SemaphoreLog(inx, 1) = sender
Set ^SemaphoreLog(inx, 2) = msg
Write "(", ^SemaphoreLog, ") ", msg, !
Quit
}
/// display the messages in the log
ClassMethod ShowLog()
{
Set msgcnt = $GET(^SemaphoreLog, 0)
Write "Message Log: Entries = ", msgcnt, !, !
Write "#", ?5, "$JOB", ?12, "Sender", ?25, "Message", !
For i = 1 : 1 : msgcnt {
Set job = ^SemaphoreLog(i, 0)
Set sender = ^SemaphoreLog(i, 1)
Set msg = ^SemaphoreLog(i, 2)
Write i, ")", ?5, job, ?12, sender, ":", ?25, msg, !
}
Quit
}
/// initialize the name index
ClassMethod InitIndex()
{
// initialize the logging global
Kill ^SemaphoreNames
Quit
}
/// initialize the name index
ClassMethod IndexName(name As %String) As %String
{
If ($DATA(^SemaphoreNames(name)) = 0) {
Set ^SemaphoreNames(name) = 0
}
Set index = $INCREMENT(^SemaphoreNames(name))
Quit (name _ "." _ index)
}
}