mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 03:59:28 +02:00
+ unload module no longer shows: Module did not release...
+ check-function will no longer be removed when smartlink is on
This commit is contained in:
parent
fe48bc8f27
commit
fcdf7d83d3
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Don't edit, this file is generated by FPCMake Version 1.1 [2002/03/31]
|
||||
# Don't edit, this file is generated by FPCMake Version 1.1 [2002/04/01]
|
||||
#
|
||||
default: all
|
||||
MAKEFILETARGETS=netware
|
||||
@ -207,10 +207,9 @@ SYSTEMUNIT=system
|
||||
else
|
||||
SYSTEMUNIT=sysnetwa
|
||||
endif
|
||||
ifdef RELEASE
|
||||
override FPCOPT+=-Ur
|
||||
endif
|
||||
override FPCOPT+=-dMT
|
||||
CREATESMART=1
|
||||
OBJPASDIR=$(RTL)/objpas
|
||||
override TARGET_UNITS+=$(SYSTEMUNIT) objpas strings netware os_types winsock2 dos crt objects sysutils typinfo math cpu mmx getopts heaptrc lineinfo sockets aio varutils video mouse keyboard
|
||||
override TARGET_LOADERS+=nwpre prelude
|
||||
@ -519,6 +518,7 @@ FPCMADE=fpcmade.qnx
|
||||
ZIPSUFFIX=qnx
|
||||
endif
|
||||
ifeq ($(OS_TARGET),netware)
|
||||
STATICLIBPREFIX=
|
||||
PPUEXT=.ppn
|
||||
OEXT=.on
|
||||
ASMEXT=.s
|
||||
@ -1171,7 +1171,7 @@ strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc\
|
||||
netware$(PPUEXT) : netware.pp $(SYSTEMUNIT)$(PPUEXT)
|
||||
$(COMPILER) -I$(WININC) netware.pp
|
||||
os_types$(PPUEXT) : $(INC)/os_types.pp
|
||||
winsock2$(PPUEXT) : winsock2.pp netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) os_types$(PPUEXT)
|
||||
winsock2$(PPUEXT) : winsock2.pp qos.inc netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) os_types$(PPUEXT)
|
||||
sockets$(PPUEXT) : sockets.pp netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
|
||||
$(INC)/sockets.inc $(INC)/socketsh.inc
|
||||
dos$(PPUEXT) : dos.pp $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
|
||||
|
@ -48,13 +48,16 @@ endif
|
||||
# Use new feature from 1.0.5 version
|
||||
# that generates release PPU files
|
||||
# which will not be recompiled
|
||||
ifdef RELEASE
|
||||
# ifdef RELEASE
|
||||
override FPCOPT+=-Ur
|
||||
endif
|
||||
# endif
|
||||
|
||||
# for netware always use multithread
|
||||
override FPCOPT+=-dMT
|
||||
|
||||
# and alway use smartlinking
|
||||
CREATESMART=1
|
||||
|
||||
# Paths
|
||||
OBJPASDIR=$(RTL)/objpas
|
||||
|
||||
@ -180,3 +183,10 @@ nwimp/locnlm32.imp nwimp/ndpsrpc.imp nwimp/netnlm32.imp nwimp/nit.imp \
|
||||
nwimp/nlmlib.imp nwimp/nwpsrv3x.imp nwimp/nwpsrv.imp nwimp/nwsnut.imp \
|
||||
nwimp/requestr.imp nwimp/socklib.imp nwimp/streams.imp nwimp/threads.imp \
|
||||
nwimp/tli.imp nwimp/vollib.imp nwimp/ws2_32.imp nwimp/ws2nlm.imp
|
||||
|
||||
# the smartlinked objects will not be installed by the
|
||||
# standard makefile ????
|
||||
|
||||
#override UNITPPUFILES+=cpu.a crt.a dos.a getopts.a heaptrc.a keyboard.a \
|
||||
#lineinfo.a math.a mmx.a mouse.a netware.a objects.a objpas.a sockets.a \
|
||||
#strings.a system.a sysutils.a typinfo.a varutils.a video.a winsock2.a
|
||||
|
@ -27,6 +27,9 @@ _pasStart_:
|
||||
call _SetupArgV_411
|
||||
addl $4,%esp
|
||||
ret
|
||||
# this is a hack to avoid that FPC_NW_CHECKFUNCTION will be
|
||||
# eleminated by the linker (with smartlinking)
|
||||
call FPC_NW_CHECKFUNCTION
|
||||
|
||||
|
||||
#
|
||||
|
@ -333,10 +333,18 @@ FUNCTION _ExitCritSec : LONGINT; CDecl; EXTERNAL ThreadsNlm NAME 'ExitCritSec';
|
||||
FUNCTION _SetThreadGroupID (id : longint) : longint; CDecl; EXTERNAL ThreadsNlm NAME 'SetThreadGroupID';
|
||||
FUNCTION _GetThreadGroupID : longint; CDecl; EXTERNAL ThreadsNlm NAME 'GetThreadGroupID';
|
||||
|
||||
CONST _SIGTERM = 6;
|
||||
|
||||
PROCEDURE _Signal (Sig : longint; SigFunc : pointer); CDECL; EXTERNAL Clib NAME 'signal';
|
||||
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.5 2002-03-30 09:09:47 armin
|
||||
Revision 1.6 2002-04-01 15:20:08 armin
|
||||
+ unload module no longer shows: Module did not release...
|
||||
+ check-function will no longer be removed when smartlink is on
|
||||
|
||||
Revision 1.5 2002/03/30 09:09:47 armin
|
||||
+ support check-function for netware
|
||||
|
||||
Revision 1.4 2002/03/08 19:06:47 armin
|
||||
|
@ -88,12 +88,6 @@ PROCEDURE ConsolePrintf (FormatStr : PCHAR); CDecl;
|
||||
|
||||
implementation
|
||||
|
||||
{ ?? why does this not work ?? DEFINE FPC_SYSTEM_HAS_MOVE}
|
||||
{procedure move (const source; var dest; count : longint);
|
||||
begin
|
||||
_memcpy (@dest, @source, count);
|
||||
end;}
|
||||
|
||||
{ include system independent routines }
|
||||
|
||||
{$I system.inc}
|
||||
@ -102,13 +96,13 @@ end;}
|
||||
{$I nwsys.inc}
|
||||
{$I errno.inc}
|
||||
|
||||
procedure setup_arguments;
|
||||
{procedure setup_arguments;
|
||||
begin
|
||||
end;
|
||||
end;
}
|
||||
|
||||
procedure setup_environment;
|
||||
{procedure setup_environment;
|
||||
begin
|
||||
end;
|
||||
end;
}
|
||||
|
||||
|
||||
|
||||
@ -134,25 +128,6 @@ procedure CloseAllRemainingSemaphores; FORWARD;
|
||||
procedure ReleaseThreadVars; FORWARD;
|
||||
{$endif}
|
||||
|
||||
{ if return-value is <> 0, netware shows the message
|
||||
Unload Anyway ?
|
||||
To Disable unload at all, SetNLMDontUnloadFlag can be used on
|
||||
Netware >= 4.0 }
|
||||
function CheckFunction : longint; CDECL; [public,alias: 'FPC_NW_CHECKFUNCTION'];
|
||||
var oldTG:longint;
|
||||
begin
|
||||
if @NetwareCheckFunction <> nil then
|
||||
begin
|
||||
{ this function is called without clib context, to allow clib
|
||||
calls, we set the thread group id before calling the
|
||||
user-function }
|
||||
oldTG := _SetThreadGroupID (NetwareMainThreadGroupID);
|
||||
result := 0;
|
||||
NetwareCheckFunction (result);
|
||||
_SetThreadGroupID (oldTG);
|
||||
end else
|
||||
result := 0;
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
System Dependent Exit code
|
||||
@ -160,6 +135,8 @@ end;
|
||||
|
||||
procedure FreeSbrkMem; forward;
|
||||
|
||||
var SigTermHandlerActive : boolean;
|
||||
|
||||
Procedure system_exit;
|
||||
begin
|
||||
{$ifdef MT}
|
||||
@ -168,10 +145,13 @@ begin
|
||||
{$endif}
|
||||
FreeSbrkMem; { free memory allocated by heapmanager }
|
||||
|
||||
if ExitCode <> 0 Then { otherwise we dont see runtime-errors }
|
||||
PressAnyKeyToContinue;
|
||||
if not SigTermHandlerActive then
|
||||
begin
|
||||
if ExitCode <> 0 Then { otherwise we dont see runtime-errors }
|
||||
PressAnyKeyToContinue;
|
||||
|
||||
_exit (ExitCode);
|
||||
_exit (ExitCode);
|
||||
end;
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
@ -291,6 +271,7 @@ begin
|
||||
_free (HeapSbrkBlockList);
|
||||
HeapSbrkAllocated := 0;
|
||||
HeapSbrkLastUsed := 0;
|
||||
HeapSbrkBlockList := nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -659,6 +640,34 @@ procedure InitFPU;assembler;
|
||||
{ include threading stuff, this is os dependend part }
|
||||
{$I thread.inc}
|
||||
|
||||
{ if return-value is <> 0, netware shows the message
|
||||
Unload Anyway ?
|
||||
To Disable unload at all, SetNLMDontUnloadFlag can be used on
|
||||
Netware >= 4.0 }
|
||||
function CheckFunction : longint; CDECL; [public,alias: 'FPC_NW_CHECKFUNCTION'];
|
||||
var oldTG:longint;
|
||||
oldPtr: pointer;
|
||||
begin
|
||||
if assigned (NetwareCheckFunction) then
|
||||
begin
|
||||
{ this function is called without clib context, to allow clib
|
||||
calls, we set the thread group id before calling the
|
||||
user-function }
|
||||
oldTG := _SetThreadGroupID (NetwareMainThreadGroupID);
|
||||
{ to allow use of threadvars, we simply set the threadvar-memory
|
||||
from the main thread }
|
||||
oldPtr:= _GetThreadDataAreaPtr;
|
||||
_SaveThreadDataAreaPtr (thredvarsmainthread);
|
||||
result := 0;
|
||||
NetwareCheckFunction (result);
|
||||
_SaveThreadDataAreaPtr (oldPtr);
|
||||
_SetThreadGroupID (oldTG);
|
||||
end else
|
||||
result := 0;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{$ifdef StdErrToConsole}
|
||||
var ConsoleBuff : array [0..512] of char;
|
||||
|
||||
@ -703,7 +712,28 @@ begin
|
||||
Rewrite(T);
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
|
||||
|
||||
{ this will be called if the nlm is unloaded. It will NOT be
|
||||
called if the program exits i.e. with halt.
|
||||
Halt (or _exit) can not be called from this callback procedure }
|
||||
procedure TermSigHandler (Sig:longint); CDecl;
|
||||
var oldTG : longint;
|
||||
oldPtr: pointer;
|
||||
begin
|
||||
oldTG := _SetThreadGroupID (NetwareMainThreadGroupID); { this is only needed for nw 3.11 }
|
||||
|
||||
{ _GetThreadDataAreaPtr will not be valid because the signal
|
||||
handler is called by netware with a differnt thread. To avoid
|
||||
problems in the exit routines, we set the data of the main thread
|
||||
here }
|
||||
oldPtr:= _GetThreadDataAreaPtr;
|
||||
_SaveThreadDataAreaPtr (thredvarsmainthread);
|
||||
SigTermHandlerActive := true; { to avoid that system_exit calls _exit }
|
||||
do_exit; { calls finalize units }
|
||||
_SaveThreadDataAreaPtr (oldPtr);
|
||||
_SetThreadGroupID (oldTG);
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
@ -715,9 +745,11 @@ Begin
|
||||
{ the exceptions use threadvars so do this _before_ initexceptions }
|
||||
AllocateThreadVars;
|
||||
{$endif MT}
|
||||
|
||||
SigTermHandlerActive := false;
|
||||
NetwareCheckFunction := nil;
|
||||
NetwareMainThreadGroupID := _GetThreadGroupID;
|
||||
|
||||
_Signal (_SIGTERM, @TermSigHandler);
|
||||
|
||||
{ Setup heap }
|
||||
InitHeap;
|
||||
@ -739,8 +771,8 @@ Begin
|
||||
{$endif}
|
||||
|
||||
{ Setup environment and arguments }
|
||||
Setup_Environment;
|
||||
Setup_Arguments;
|
||||
{Setup_Environment;
|
||||
Setup_Arguments;
}
|
||||
{ Reset IO Error }
|
||||
InOutRes:=0;
|
||||
{Delphi Compatible}
|
||||
@ -750,7 +782,11 @@ Begin
|
||||
End.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.9 2002-04-01 10:47:31 armin
|
||||
Revision 1.10 2002-04-01 15:20:08 armin
|
||||
+ unload module no longer shows: Module did not release...
|
||||
+ check-function will no longer be removed when smartlink is on
|
||||
|
||||
Revision 1.9 2002/04/01 10:47:31 armin
|
||||
makefile.fpc for netware
|
||||
stderr to netware console
|
||||
free all memory (threadvars and heap) to avoid error message while unloading nlm
|
||||
|
@ -30,7 +30,8 @@
|
||||
}
|
||||
|
||||
const
|
||||
threadvarblocksize : dword = 0; // total size of allocated threadvars
|
||||
threadvarblocksize : dword = 0; // total size of allocated threadvars
|
||||
thredvarsmainthread: pointer = nil; // to free the threadvars in the signal handler
|
||||
|
||||
type
|
||||
tthreadinfo = record
|
||||
@ -63,9 +64,6 @@ procedure init_unit_threadvars (tableEntry : pltvInitEntry);
|
||||
begin
|
||||
while tableEntry^.varaddr <> nil do
|
||||
begin
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf3(#13'init_unit_threadvars, size: %d, addr: %d'#13#10,tableEntry^.size,dword(tableEntry^.varaddr),0);
|
||||
{$endif}
|
||||
init_threadvar (tableEntry^.varaddr^, tableEntry^.size);
|
||||
inc (pchar (tableEntry), sizeof (tableEntry^));
|
||||
end;
|
||||
@ -87,8 +85,15 @@ begin
|
||||
ConsolePrintf(#13'init_all_unit_threadvars (%d) units'#13#10,ThreadvarTablesTable.count);
|
||||
{$endif}
|
||||
for i := 1 to ThreadvarTablesTable.count do
|
||||
begin
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf(#13'init_unit_threadvars for unit (%d):'#13#10,i);
|
||||
{$endif}
|
||||
init_unit_threadvars (ThreadvarTablesTable.tables[i]);
|
||||
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf(#13'init_unit_threadvars for unit (%d) done'#13#10,i);
|
||||
{$endif}
|
||||
end;
|
||||
end;
|
||||
|
||||
{$ifdef DEBUG_MT}
|
||||
@ -96,17 +101,18 @@ var dummy_buff : array [0..255] of char; // to avoid abends (for current compil
|
||||
{$endif}
|
||||
|
||||
function relocate_threadvar(offset : dword) : pointer;[public,alias: 'FPC_RELOCATE_THREADVAR'];
|
||||
var p : pointer;
|
||||
begin
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf(#13'relocate_threadvar, offset: (%d)'#13#10,offset);
|
||||
// ConsolePrintf(#13'relocate_threadvar, offset: (%d)'#13#10,offset);
|
||||
if offset > threadvarblocksize then
|
||||
begin
|
||||
ConsolePrintf(#13'relocate_threadvar, invalid offset'#13#10,0);
|
||||
// ConsolePrintf(#13'relocate_threadvar, invalid offset'#13#10,0);
|
||||
relocate_threadvar := @dummy_buff;
|
||||
exit;
|
||||
end;
|
||||
{$endif DEBUG_MT}
|
||||
relocate_threadvar:=_GetThreadDataAreaPtr + offset;
|
||||
relocate_threadvar:= _GetThreadDataAreaPtr + offset;
|
||||
end;
|
||||
|
||||
procedure AllocateThreadVars;
|
||||
@ -124,9 +130,10 @@ procedure AllocateThreadVars;
|
||||
fillchar (threadvars^, threadvarblocksize, 0);
|
||||
_SaveThreadDataAreaPtr (threadvars);
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf(#13'threadvars allocated at (%x)'#13#10,longint(threadvars));
|
||||
ConsolePrintf(#13'size of threadvars: %d'#13#10,threadvarblocksize);
|
||||
ConsolePrintf3(#13'threadvars allocated at (%x), size: %d'#13#10,longint(threadvars),threadvarblocksize,0);
|
||||
{$endif DEBUG_MT}
|
||||
if thredvarsmainthread = nil then
|
||||
thredvarsmainthread := threadvars;
|
||||
end;
|
||||
|
||||
procedure ReleaseThreadVars;
|
||||
@ -136,7 +143,13 @@ begin
|
||||
if threadvarblocksize > 0 then
|
||||
begin
|
||||
threadvars:=_GetThreadDataAreaPtr;
|
||||
_Free (threadvars);
|
||||
if threadvars <> nil then
|
||||
begin
|
||||
{$ifdef DEBUG_MT}
|
||||
ConsolePrintf (#13'free threadvars'#13#10,0);
|
||||
{$endif DEBUG_MT}
|
||||
_Free (threadvars);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -356,7 +369,11 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 2002-04-01 10:47:31 armin
|
||||
Revision 1.4 2002-04-01 15:20:08 armin
|
||||
+ unload module no longer shows: Module did not release...
|
||||
+ check-function will no longer be removed when smartlink is on
|
||||
|
||||
Revision 1.3 2002/04/01 10:47:31 armin
|
||||
makefile.fpc for netware
|
||||
stderr to netware console
|
||||
free all memory (threadvars and heap) to avoid error message while unloading nlm
|
||||
|
Loading…
Reference in New Issue
Block a user