4 * Copyright 1998 Alexandre Julliard
14 #include "server/request.h"
22 static void MUTEX_Destroy( K32OBJ
*obj
);
24 const K32OBJ_OPS MUTEX_Ops
=
26 MUTEX_Destroy
/* destroy */
30 /***********************************************************************
31 * CreateMutex32A (KERNEL32.166)
33 HANDLE32 WINAPI
CreateMutex32A( SECURITY_ATTRIBUTES
*sa
, BOOL32 owner
,
36 struct create_mutex_request req
;
37 struct create_mutex_reply reply
;
38 int len
= name
? strlen(name
) + 1 : 0;
43 req
.inherit
= (sa
&& (sa
->nLength
>=sizeof(*sa
)) && sa
->bInheritHandle
);
45 CLIENT_SendRequest( REQ_CREATE_MUTEX
, -1, 2, &req
, sizeof(req
), name
, len
);
46 CLIENT_WaitReply( &len
, NULL
, 1, &reply
, sizeof(reply
) );
47 CHECK_LEN( len
, sizeof(reply
) );
48 if (reply
.handle
== -1) return 0;
51 mutex
= (MUTEX
*)K32OBJ_Create( K32OBJ_MUTEX
, sizeof(*mutex
),
52 name
, reply
.handle
, MUTEX_ALL_ACCESS
,
54 if (mutex
) K32OBJ_DecCount( &mutex
->header
);
55 if (handle
== INVALID_HANDLE_VALUE32
) handle
= 0;
61 /***********************************************************************
62 * CreateMutex32W (KERNEL32.167)
64 HANDLE32 WINAPI
CreateMutex32W( SECURITY_ATTRIBUTES
*sa
, BOOL32 owner
,
67 LPSTR nameA
= HEAP_strdupWtoA( GetProcessHeap(), 0, name
);
68 HANDLE32 ret
= CreateMutex32A( sa
, owner
, nameA
);
69 if (nameA
) HeapFree( GetProcessHeap(), 0, nameA
);
74 /***********************************************************************
75 * OpenMutex32A (KERNEL32.541)
77 HANDLE32 WINAPI
OpenMutex32A( DWORD access
, BOOL32 inherit
, LPCSTR name
)
81 struct open_named_obj_request req
;
82 struct open_named_obj_reply reply
;
83 int len
= name
? strlen(name
) + 1 : 0;
85 req
.type
= OPEN_MUTEX
;
87 req
.inherit
= inherit
;
88 CLIENT_SendRequest( REQ_OPEN_NAMED_OBJ
, -1, 2, &req
, sizeof(req
), name
, len
);
89 CLIENT_WaitReply( &len
, NULL
, 1, &reply
, sizeof(reply
) );
90 CHECK_LEN( len
, sizeof(reply
) );
91 if (reply
.handle
!= -1)
94 if ((obj
= K32OBJ_FindNameType( name
, K32OBJ_MUTEX
)) != NULL
)
96 handle
= HANDLE_Alloc( PROCESS_Current(), obj
, access
, inherit
, reply
.handle
);
97 K32OBJ_DecCount( obj
);
98 if (handle
== INVALID_HANDLE_VALUE32
)
99 handle
= 0; /* must return 0 on failure, not -1 */
101 else CLIENT_CloseHandle( reply
.handle
);
108 /***********************************************************************
109 * OpenMutex32W (KERNEL32.542)
111 HANDLE32 WINAPI
OpenMutex32W( DWORD access
, BOOL32 inherit
, LPCWSTR name
)
113 LPSTR nameA
= HEAP_strdupWtoA( GetProcessHeap(), 0, name
);
114 HANDLE32 ret
= OpenMutex32A( access
, inherit
, nameA
);
115 if (nameA
) HeapFree( GetProcessHeap(), 0, nameA
);
120 /***********************************************************************
121 * ReleaseMutex (KERNEL32.582)
123 BOOL32 WINAPI
ReleaseMutex( HANDLE32 handle
)
125 struct release_mutex_request req
;
127 req
.handle
= HANDLE_GetServerHandle( PROCESS_Current(), handle
,
128 K32OBJ_MUTEX
, MUTEX_MODIFY_STATE
);
129 if (req
.handle
== -1) return FALSE
;
130 CLIENT_SendRequest( REQ_RELEASE_MUTEX
, -1, 1, &req
, sizeof(req
) );
131 return !CLIENT_WaitReply( NULL
, NULL
, 0 );
135 /***********************************************************************
138 static void MUTEX_Destroy( K32OBJ
*obj
)
140 MUTEX
*mutex
= (MUTEX
*)obj
;
141 assert( obj
->type
== K32OBJ_MUTEX
);
142 obj
->type
= K32OBJ_UNKNOWN
;
143 HeapFree( SystemHeap
, 0, mutex
);