unit clean;
interface
uses
Windows,
Classes;
{ This is the misc. thread function, also known as the 'simple task thread'.
This thread performs some low-priority functions, such as console/immortal
reboots/shutdowns, loading of background images, etc.
This thread also takes care of autosaves, which are generated by the timer,
to prevent excessive data loss with hard crashes.
This all happens on the background as to relieve the server main thread. - Grimlord }
type GCleanThread = class(TThread)
private
t_message:integer;
t_log:string;
protected
procedure StopMud;
procedure BootMsg;
procedure AutoSave;
procedure SyncWrite;
procedure SyncHalt;
procedure SyncWritelog(s:string);
procedure Execute; override;
public
procedure SetMessage(msg:integer);
constructor Create;
end;
implementation
uses
SysUtils,
chars,
conns,
constants,
dtypes,
mudsystem;
constructor GCleanThread.Create;
begin
inherited Create(false);
SyncWritelog('Started cleanup thread.');
t_message:=0;
SetThreadPriority(Handle,THREAD_PRIORITY_IDLE);
freeonterminate := true;
end;
procedure GCleanThread.SyncWrite;
begin
write_console(t_log);
end;
procedure GCleanThread.SyncHalt;
begin
halt;
end;
procedure GCleanThread.SyncWritelog(s:string);
begin
t_log:=s;
Synchronize(SyncWrite);
end;
procedure GCleanThread.SetMessage(msg:integer);
begin
t_message:=msg;
end;
procedure GCleanThread.BootMsg;
begin
case boot_info.boot_type of
BOOTTYPE_SHUTDOWN:begin
SyncWritelog(inttostr(boot_info.timer)+' seconds till shutdown');
to_channel(nil, '$B$1 ---- Server $3shutdown$1 in $7' + inttostr(boot_info.timer) + '$1 seconds! ----',CHANNEL_ALL,AT_REPORT);
end;
BOOTTYPE_REBOOT:begin
SyncWritelog(inttostr(boot_info.timer)+' seconds till reboot');
to_channel(nil, '$B$1 ---- Server $3reboot$1 in $7' + inttostr(boot_info.timer) + '$1 seconds! ----',CHANNEL_ALL,AT_REPORT);
end;
BOOTTYPE_COPYOVER:begin
SyncWritelog(inttostr(boot_info.timer)+' seconds till reboot');
to_channel(nil, '$B$1 ---- Server $3copyover$1 in $7' + inttostr(boot_info.timer) + '$1 seconds! ----',CHANNEL_ALL,AT_REPORT);
end;
end;
end;
procedure GCleanThread.StopMud;
begin
case boot_info.boot_type of
BOOTTYPE_SHUTDOWN:begin
SyncWritelog('Timer reached zero, starting shutdown now');
to_channel(nil, '$B$1 ---- Server will $3shutdown $7NOW!$1 ----',CHANNEL_ALL,AT_REPORT);
end;
BOOTTYPE_REBOOT:begin
SyncWritelog('Timer reached zero, starting reboot now');
to_channel(nil, '$B$1 ---- Server will $3reboot $7NOW!$1 ----',CHANNEL_ALL,AT_REPORT);
end;
BOOTTYPE_COPYOVER:begin
SyncWritelog('Timer reached zero, starting copyover now');
to_channel(nil, '$B$1 ---- Server will $3copyover $7NOW!$1 ----',CHANNEL_ALL,AT_REPORT);
end;
end;
boot_type := boot_info.boot_type;
grace_exit := true;
Synchronize(SyncHalt);
end;
procedure GCleanThread.AutoSave;
var
ch : GCharacter;
node : GListNode;
begin
SyncWritelog('Autosaving characters...');
node := char_list.head;
while (node <> nil) do
begin
ch := node.element;
if (not ch.IS_NPC) then
ch.save(ch.name^);
node := node.next;
end;
end;
procedure GCleanThread.Execute;
var msg:TMsg;
begin
repeat
if (t_message>0) then
begin
case t_message of
CLEAN_BOOT_MSG:BootMsg;
CLEAN_MUD_STOP:StopMud;
CLEAN_STOP:Terminate;
CLEAN_AUTOSAVE:AutoSave;
end;
t_message:=0;
end;
sleep(500);
until (Terminated);
SyncWritelog('Simple task thread terminated.');
end;
end.