NCBI C++ ToolKit
win_mutex.c
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
2  * Copyright (C) 2010 Frediano Ziglio
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 
20 #include <config.h>
21 
22 #if HAVE_STDLIB_H
23 #include <stdlib.h>
24 #endif /* HAVE_STDLIB_H */
25 
26 #ifdef _WIN32
27 
28 #if HAVE_STRING_H
29 #include <string.h>
30 #endif /* HAVE_STRING_H */
31 
32 #include <freetds/windows.h>
33 #include <freetds/thread.h>
34 
35 #include "ptw32_MCS_lock.c"
36 
37 void
38 tds_win_mutex_lock(tds_raw_mutex * mutex)
39 {
40  if (!InterlockedExchangeAdd(&mutex->done, 0)) { /* MBR fence */
42 
43  ptw32_mcs_lock_acquire(&mutex->lock, &node);
44  if (!mutex->done) {
45  InitializeCriticalSection(&mutex->crit);
46  mutex->done = 1;
47  }
49  }
50  EnterCriticalSection(&mutex->crit);
51  mutex->thread_id = GetCurrentThreadId();
52 }
53 
54 int
56 {
57  if (!mutex->done && !InterlockedExchangeAdd(&mutex->done, 0)) { /* MBR fence */
59 
60  ptw32_mcs_lock_acquire(&mutex->lock, &node);
61  if (!mutex->done) {
62  InitializeCriticalSection(&mutex->crit);
63  mutex->done = 1;
64  }
66  }
67  if (TryEnterCriticalSection(&mutex->crit)) {
68  DWORD thread_id = GetCurrentThreadId();
69  if (mutex->thread_id == thread_id) {
70  LeaveCriticalSection(&mutex->crit);
71  return -1;
72  }
73  mutex->thread_id = thread_id;
74  return 0;
75  }
76  return -1;
77 }
78 
79 #endif
static int tds_raw_mutex_trylock(tds_raw_mutex *mtx)
Definition: thread.h:237
static void ptw32_mcs_lock_release(ptw32_mcs_local_node_t *node)
static void ptw32_mcs_lock_acquire(ptw32_mcs_lock_t *lock, ptw32_mcs_local_node_t *node)
unsigned int DWORD
Definition: sqltypes.h:98
Modified on Sat Jun 22 10:43:47 2024 by modify_doxy.py rev. 669887