Generate CREATE_PROCESS/THREAD debug events internally in the server.

diff --git a/scheduler/client.c b/scheduler/client.c
index bd097f8..27d4d1b 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -453,6 +453,7 @@
  */
 int CLIENT_InitThread(void)
 {
+    struct get_thread_buffer_request *first_req;
     struct init_thread_request *req;
     TEB *teb = NtCurrentTeb();
     int fd;
@@ -463,16 +464,17 @@
     teb->buffer = mmap( 0, teb->buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
     close( fd );
     if (teb->buffer == (void*)-1) server_perror( "mmap" );
+    first_req = teb->buffer;
+    teb->process->server_pid = first_req->pid;
+    teb->tid = first_req->tid;
+    if (first_req->boot) boot_thread_id = teb->tid;
+    else if (boot_thread_id == teb->tid) boot_thread_id = 0;
 
-    req = get_req_buffer();
+    req = teb->buffer;
     req->unix_pid = getpid();
     req->teb      = teb;
-    if (server_call( REQ_INIT_THREAD )) return -1;
-    teb->process->server_pid = req->pid;
-    teb->tid = req->tid;
-    if (req->boot) boot_thread_id = req->tid;
-    else if (boot_thread_id == req->tid) boot_thread_id = 0;
-    return 0;
+    req->entry    = teb->entry_point;
+    return server_call_noerr( REQ_INIT_THREAD );
 }
 
 /***********************************************************************
diff --git a/scheduler/debugger.c b/scheduler/debugger.c
index 8a09485..f8357d1 100644
--- a/scheduler/debugger.c
+++ b/scheduler/debugger.c
@@ -6,8 +6,8 @@
 
 #include <string.h>
 
+#include "winerror.h"
 #include "process.h"
-#include "thread.h"
 #include "server.h"
 #include "debugtools.h"
 
@@ -22,7 +22,6 @@
 DWORD DEBUG_SendExceptionEvent( EXCEPTION_RECORD *rec, BOOL first_chance, CONTEXT *context )
 {
     int i;
-    DWORD ret = 0;
     struct send_debug_event_request *req = get_req_buffer();
 
     req->event.code = EXCEPTION_DEBUG_EVENT;
@@ -35,58 +34,9 @@
     req->event.info.exception.context      = *context;
     for (i = 0; i < req->event.info.exception.nb_params; i++)
         req->event.info.exception.params[i] = rec->ExceptionInformation[i];
-    if (!server_call( REQ_SEND_DEBUG_EVENT ))
-    {
-        ret = req->status;
+    if (!server_call_noerr( REQ_SEND_DEBUG_EVENT ))
         *context = req->event.info.exception.context;
-    }
-    return ret;
-}
-
-
-/**********************************************************************
- *           DEBUG_SendCreateProcessEvent
- *
- * Send an CREATE_PROCESS_DEBUG_EVENT event to the current process debugger.
- * Must be called from the context of the new process.
- */
-DWORD DEBUG_SendCreateProcessEvent( HFILE file, HMODULE module, void *entry )
-{
-    DWORD ret = 0;
-    struct send_debug_event_request *req = get_req_buffer();
-
-    req->event.code = CREATE_PROCESS_DEBUG_EVENT;
-    req->event.info.create_process.file       = file;
-    req->event.info.create_process.process    = 0; /* will be filled by server */
-    req->event.info.create_process.thread     = 0; /* will be filled by server */
-    req->event.info.create_process.base       = (void *)module;
-    req->event.info.create_process.dbg_offset = 0; /* FIXME */
-    req->event.info.create_process.dbg_size   = 0; /* FIXME */
-    req->event.info.create_process.teb        = NtCurrentTeb();
-    req->event.info.create_process.start      = entry;
-    req->event.info.create_process.name       = 0; /* FIXME */
-    req->event.info.create_process.unicode    = 0; /* FIXME */
-    if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
-    return ret;
-}
-
-/**********************************************************************
- *           DEBUG_SendCreateThreadEvent
- *
- * Send an CREATE_THREAD_DEBUG_EVENT event to the current process debugger.
- * Must be called from the context of the new thread.
- */
-DWORD DEBUG_SendCreateThreadEvent( void *entry )
-{
-    DWORD ret = 0;
-    struct send_debug_event_request *req = get_req_buffer();
-
-    req->event.code = CREATE_THREAD_DEBUG_EVENT;
-    req->event.info.create_thread.handle = 0; /* will be filled by server */
-    req->event.info.create_thread.teb    = NtCurrentTeb();
-    req->event.info.create_thread.start  = entry;
-    if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
-    return ret;
+    return req->status;
 }
 
 
@@ -97,7 +47,6 @@
  */
 DWORD DEBUG_SendLoadDLLEvent( HFILE file, HMODULE module, LPSTR *name )
 {
-    DWORD ret = 0;
     struct send_debug_event_request *req = get_req_buffer();
 
     req->event.code = LOAD_DLL_DEBUG_EVENT;
@@ -107,8 +56,8 @@
     req->event.info.load_dll.dbg_size   = 0;  /* FIXME */
     req->event.info.load_dll.name       = name;
     req->event.info.load_dll.unicode    = 0;
-    if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
-    return ret;
+    server_call_noerr( REQ_SEND_DEBUG_EVENT );
+    return req->status;
 }
 
 
@@ -119,13 +68,12 @@
  */
 DWORD DEBUG_SendUnloadDLLEvent( HMODULE module )
 {
-    DWORD ret = 0;
     struct send_debug_event_request *req = get_req_buffer();
 
     req->event.code = UNLOAD_DLL_DEBUG_EVENT;
     req->event.info.unload_dll.base = (void *)module;
-    if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
-    return ret;
+    server_call_noerr( REQ_SEND_DEBUG_EVENT );
+    return req->status;
 }
 
 
@@ -155,6 +103,9 @@
     event->dwThreadId       = (DWORD)req->tid;
     switch(req->event.code)
     {
+    case 0:  /* timeout */
+        SetLastError( ERROR_SEM_TIMEOUT );
+        return FALSE;
     case EXCEPTION_DEBUG_EVENT:
         event->u.Exception.ExceptionRecord.ExceptionCode    = req->event.info.exception.code;
         event->u.Exception.ExceptionRecord.ExceptionFlags   = req->event.info.exception.flags;
diff --git a/scheduler/process.c b/scheduler/process.c
index 56167a6..a1b68f7 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -26,7 +26,6 @@
 #include "server.h"
 #include "options.h"
 #include "callback.h"
-#include "debugger.h"
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(process)
@@ -371,6 +370,7 @@
  */
 void PROCESS_Start(void)
 {
+    struct init_process_done_request *req = get_req_buffer();
     UINT cmdShow = SW_SHOWNORMAL;
     LPTHREAD_START_ROUTINE entry = NULL;
     PDB *pdb = PROCESS_Current();
@@ -452,16 +452,15 @@
     PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 );
 
     /* Signal the parent process to continue */
+    req->module = (void *)pModule->module32;
+    req->entry  = entry;
     server_call( REQ_INIT_PROCESS_DONE );
 
     /* Send all required start-up debugger events */
     if ( type == PROC_WIN32 && (pdb->flags & PDB32_DEBUGGED) )
     {
         EnterCriticalSection( &pdb->crit_section );
-
-        DEBUG_SendCreateProcessEvent( -1 /*FIXME*/, pModule->module32, entry );
         MODULE_SendLoadDLLEvents();
-
         LeaveCriticalSection( &pdb->crit_section );
     }
 
@@ -479,10 +478,6 @@
         LeaveCriticalSection( &pdb->crit_section );
     }
 
-    /* If requested, add entry point breakpoint */
-    if ( Options.debug || (pdb->flags & PDB32_DEBUGGED) )
-        DEBUG_AddTaskEntryBreakpoint( pdb->task );
-
     /* Call UserSignalProc ( USIG_PROCESS_RUNNING ... ) only for non-GUI win32 apps */
     if ( type != PROC_WIN16 && (pdb->flags & PDB32_CONSOLE_PROC))
         PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 17310be..9082cb8 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -276,9 +276,6 @@
     PROCESS_CallUserSignalProc( USIG_THREAD_INIT, (DWORD)NtCurrentTeb()->tid, 0 );
     PE_InitTls();
     MODULE_DllThreadAttach( NULL );
-
-    if (NtCurrentTeb()->process->flags & PDB32_DEBUGGED) DEBUG_SendCreateThreadEvent( func );
-
     ExitThread( func( NtCurrentTeb()->entry_arg ) );
 }