64 case MUTEX_THREAD_SHARED:
65 EnterCriticalSection(&m->thr_lock_);
66 return 0;
67
68 case MUTEX_PROCESS_SHARED:
69 switch (WaitForSingleObject (m->proc_lock_, INFINITE))
70 {
71 case WAIT_OBJECT_0: return 0;
72 case WAIT_ABANDONED: return 1;
73 default: return -1;
74 }
75 break;
76
77 default: return -1;
78 }
79 #endif
80 }
81
82 int mutex_timedlock(mutex_t* m,const struct timeva l* val)
83 {
84 //val should be an absolute time.
85 #ifdef _POSIX_THREAD
86 struct timespec ts = {.tv_sec = val->tv_sec,.tv_nsec=val->tv_usec*1000};
87 return pthread_mutex_timedlock(m,&ts);
88 #else
89 switch(m->type_)
90 {
91 // not support CriticalSection,so simply return -1.
92 case MUTEX_THREAD_SHARED:
93 return -1;
94
95 case MUTEX_PROCESS_SHARED:
96 {
97 FILETIME ft;
98 struct timeva l cur,diff;
99
100 GetSystemTimeAsFileTime(&ft);
101 cur = FileTime2Timeva l(&ft);
102 diff = timeva l_sub(val,&cur);
103
104 switch (WaitForSingleObject (m->proc_lock_, timeva l_millsec(&diff)))
105 {
106 case WAIT_OBJECT_0: return 0;
107 case WAIT_ABANDONED: return 1;
108 case WAIT_TIMEOUT: return 2;
109 default: return -1;
110 }
111 }
112 break;
113
114 default: return -1;
115 }
116 #endif
117 }
118
119 int mutex_trylock(mutex_t* m)
120 {
121 #ifdef _POSIX_THREAD
122 return pthread_mutex_trylock(m);
123 #else
124 switch(m->type_)
126 case MUTEX_THREAD_SHARED:
127 if (!TryEnterCriticalSection(&m->thr_lock_))
128 return -1;
129 return 0;
130
131 case MUTEX_PROCESS_SHARED:
132 switch (WaitForSingleObject (m->proc_lock_, 0))
133 {
134 case WAIT_OBJECT_0: return 0;
135 case WAIT_ABANDONED: return 1;
136 case WAIT_TIMEOUT: return 2;
137 default: return -1;
138 }
139 break;
140
141 default: return -1;
142 }
143 #endif
144 }
145
146 int mutex_unlock(mutex_t* m)
147 {
148 #ifdef _POSIX_THREAD
149 return pthread_mutex_unlock(m);
150 #else
151 switch(m->type_)
152 {
153 case MUTEX_THREAD_SHARED:
154 LeaveCriticalSection(&m->thr_lock_);
155 return 0;
156
157 case MUTEX_PROCESS_SHARED:
158 if (!ReleaseMutex(m->proc_lock_))
159 return -1;
160 return 0;
161
162 default: return -1;
163 }
164 #endif
165 }
166www.2cto.com
167 int mutex_destroy(mutex_t* m)
168 {
169 #ifdef _POSIX_THREAD
170 return pthread_mutex_destroy(m);
171 #else
172 switch(m->type_)
173 {
174 case MUTEX_THREAD_SHARED:
175 DeleteCriticalSection(&m->thr_lock_);
176 return 0;
177
178 case MUTEX_PROCESS_SHARED:
179 if (!CloseHandle(m->proc_lock_))
180 return -1;
181 return 0;
182
183 default: return -1;
184 }
185 #endif
186 }
作者:春秋十二月