Release 980712

Sun Jul 12 16:23:36 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [server/*] [scheduler/client.c] (new files)
	  [scheduler/sysdeps.c] [scheduler/thread.c] [scheduler/process.c]
	Beginnings of client/server communication for inter-process
	synchronisation.

Sat Jul 11 19:45:45 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [include/bitmap.h] [objects/bitmap.c] [objects/dib.c] 
	  [objects/oembitmap.c]
	Speed up DIB section handling by using pre-allocated colormap and 
	XImage. Moved DIB section data out of general BITMAPOBJ structure.
	Bugfix: GetDIBits32 would overwrite one byte beyond bitmap data.

	* [if1632/shell.spec] [if1632/kernel.spec] [win32/kernel32.c]
	More verbose error message if ThunkConnect fails.
	Implemented KERNEL_475.

	* [files/profile.c] [ole/ole2nls.c]
	Minor bugfixes.

	* [if1632/builtin.c] [if1632/kernel.spec] [include/task.h]
	  [loader/ne/module.c] [loader/task.c]
	Implemented KERNEL.THHOOK.

	* [if1632/wprocs.spec] [include/process.h] [msdos/dpmi.c] [msdos/vxd.c]
	Implemented Win32s VxD services (W32S.386).

Sat Jul 11 17:52:23 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [graphics/x11drv/xfont.c] [graphics/x11drv/text.c] 
	  [include/x11font.h]
	Improve handling of rotated X11 fonts. Metrics/extents should now be
	correct. ExtTextOut should behave better (still doesn't handle lpDx).

	* [graphics/painting.c]
	DrawFocusRect32: Don't do anything if width or height are zero.

Sat Jul 11 15:21:35 1998  Andreas Mohr <100.30936@germany.net>

	* [files/profile.c] [include/windows.h]
	The length arguments of *Profile*() need to be treated
	as UINTxx instead of INTxx.

	* [graphics/env.c] [graphics/win16drv/init.c] [include/print.h]
	  [misc/printdrv.c]
	Many printer driver fixes/changes (many thanks go to Huw !).
	Most printers should work again ;)

	* [memory/atom.c]
	Fixed ATOM_AddAtom to store atoms exactly like Windows.

	* [*/*]
	Fixed misc compiler warnings.

Fri Jul 10 15:58:36 1998  Marcus Meissner <marcus@jet.franken.de>

	* [files/drive.c]
	Fixed GetDriveType16 to return DRIVE_REMOTE again.

	* [loader/pe_image.c][loader/module.c]
	Look for modules that have the same modulename or the same
	filename (they sometimes differ).
	Fixed up fixup_imports, removed one of the loops.

	* [windows/winpos.c]
	Added some NULL ptr checks. Needs more.

	* [graphics/ddraw.c]
	Some stubs added.

	* [if1632/snoop.c]
	Updated, made WINELIB compatible.

Fri Jul 10 04:39:56 1998  Douglas Ridgway  <ridgway@winehq.com>

	* [objects/enhmetafile.c] [relay32/gdi32.spec]
	Small tweaks for documentation system.

Thu Jul  9 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [controls/commctrl.c][include/commctrl.h][relay32/comctl32.spec]
	Fixed GetEffectiveClientRect, CreateToolbarEx and CreateMappedBitmap.
	Added stub for ShowHideMenuCtl. Added some documentation.

	* [documentation/common_controls]
	Added and updated some information.

	* [controls/toolbar.c][include/toolbar.h]
	Added string support.

	* [misc/shell.c][misc/shellord.c][relay32/shell.spec]
	Changed names of undocumented functions to their real names and
	fixed the export table.

	* [controls/imagelist.c][relay32/comctl32.spec]
	Added stub for ImageList_SetFilter.
	Fixed some minor bugs and typos.

	* [objects/font.c][include/windows.h][relay32/gdi32.spec]
	Added stubs for GetCharacterPlacement32[A/W].

	* [objects/region.c][relay32/gdi32.spec]
	Added stub for UNDOCUMENTED GetRandomRgn.

	* [controls/commctrl.c][controls/*.c][include/*.h]
	Added dummy listview, pager, rebar, tooltips, trackbar and
	treeview control. This keeps some programs from complaining.

Thu Jul  9 11:23:58 1998  Rein Klazes <rklazes@casema.net>

	* [graphics/painting.c] [graphics/*/init.c]
	  [graphics/x11drv/graphics.c] [relay32/gdi32.spec]
	  [if1632/gdi.spec] [include/gdi.h] [include/x11drv.h]
	Implemented drawing bezier curves: PolyBezier16/32 and
	PolyBezierTo16/32.

	* [graphics/x11drv/graphics.c]
	Improved accuracy of several graphic routines, especially the
	drawing of pie's.

	* [include/windows.h] [misc/spy.c]
	Added 25 window messages related to programs based on MFC and/or OLE.

Wed Jul  8 22:00:00 1998  James Juran  <jrj120@psu.edu>

	* [documentation/wine.man]
	Updated manpage.

	* [wine.ini]
	Added section for Win95Look=true (commented out by default).

Wed Jul  8 06:23:19 1998  Matthew Becker <mbecker@glasscity.net>

	* [misc/registry.c]
	Fixed a crash in RegEnumValue32A when the dwType parameter is
	NULL.

	* [programs/regtest/regtest.c]
	Improved the printing of errors.

	* [misc/ntdll.c]
	Added stub for RtlFormatCurrentUserKeyPath.

	* [win32/console.c]
	Added stub for ScrollConsoleScreenBuffer.

Mon Jul  6 16:41:47 1998  Per Lindström <pelinstr@algonet.se>

	* [include/windows.h] [relay32/kernel.spec] [win32/newfns.c]
	Added stubs for SleepEx and TerminateProcess.

	* [rc/README]
	Corrected a grammatical error.

Mon Jul  3 12:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [misc/shellord.c]
	Put some TRACE in.

	* [memory/string.c]
	Deleted unused variable in lstrcmpi32A.

	* [include/windows.h][memory/string.c]
	Added functions WideCharToLocal32 LocalToWideChar32 for
	OLE-strings

	* [include/shlobj.h][include/winerror.h][misc/shell.c]
	  [ole/folders.c]
	Added definition of internal class pidlmgr.
	Changed definitions of EnumIDList, IShellFolder.
	Added some OLE error constants.
	Implemented EnumIDList, IShellFolder, IClassFactory,
	PidlMgr, SHELL32_DllGetClassObject, SHGetDesktopFolder,
	SHGetSpecialFolderLocation (half), SHGetPathFromIDList
	(!!This stuff is not finished yet!!)

	* [include/windows.h][misc/network][reley32/mpr.spec]
	Added stubs for WNetConnectionDialog32[A|W|API].
	Added struct LPCONNECTDLGSTRUCT32[A|W] and some constants.
	Added some SetLastError(WN_NO_NETWORK) to the stubs.
	Fixed bufferhandling in WNetCancelConnection
	Added stub for MultinetGetErrorText[A|W]

	* [ole/ole2nls.c]
	Rewrote GetTimeFormat32A.

Fri Jul  3 10:27:30 1998  Michael Poole <poole+@andrew.cmu.edu>

	* [graphics/ddraw.c] [tsx11/X11_calls]
	Implement IDirectDrawPalette_GetEntries.
	Use CopyColormapAndFree to avoid erasing previously-set
	palette entries.

	* [graphics/ddraw.c] [include/ddraw.h]
	  [tools/make_X11wrappers] [tsx11/X11_calls]
	Provide a preliminary, not-yet-working framework for doing
	DirectDraw via Xlib or XShm as well as DGA.

Tue Jun 30 00:16:09 1998  Marcel Baur <mbaur@g26.ethz.ch>

	* [ole/nls/*.nls]
	Added remaining 22 locales (including arabic locales).
diff --git a/server/thread.c b/server/thread.c
new file mode 100644
index 0000000..d1ce30b
--- /dev/null
+++ b/server/thread.c
@@ -0,0 +1,204 @@
+/*
+ * Server-side thread management
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "winerror.h"
+#include "server.h"
+#include "object.h"
+
+
+/* request handling */
+
+static void handle_timeout( void *data, int len, int fd,
+                            struct thread *self );
+static void handle_kill_thread( void *data, int len, int fd,
+                                struct thread *self );
+static void handle_new_thread( void *data, int len, int fd,
+                               struct thread *self );
+static void handle_init_thread( void *data, int len, int fd,
+                                struct thread *self );
+
+const req_handler req_handlers[REQ_NB_REQUESTS] =
+{
+    handle_timeout,        /* REQ_TIMEOUT */
+    handle_kill_thread,    /* REQ_KILL_THREAD */
+    handle_new_thread,     /* REQ_NEW_THREAD */
+    handle_init_thread     /* REQ_INIT_THREAD */
+};
+
+
+/* thread structure; not much for now... */
+
+struct thread
+{
+    struct object   obj;       /* object header */
+    struct thread  *next;      /* system-wide thread list */
+    struct thread  *prev;
+    struct process *process;
+    int             client_fd; /* client fd for socket communications */
+    int             unix_pid;
+    char           *name;
+};
+
+static struct thread *first_thread;
+
+/* thread operations */
+
+static void destroy_thread( struct object *obj );
+
+static const struct object_ops thread_ops =
+{
+    destroy_thread
+};
+
+
+/* create a new thread */
+static struct thread *create_thread( int fd, void *pid )
+{
+    struct thread *thread;
+    struct process *process;
+
+    if (pid)
+    {
+        if (!(process = get_process_from_id( pid ))) return NULL;
+    }
+    else
+    {
+        if (!(process = create_process())) return NULL;
+    }
+    if (!(thread = malloc( sizeof(*thread) )))
+    {
+        release_object( process );
+        return NULL;
+    }
+    init_object( &thread->obj, &thread_ops, NULL );
+    thread->client_fd = fd;
+    thread->process   = process;
+    thread->unix_pid  = 0;  /* not known yet */
+    thread->name      = NULL;
+
+    thread->next = first_thread;
+    thread->prev = NULL;
+    first_thread = thread;
+
+    if (add_client( fd, thread ) == -1)
+    {
+        release_object( thread );
+        return NULL;
+    }
+    return thread;
+}
+
+/* destroy a thread when its refcount is 0 */
+static void destroy_thread( struct object *obj )
+{
+    struct thread *thread = (struct thread *)obj;
+    assert( obj->ops == &thread_ops );
+
+    release_object( thread->process );
+    if (thread->next) thread->next->prev = thread->prev;
+    if (thread->prev) thread->prev->next = thread->next;
+    else first_thread = thread->next;
+    if (thread->name) free( thread->name );
+    free( thread );
+}
+
+struct thread *get_thread_from_id( void *id )
+{
+    struct thread *t = first_thread;
+    while (t && (t != id)) t = t->next;
+    return t;
+}
+
+/* handle a client timeout (unused for now) */
+static void handle_timeout( void *data, int len, int fd, struct thread *self )
+{
+/*    fprintf( stderr, "Server: got timeout for %s\n", self->name );*/
+    send_reply( self->client_fd, 0, -1, 0 );
+}
+
+/* a thread has been killed */
+static void handle_kill_thread( void *data, int len, int fd,
+                                struct thread *self )
+{
+    if (!self) return;  /* initial client being killed */
+/*    fprintf( stderr, "Server: thread '%s' killed\n",
+               self->name ? self->name : "???" );
+*/
+    release_object( &self->obj );
+}
+
+/* create a new thread */
+static void handle_new_thread( void *data, int len, int fd,
+                               struct thread *self )
+{
+    struct new_thread_request *req = (struct new_thread_request *)data;
+    struct new_thread_reply reply;
+    struct thread *new_thread;
+    int new_fd, err;
+
+    if ((new_fd = dup(fd)) == -1)
+    {
+        new_thread = NULL;
+        err = ERROR_TOO_MANY_OPEN_FILES;
+        goto done;
+    }
+    if (len != sizeof(*req))
+    {
+        err = ERROR_INVALID_PARAMETER;
+        goto done;
+    }
+    if (!(new_thread = create_thread( new_fd, req->pid )))
+    {
+        err = ERROR_NOT_ENOUGH_MEMORY;
+        close( new_fd );
+        goto done;
+    }
+    reply.tid = new_thread;
+    reply.pid = new_thread->process;
+    err = ERROR_SUCCESS;
+ done:
+    send_reply( self ? self->client_fd : get_initial_client_fd(),
+                err, -1, 1, &reply, sizeof(reply) );
+}
+
+/* create a new thread */
+static void handle_init_thread( void *data, int len, int fd,
+                                struct thread *self )
+{
+    struct init_thread_request *req = (struct init_thread_request *)data;
+    int err;
+
+    if (len < sizeof(*req))
+    {
+        err = ERROR_INVALID_PARAMETER;
+        goto done;
+    }
+    len -= sizeof(*req);
+    self->unix_pid = req->pid;
+    if (!(self->name = malloc( len + 1 )))
+    {
+        err = ERROR_NOT_ENOUGH_MEMORY;
+        goto done;
+    }
+    memcpy( self->name, (char *)data + sizeof(*req), len );
+    self->name[len] = '\0';
+    
+/*    fprintf( stderr,
+             "Server: init thread '%s' pid=%08x tid=%08x unix_pid=%d\n",
+             self->name, (int)self->process, (int)self, self->unix_pid );
+*/
+
+    err = ERROR_SUCCESS;
+ done:
+    send_reply( self->client_fd, err, -1, 0 );
+}