Don't create thunk for task signal proc, call it directly.

diff --git a/loader/.cvsignore b/loader/.cvsignore
index f3c7a7c..c2b6613 100644
--- a/loader/.cvsignore
+++ b/loader/.cvsignore
@@ -1 +1,2 @@
 Makefile
+task.glue.c
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 580d1e6..448f984 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -18,6 +18,8 @@
 	signal.c \
 	task.c
 
+GLUE = task.c
+
 all: $(MODULE).o
 
 @MAKE_RULES@
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 7dc258a..fee2a06 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -1290,15 +1290,10 @@
     {
         if (pModule->flags & NE_FFLAGS_LIBMODULE)
         {
-            TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
             MODULE_CallWEP( hModule );
 
             /* Free the objects owned by the DLL module */
-
-            if (pTask && pTask->userhandler)
-                pTask->userhandler( hModule, USIG16_DLL_UNLOAD, 0,
-                                    pTask->hInstance, pTask->hQueue );
-
+            TASK_CallTaskSignalProc( USIG16_DLL_UNLOAD, hModule );
             PROCESS_CallUserSignalProc( USIG_DLL_UNLOAD_WIN16, hModule );
         }
         else
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index f800cac..6983438 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -613,9 +613,7 @@
         (pModule->flags & NE_FFLAGS_WIN32)) return TRUE; /*not a library*/
 
     /* Call USER signal handler for Win3.1 compatibility. */
-    if (pTask && pTask->userhandler)
-        pTask->userhandler( pModule->self, USIG16_DLL_LOAD, 0, 
-                            pTask->hInstance, pTask->hQueue );
+    TASK_CallTaskSignalProc( USIG16_DLL_LOAD, pModule->self );
 
     if (!pModule->cs) return TRUE;  /* no initialization code */
 
diff --git a/loader/task.c b/loader/task.c
index e3697e7..5ae567c 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -467,10 +467,7 @@
 
     /* Perform USER cleanup */
 
-    if (pTask->userhandler)
-        pTask->userhandler( hTask, USIG16_TERMINATION, 0,
-                            pTask->hInstance, pTask->hQueue );
-
+    TASK_CallTaskSignalProc( USIG16_TERMINATION, hTask );
     PROCESS_CallUserSignalProc( USIG_PROCESS_EXIT, 0 );
     PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0 );     /* FIXME */
     PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0 );
@@ -1447,8 +1444,6 @@
 
 /***********************************************************************
  *           SetTaskSignalProc   (KERNEL.38)
- *
- * Real 16-bit interface is provided by the THUNK_SetTaskSignalProc.
  */
 FARPROC16 WINAPI SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc )
 {
@@ -1457,11 +1452,26 @@
 
     if (!hTask) hTask = GetCurrentTask();
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return NULL;
-    oldProc = (FARPROC16)pTask->userhandler;
-    pTask->userhandler = (USERSIGNALPROC)proc;
+    oldProc = pTask->userhandler;
+    pTask->userhandler = proc;
     return oldProc;
 }
 
+/***********************************************************************
+ *           TASK_CallTaskSignalProc
+ */
+/* ### start build ### */
+extern WORD CALLBACK TASK_CallTo16_word_wwwww(FARPROC16,WORD,WORD,WORD,WORD,WORD);
+/* ### stop build ### */
+void TASK_CallTaskSignalProc( UINT16 uCode, HANDLE16 hTaskOrModule )
+{
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
+    if ( !pTask || !pTask->userhandler ) return;
+
+    TASK_CallTo16_word_wwwww( pTask->userhandler, 
+                              hTaskOrModule, uCode, 0, 
+                              pTask->hInstance, pTask->hQueue );
+}
 
 /***********************************************************************
  *           SetSigHandler   (KERNEL.140)