Have threads and processes exit more cleanly whenever possible.

diff --git a/include/server.h b/include/server.h
index ffb014b..f6031d4 100644
--- a/include/server.h
+++ b/include/server.h
@@ -191,6 +191,7 @@
 {
     IN  int          handle;       /* process handle to terminate */
     IN  int          exit_code;    /* process exit code */
+    OUT int          self;         /* suicide? */
 };
 
 
@@ -199,6 +200,8 @@
 {
     IN  int          handle;       /* thread handle to terminate */
     IN  int          exit_code;    /* thread exit code */
+    OUT int          self;         /* suicide? */
+    OUT int          last;         /* last thread in this process? */
 };
 
 
@@ -1202,7 +1205,7 @@
     REQ_NB_REQUESTS
 };
 
-#define SERVER_PROTOCOL_VERSION 3
+#define SERVER_PROTOCOL_VERSION 4
 
 /* ### make_requests end ### */
 /* Everything above this line is generated automatically by tools/make_requests */
@@ -1219,7 +1222,7 @@
 
 extern unsigned int server_call_noerr( enum request req );
 extern unsigned int server_call_fd( enum request req, int fd_out, int *fd_in );
-extern void server_protocol_error( const char *err, ... );
+extern void server_protocol_error( const char *err, ... ) WINE_NORETURN;
 
 /* get a pointer to the request buffer */
 static inline void * WINE_UNUSED get_req_buffer(void)
diff --git a/include/thread.h b/include/thread.h
index 88ffd4b..c59aab4 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -131,6 +131,6 @@
 /* scheduler/sysdeps.c */
 extern int SYSDEPS_SpawnThread( TEB *teb );
 extern void SYSDEPS_SetCurThread( TEB *teb );
-extern void SYSDEPS_ExitThread(void);
+extern void SYSDEPS_ExitThread( int status ) WINE_NORETURN;
 
 #endif  /* __WINE_THREAD_H */
diff --git a/include/winbase.h b/include/winbase.h
index 467fa8a..ad89002 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1223,8 +1223,8 @@
 #define     EnumTimeFormats WINELIB_NAME_AW(EnumTimeFormats)
 BOOL        WINAPI EqualSid(PSID, PSID);
 BOOL        WINAPI EqualPrefixSid(PSID,PSID);
-VOID        WINAPI ExitProcess(DWORD);
-VOID        WINAPI ExitThread(DWORD);
+VOID        WINAPI ExitProcess(DWORD) WINE_NORETURN;
+VOID        WINAPI ExitThread(DWORD) WINE_NORETURN;
 DWORD       WINAPI ExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD);
 DWORD       WINAPI ExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD);
 #define     ExpandEnvironmentStrings WINELIB_NAME_AW(ExpandEnvironmentStrings)
diff --git a/include/windef.h b/include/windef.h
index 6a5c9db..f6a69b4 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -353,11 +353,13 @@
 /* Macro for structure packing. */
 
 #ifdef __GNUC__
-#define WINE_PACKED __attribute__ ((packed))
-#define WINE_UNUSED __attribute__ ((unused))
+#define WINE_PACKED   __attribute__((packed))
+#define WINE_UNUSED   __attribute__((unused))
+#define WINE_NORETURN __attribute__((noreturn))
 #else
-#define WINE_PACKED  /* nothing */
-#define WINE_UNUSED  /* nothing */
+#define WINE_PACKED    /* nothing */
+#define WINE_UNUSED    /* nothing */
+#define WINE_NORETURN  /* nothing */
 #endif
 
 /* Macros to split words and longs. */