Made server communication faster by using a shared memory block.
[wine] / scheduler / mutex.c
1 /*
2  * Win32 mutexes
3  *
4  * Copyright 1998 Alexandre Julliard
5  */
6
7 #include <assert.h>
8 #include <string.h>
9 #include "winerror.h"
10 #include "heap.h"
11 #include "server.h"
12
13
14 /***********************************************************************
15  *           CreateMutex32A   (KERNEL32.166)
16  */
17 HANDLE WINAPI CreateMutexA( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCSTR name )
18 {
19     struct create_mutex_request req;
20     struct create_mutex_reply reply;
21
22     if (!name) name = "";
23     req.owned   = owner;
24     req.inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
25     CLIENT_SendRequest( REQ_CREATE_MUTEX, -1, 2, &req, sizeof(req), name, strlen(name)+1 );
26     SetLastError(0);
27     CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
28     if (reply.handle == -1) return 0;
29     return reply.handle;
30 }
31
32
33 /***********************************************************************
34  *           CreateMutex32W   (KERNEL32.167)
35  */
36 HANDLE WINAPI CreateMutexW( SECURITY_ATTRIBUTES *sa, BOOL owner,
37                                 LPCWSTR name )
38 {
39     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
40     HANDLE ret = CreateMutexA( sa, owner, nameA );
41     if (nameA) HeapFree( GetProcessHeap(), 0, nameA );
42     return ret;
43 }
44
45
46 /***********************************************************************
47  *           OpenMutex32A   (KERNEL32.541)
48  */
49 HANDLE WINAPI OpenMutexA( DWORD access, BOOL inherit, LPCSTR name )
50 {
51     struct open_mutex_request req;
52     struct open_mutex_reply reply;
53     int len = name ? strlen(name) + 1 : 0;
54
55     req.access  = access;
56     req.inherit = inherit;
57     CLIENT_SendRequest( REQ_OPEN_MUTEX, -1, 2, &req, sizeof(req), name, len );
58     CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
59     if (reply.handle == -1) return 0; /* must return 0 on failure, not -1 */
60     return reply.handle;
61 }
62
63
64 /***********************************************************************
65  *           OpenMutex32W   (KERNEL32.542)
66  */
67 HANDLE WINAPI OpenMutexW( DWORD access, BOOL inherit, LPCWSTR name )
68 {
69     LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
70     HANDLE ret = OpenMutexA( access, inherit, nameA );
71     if (nameA) HeapFree( GetProcessHeap(), 0, nameA );
72     return ret;
73 }
74
75
76 /***********************************************************************
77  *           ReleaseMutex   (KERNEL32.582)
78  */
79 BOOL WINAPI ReleaseMutex( HANDLE handle )
80 {
81     struct release_mutex_request req;
82
83     req.handle = handle;
84     CLIENT_SendRequest( REQ_RELEASE_MUTEX, -1, 1, &req, sizeof(req) );
85     return !CLIENT_WaitReply( NULL, NULL, 0 );
86 }