ChangeLog
上传用户:zhenyu
上传日期:2022-04-24
资源大小:268k
文件大小:181k
源码类别:

视频捕捉/采集

开发平台:

Visual C++

  1. 2006-12-20  Ross Johnson <ross.johnson@homemail.com.au>
  2.         * sem_destroy.c: Fix the race involving invalidation of the sema;
  3.         fix incorrect return of EBUSY resulting from the mutex trylock
  4.         on the private mutex guard.
  5.         * sem_wait.c: Add check for invalid sem_t after acquiring the
  6.         sem_t state guard mutex and before affecting changes to sema state.
  7.         * sem_trywait.c: Likewise.
  8.         * sem_timedwait.c: Likewise.
  9.         * sem_getvalue.c: Likewise.
  10.         * sem_post.c: Similar.
  11.         * sem_post_multiple.c: Likewise.
  12.         * sem_init.c: Set max Win32 semaphore count to SEM_VALUE_MAX (was
  13.         _POSIX_SEM_VALUE_MAX, which is a lower value - the minimum).
  14. * pthread_win32_attach_detach_np.c (pthread_win32_process_attach_np): Load COREDLL.DLL under WINCE to check existence of InterlockedCompareExchange() routine. This used to be done to test for TryEnterCriticalSection() but was removed when this was no longer needed.
  15. 2006-01-25  Prashant Thakre <prashant.thakre at gmail.com>
  16. * pthread_cancel.c: Added _M_IA64 register context support.
  17. 2005-05-13  Ross Johnson  <ross at callisto.canberra.edu.au>
  18. * pthread_kill.c (pthread_kill): Remove check for Win32 thread
  19. priority (to confirm HANDLE validity). Useless since thread HANDLEs
  20. a not recycle-unique.
  21. 2005-05-30  Vladimir Kliatchko  <vladimir at kliatchko.com>
  22. * pthread_once.c: Re-implement using an MCS queue-based lock. The form
  23. of pthread_once is as proposed by Alexander Terekhov (see entry of
  24. 2005-03-13). The MCS lock implementation does not require a unique
  25. 'name' to identify the lock between threads. Attempts to get the Event
  26. or Semaphore based versions of pthread_once to a satisfactory level
  27. of robustness have thus far failed. The last problem (avoiding races
  28. involving non recycle-unique Win32 HANDLEs) was giving everyone
  29. grey hair trying to solve it.
  30. * ptw32_MCS_lock.c: New MCS queue-based lock implementation. These
  31. locks are efficient: they have very low overhead in the uncontended case;
  32. are efficient in contention and minimise cache-coherence updates in
  33. managing the user level FIFO queue; do not require an ABI change in the
  34. library.
  35. 2005-05-27  Alexander Gottwald <alexander.gottwald at s1999.tu-chemnitz.de>
  36. * pthread.h: Some things, like HANDLE, were only defined if
  37. PTW32_LEVEL was >= 3. They should always be defined.
  38. 2005-05-25  Vladimir Kliatchko  <vladimir at kliatchko.com>
  39. * pthread_once.c: Eliminate all priority operations and other
  40. complexity by replacing the event with a semaphore. The advantage
  41. of the change is the ability to release just one waiter if the
  42. init_routine thread is cancelled yet still release all waiters when
  43. done. Simplify once_control state checks to improve efficiency
  44. further.
  45. 2005-05-24  Mikael Magnusson  <mikaelmagnusson at glocalnet.net>
  46. * GNUmakefile: Patched to allow cross-compile with mingw32 on Linux.
  47. It uses macros instead of referencing dlltool, gcc and g++ directly;
  48. added a call to ranlib. For example the GC static library can be
  49. built with:
  50. make CC=i586-mingw32msvc-gcc RC=i586-mingw32msvc-windres 
  51. RANLIB=i586-mingw32msvc-ranlib clean GC-static
  52. 2005-05-13  Ross Johnson  <ross at callisto.canberra.edu.au>
  53. * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np):
  54. Move on-exit-only stuff from ptw32_threadDestroy() to here.
  55. * ptw32_threadDestroy.c: It's purpose is now only to reclaim thread
  56. resources for detached threads, or via pthread_join() or
  57. pthread_detach() on joinable threads.
  58. * ptw32_threadStart.c: Calling user destruct routines has moved to
  59. pthread_win32_thread_detach_np(); call pthread_win32_thread_detach_np()
  60. directly if statically linking, otherwise do so via dllMain; store
  61. thread return value in thread struct for all cases, including
  62. cancellation and exception exits; thread abnormal exits go via
  63. pthread_win32_thread_detach_np.
  64. * pthread_join.c (pthread_join): Don't try to get return code from
  65. Win32 thread - always get it from he thread struct.
  66. * pthread_detach.c (pthread_detach): reduce extent of the thread
  67. existence check since we now don't care if the Win32 thread HANDLE has
  68. been closed; reclaim thread resources if the thread has exited already.
  69. * ptw32_throw.c (ptw32_throw): For Win32 threads that are not implicit,
  70. only Call thread cleanup if statically linking, otherwise leave it to
  71. dllMain.
  72. * sem_post.c (_POSIX_SEM_VALUE_MAX): Change to SEM_VALUE_MAX.
  73. * sem_post_multiple.c: Likewise.
  74. * sem_init.c: Likewise.
  75. 2005-05-10  Ross Johnson  <ross at callisto.canberra.edu.au>
  76. * pthread_join.c (pthread_join): Add missing check for thread ID
  77. reference count in thread existence test; reduce extent of the
  78. existence test since we don't care if the Win32 thread HANDLE has
  79. been closed.
  80. 2005-05-09  Ross Johnson  <ross at callisto.canberra.edu.au>
  81. * ptw32_callUserDestroyRoutines.c: Run destructor process (i.e.
  82. loop over all keys calling destructors) up to
  83. PTHREAD_DESTRUCTOR_ITERATIONS times if TSD value isn't NULL yet;
  84. modify assoc management.
  85. * pthread_key_delete.c: Modify assoc management.
  86. * ptw32_tkAssocDestroy.c: Fix error in assoc removal from chains.
  87. * pthread.h
  88. (_POSIX_THREAD_DESTRUCTOR_ITERATIONS): Define to value specified by
  89. POSIX.
  90. (_POSIX_THREAD_KEYS_MAX): Define to value specified by POSIX.
  91. (PTHREAD_KEYS_MAX): Redefine [upward] to minimum required by POSIX.
  92. (SEM_NSEMS_MAX): Define to implementation value.
  93. (SEM_VALUE_MAX): Define to implementation value.
  94. (_POSIX_SEM_NSEMS_MAX): Redefine to value specified by POSIX.
  95. (_POSIX_SEM_VALUE_MAX): Redefine to value specified by POSIX.
  96. 2005-05-06  Ross Johnson  <ross at callisto.canberra.edu.au>
  97. * signal.c (sigwait): Add a cancellation point to this otherwise
  98. no-op.
  99. * sem_init.c (sem_init): Check for and return ERANGE error.
  100. * sem_post.c (sem_post): Likewise.
  101. * sem_post_multiple.c (sem_post_multiple): Likewise.
  102. * manual (directory): Added; see ChangeLog inside.
  103. 2005-05-02  Ross Johnson  <ross at callisto.canberra.edu.au>
  104. * implement.h (struct pthread_key_t_): Change threadsLock to keyLock
  105. so as not to be confused with the per thread lock 'threadlock';
  106. change all references to it.
  107. * implement.h (struct ThreadKeyAssoc): Remove lock; add prevKey
  108. and prevThread pointers; re-implemented all routines that use this
  109. struct. The effect of this is to save one handle per association,
  110. which could potentially equal the number of keys multiplied by the
  111. number of threads, accumulating over time - and to free the
  112. association memory as soon as it is no longer referenced by either
  113. the key or the thread. Previously, the handle and memory were
  114. released only after BOTH key and thread no longer referenced the
  115. association. That is, often no association resources were released
  116. until the process itself exited. In addition, at least one race
  117. condition has been removed - where two threads could attempt to
  118. release the association resources simultaneously - one via
  119. ptw32_callUserDestroyRoutines and the other via
  120. pthread_key_delete.
  121. - thanks to Richard Hughes at Aculab for discovering the problem.
  122. * pthread_key_create.c: See above.
  123. * pthread_key_delete.c: See above.
  124. * pthread_setspecific.c: See above.
  125. * ptw32_callUserDestroyRoutines.c: See above.
  126. * ptw32_tkAssocCreate.c: See above.
  127. * ptw32_tkAssocDestroy.c: See above.
  128. 2005-04-27  Ross Johnson  <ross at callisto.canberra.edu.au>
  129. * sem_wait.c (ptw32_sem_wait_cleanup): after cancellation re-attempt
  130. to acquire the semaphore to avoid a race with a late sem_post.
  131. * sem_timedwait.c: Modify comments.
  132. 2005-04-25  Ross Johnson  <ross at callisto.canberra.edu.au>
  133. * ptw32_relmillisecs.c: New module; converts future abstime to 
  134. milliseconds relative to 'now'.
  135. * pthread_mutex_timedlock.c: Use new ptw32_relmillisecs routine in
  136. place of internal code; remove the NEED_SEM code - this routine is now
  137. implemented for builds that define NEED_SEM (WinCE etc)
  138. * sem_timedwait.c: Likewise; after timeout or cancellation,
  139. re-attempt to acquire the semaphore in case one has been posted since
  140. the timeout/cancel occurred. Thanks to Stefan Mueller.
  141. * Makefile: Add ptw32_relmillisecs.c module; remove
  142. ptw32_{in,de}crease_semaphore.c modules.
  143. * GNUmakefile: Likewise.
  144. * Bmakefile: Likewise.
  145. * sem_init.c: Re-write the NEED_SEM code to be consistent with the
  146. non-NEED_SEM code, but retaining use of an event in place of the w32 sema
  147. for w32 systems that don't include semaphores (WinCE);
  148. the NEED_SEM versions of semaphores has been broken for a long time but is
  149. now fixed and supports all of the same routines as the non-NEED_SEM case.
  150. * sem_destroy.c: Likewise.
  151. * sem_wait.c: Likewise.
  152. * sem_post.c: Likewise.
  153. * sem_post_multple.c: Likewise.
  154. * implement.h: Likewise.
  155. * sem_timedwait.c: Likewise; this routine is now
  156. implemented for builds that define NEED_SEM (WinCE etc).
  157. * sem_trywait.c: Likewise.
  158. * sem_getvalue.c: Likewise.
  159. * pthread_once.c: Yet more changes, reverting closer to Gottlob Frege's
  160. first design, but retaining cancellation, priority boosting, and adding
  161. preservation of W32 error codes to make pthread_once transparent to
  162. GetLastError.
  163. 2005-04-11  Ross Johnson  <ross at callisto.canberra.edu.au>
  164. * pthread_once.c (pthread_once): Added priority boosting to
  165. solve starvation problem after once_routine cancellation.
  166. See notes in file.
  167. 2005-04-06  Kevin Lussier <Kevin at codegreennetworks.com>
  168. * Makefile: Added debug targets for all versions of the library.
  169. 2005-04-01  Ross Johnson  <ross at callisto.canberra.edu.au>
  170. * GNUmakefile: Add target to build libpthreadGC1.a as a static link
  171. library.
  172. * Makefile: Likewise for pthreadGC1.lib.
  173. 2005-04-01  Kevin Lussier <Kevin at codegreennetworks.com>
  174. * sem_timedwait.c (sem_timedwait): Increase size of temp variables to
  175. avoid int overflows for large timeout values.
  176. * implement.h (int64_t): Include or define.
  177. 2005-03-31   Dimitar Panayotov <develop at mail.bg>^M
  178. * pthread.h: Fix conditional defines for static linking.
  179. * sched.h: Liekwise.
  180. * semaphore.h: Likewise.
  181. * dll.c (PTW32_STATIC_LIB): Module is conditionally included
  182. in the build.
  183. 2005-03-16  Ross Johnson  <ross at callisto.canberra.edu.au>^M
  184. * pthread_setcancelstate.c: Undo the last change.
  185. 2005-03-16  Ross Johnson  <ross at callisto.canberra.edu.au>^M
  186. * pthread_setcancelstate.c: Don't check for an async cancel event
  187. if the library is using alertable async cancel..
  188. 2005-03-14  Ross Johnson  <ross at callisto.canberra.edu.au>
  189. * pthread_once.c (pthread_once): Downgrade interlocked operations to simple
  190. memory operations where these are protected by the critical section; edit
  191. comments.
  192. 2005-03-13  Ross Johnson  <rpj at callisto.canberra.edu.au>
  193. * pthread_once.c (pthread_once): Completely redesigned; a change was
  194. required to the ABI (pthread_once_t_), and resulting in a version
  195. compatibility index increment.
  196. NOTES:
  197. The design (based on pseudo code contributed by Gottlob Frege) avoids
  198. creating a kernel object if there is no contention. See URL for details:-
  199. http://sources.redhat.com/ml/pthreads-win32/2005/msg00029.html
  200. This uses late initialisation similar to the technique already used for
  201. pthreads-win32 mutexes and semaphores (from Alexander Terekhov).
  202. The subsequent cancelation cleanup additions (by rpj) could not be implemented
  203. without sacrificing some of the efficiency in Gottlob's design. In particular,
  204. although each once_control uses it's own event to block on, a global CS is
  205. required to manage it - since the event must be either re-usable or
  206. re-creatable under cancelation. This is not needed in the non-cancelable
  207. design because it is able to mark the event as closed (forever).
  208. When uncontested, a CS operation is equivalent to an Interlocked operation
  209. in speed. So, in the final design with cancelability, an uncontested
  210. once_control operation involves a minimum of five interlocked operations
  211. (including the LeaveCS operation).
  212. ALTERNATIVES:
  213. An alternative design from Alexander Terekhov proposed using a named mutex,
  214. as sketched below:-
  215.   if (!once_control) { // May be in TLS
  216.     named_mutex::guard guard(&once_control2);
  217.       if (!once_control2) {
  218.          <init>
  219.          once_control2 = true;
  220.       }
  221.     once_control = true;
  222.   }
  223. A more detailed description of this can be found here:-
  224. http://groups.yahoo.com/group/boost/message/15442
  225. [Although the definition of a suitable PTHREAD_ONCE_INIT precludes use of the
  226. TLS located flag, this is not critical.]
  227. There are three primary concerns though:-
  228. 1) The [named] mutex is 'created' even in the uncontended case.
  229. 2) A system wide unique name must be generated.
  230. 3) Win32 mutexes are VERY slow even in the uncontended  case. An uncontested
  231. Win32 mutex lock operation can be 50 (or more) times slower than an
  232. uncontested EnterCS operation.
  233. Ultimately, the named mutex trick is making use of the global locks maintained
  234. by the kernel.
  235. * pthread.h (pthread_once_t_): One flag and an event HANDLE added.
  236. (PTHREAD_ONCE_INIT): Additional values included.
  237. 2005-03-08  Ross Johnson  <rpj at callisto.canberra.edu.au>
  238. * pthread_once.c (pthread_once): Redesigned to elliminate potential
  239. starvation problem.
  240. - reported by Gottlob Frege  <gottlobfrege at gmail.com>
  241. * ptw32_threadDestroy.c (ptw32_threadDestroy): Implicit threads were
  242. not closing their Win32 thread duplicate handle.
  243. - reported by Dmitrii Semii <bogolt at gmail.com>
  244. 2005-01-25  Ralf Kubis  <RKubis at mc.com>
  245. * Attempted acquisition of recursive mutex was causing waiting
  246. threads to not be woken when the mutex is released.
  247. * GNUmakefile (GCE): Generate correct version resource comments.
  248. 2005-01-01  Konstantin Voronkov  <beowinkle at yahoo.com>
  249. * pthread_mutex_lock.c (pthread_mutex_lock): The new atomic exchange
  250. mutex algorithm is known to allow a thread to steal the lock off
  251. FIFO waiting threads. The next waiting FIFO thread gets a spurious
  252. wake-up and must attempt to re-acquire the lock. The woken thread
  253. was setting itself as the mutex's owner before the re-acquisition.
  254. 2004-11-22  Ross Johnson  <rpj at callisto.canberra.edu.au>
  255. * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Undo change
  256. from 2004-11-02.
  257. * Makefile (DLL_VER): Added for DLL naming suffix - see README.
  258. * GNUmakefile (DLL_VER): Likewise.
  259. * Wmakefile (DLL_VER): Likewise.
  260. * Bmakefile (DLL_VER): Likewise.
  261. * pthread.dsw (version.rc): Added to MSVS workspace.
  262. 2004-11-20  Boudewijn Dekker  <b.dekker at ellipsis.nl>
  263. * pthread_getspecific.c (pthread_getspecific): Check for
  264. invalid (NULL) key argument.
  265. 2004-11-19  Ross Johnson  <rpj at callisto.canberra.edu.au>
  266. * config.h (PTW32_THREAD_ID_REUSE_INCREMENT): Added to allow
  267. building the library for either unique thread IDs like Solaris
  268. or non-unique thread IDs like Linux; allows application developers
  269. to override the library's default insensitivity to some apps
  270. that may not be strictly POSIX compliant.
  271. * version.rc: New resource module to encode version information
  272. within the DLL.
  273. * pthread.h: Added PTW32_VERSION* defines and grouped sections
  274. required by resource compiler together; bulk of file is skipped
  275. if RC_INVOKED. Defined some error numbers and other names for
  276. Borland compiler.
  277. 2004-11-02  Ross Johnson  <rpj at callisto.canberra.edu.au>
  278. * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Lock CV mutex at
  279. start of cleanup handler rather than at the end.
  280. * implement.h (PTW32_THREAD_REUSE_EMPTY): Renamed from *_BOTTOM.
  281. (ptw32_threadReuseBottom): New global variable.
  282. * global.c (ptw32_threadReuseBottom): Declare new variable.
  283. * ptw32_reuse.c (ptw32_reuse): Change reuse LIFO stack to LILO queue
  284. to more evenly distribute use of reusable thread IDs; use renamed
  285. PTW32_THREAD_REUSE_EMPTY.
  286. * ptw32_processTerminate.c (ptw2_processTerminate): Use renamed
  287. PTW32_THREAD_REUSE_EMPTY.
  288. 2004-10-31  Ross Johnson  <rpj at callisto.canberra.edu.au>
  289. * implement.h (PThreadState): Add new state value
  290. 'PThreadStateCancelPending'.
  291. * pthread_testcancel.c (pthread_testcancel): Use new thread
  292. 'PThreadStateCancelPending' state as short cut to avoid entering
  293. kernel space via WaitForSingleObject() call. This was obviated
  294. by user space sema acquisition in sem_wait() and sem_timedwait(),
  295. which are also cancelation points. A call to pthread_testcancel()
  296. was required, which introduced a kernel call, effectively nullifying
  297. any gains made by the user space sem acquisition checks.
  298. * pthread_cancel.c (pthread_cancel): Set new thread
  299. 'PThreadStateCancelPending' state.
  300. 2004-10-29  Ross Johnson  <rpj at callisto.canberra.edu.au>
  301. * implement.h (pthread_t): Renamed to ptw32_thread_t; struct contains
  302. all thread state.
  303. * pthread.h (ptw32_handle_t): New general purpose struct to serve
  304. as a handle for various reusable object IDs - currently only used
  305. by pthread_t; contains a pointer to ptw32_thread_t (thread state)
  306. and a general purpose uint for use as a reuse counter or flags etc.
  307. (pthread_t): typedef'ed to ptw32_handle_t; the uint is the reuse
  308. counter that allows the library to maintain unique POSIX thread IDs.
  309. When the pthread struct reuse stack was introduced, threads would
  310. often acquire an identical ID to a previously destroyed thread. The
  311. same was true for the pre-reuse stack library, by virtue of pthread_t
  312. being the address of the thread struct. The new pthread_t retains
  313. the reuse stack but provides virtually unique thread IDs.
  314. * sem_wait.c (ptw32_sem_wait_cleanup): New routine used for
  315. cancelation cleanup.
  316. * sem_timedwait.c (ptw32_sem_timedwait_cleanup): Likewise.
  317. 2004-10-22  Ross Johnson  <rpj at callisto.canberra.edu.au>
  318. * sem_init.c (sem_init): Introduce a 'lock' element in order to
  319. replace the interlocked operations with conventional serialisation.
  320. This is needed in order to be able to atomically modify the sema
  321. value and perform Win32 sema release operations. Win32 semaphores are
  322. used instead of events in order to support efficient multiple posting.
  323. If the whole modify/release isn't atomic, a race between
  324. sem_timedwait() and sem_post() could result in a release when there is
  325. no waiting semaphore, which would cause too many threads to proceed.
  326. * sem_wait.c (sem_wait): Use new 'lock'element.
  327. * sem_timedwait.c (sem_timedwait): Likewise.
  328. * sem_trywait.c (sem_trywait): Likewise.
  329. * sem_post.c (sem_post): Likewise.
  330. * sem_post_multiple.c (sem_post_multiple): Likewise.
  331. * sem_getvalue.c (sem_getvalue): Likewise.
  332. * ptw32_semwait.c (ptw32_semwait): Likewise.
  333. * sem_destroy.c (sem_destroy): Likewise; also tightened the conditions
  334. for semaphore destruction; in particular, a semaphore will not be
  335. destroyed if it has waiters.
  336. * sem_timedwait.c (sem_timedwait): Added cancel cleanup handler to
  337. restore sema value when cancelled.
  338. * sem_wait.c (sem_wait): Likewise.
  339. 2004-10-21  Ross Johnson  <rpj at callisto.canberra.edu.au>
  340. * pthread_mutex_unlock.c (pthread_mutex_unlock): Must use PulseEvent()
  341. rather than SetEvent() to reset the event if there are no waiters.
  342. 2004-10-19  Ross Johnson  <rpj at callisto.canberra.edu.au>
  343. * sem_init.c (sem_init): New semaphore model based on the same idea
  344. as mutexes, i.e. user space interlocked check to avoid 
  345. unnecessarily entering kernel space. Wraps the Win32 semaphore and
  346. keeps it's own counter. Although the motivation to do this has existed
  347. for a long time, credit goes to Alexander Terekhov for providing
  348. the logic. I have deviated slightly from AT's logic to add the waiters
  349. count, which has made the code more complicated by adding cancelation
  350. cleanup. This also appears to have broken the VCE (C++ EH) version of
  351. the library (the same problem as previously reported - see BUGS #2),
  352. only apparently not fixable using the usual workaround, nor by turning
  353. all optimisation off. The GCE version works fine, so it is presumed to
  354. be a bug in MSVC++ 6.0. The cancelation exception is thrown and caught
  355. correctly, but the cleanup class destructor is never called. The failing
  356. test is testssemaphore4.c.
  357. * sem_wait.c (sem_wait): Implemented user space check model.
  358. * sem_post.c (sem_post): Likewise.
  359. * sem_trywait.c (sem_trywait): Likewise.
  360. * sem_timedwait.c (sem_timedwait): Likewise.
  361. * sem_post_multiple.c (sem_post_multiple): Likewise.
  362. * sem_getvalue.c (sem_getvalue): Likewise.
  363. * ptw32_semwait.c (ptw32_semwait): Likewise.
  364. * implement.h (sem_t_): Add counter element.
  365. 2004-10-15  Ross Johnson  <rpj at callisto.canberra.edu.au>
  366. * implement.h (pthread_mutex_t_): Use an event in place of
  367. the POSIX semaphore.
  368. * pthread_mutex_init.c: Create the event; remove semaphore init.
  369. * pthread_mutex_destroy.c: Delete the event.
  370. * pthread_mutex_lock.c: Replace the semaphore wait with the event wait.
  371. * pthread_mutex_trylock.c: Likewise.
  372. * pthread_mutex_timedlock.c: Likewise.
  373. * pthread_mutex_unlock.c: Set the event.
  374. 2004-10-14  Ross Johnson  <rpj at callisto.canberra.edu.au>
  375. * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm using
  376. Terekhov's xchg based variation of Drepper's cmpxchg model.
  377. Theoretically, xchg uses fewer clock cycles than cmpxchg (using IA-32
  378. as a reference), however, in my opinion bus locking dominates the
  379. equation on smp systems, so the model with the least number of bus
  380. lock operations in the execution path should win, which is Terekhov's
  381. variant. On IA-32 uni-processor systems, it's faster to use the
  382. CMPXCHG instruction without locking the bus than to use the XCHG
  383. instruction, which always locks the bus. This makes the two variants
  384. equal for the non-contended lock (fast lane) execution path on up
  385. IA-32. Testing shows that the xchg variant is faster on up IA-32 as
  386. well if the test forces higher lock contention frequency, even though
  387. kernel calls should be dominating the times (on up IA-32, both
  388. variants used CMPXCHG instructions and neither locked the bus).
  389. * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly.
  390. * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly.
  391. * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly.
  392. * ptw32_InterlockedCompareExchange.c (ptw32_InterlockExchange): New
  393. function.
  394. (PTW32_INTERLOCKED_EXCHANGE): Sets up macro to use inlined
  395. ptw32_InterlockedExchange.
  396. * implement.h (PTW32_INTERLOCKED_EXCHANGE): Set default to
  397. InterlockedExchange().
  398. * Makefile: Building using /Ob2 so that asm sections within inline
  399. functions are inlined.
  400. 2004-10-08  Ross Johnson  <rpj at callisto.canberra.edu.au>
  401. * pthread_mutex_destroy.c (pthread_mutex_destroy): Critical Section
  402. element is no longer required.
  403. * pthread_mutex_init.c (pthread_mutex_init): Likewise.
  404. * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm following
  405. Drepper's paper at http://people.redhat.com/drepper/futex.pdf, but
  406. using the existing semaphore in place of the futex described in the
  407. paper. Idea suggested by Alexander Terekhov - see:
  408. http://sources.redhat.com/ml/pthreads-win32/2003/msg00108.html
  409. * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly.
  410. * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly.
  411. * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly.
  412. * pthread_barrier_wait.c (pthread_barrier_wait): Use inlined version
  413. of InterlockedCompareExchange() if possible - determined at
  414. build-time.
  415. * pthread_spin_destroy.c pthread_spin_destroy(): Likewise.
  416. * pthread_spin_lock.c pthread_spin_lock():Likewise.
  417. * pthread_spin_trylock.c (pthread_spin_trylock):Likewise.
  418. * pthread_spin_unlock.c (pthread_spin_unlock):Likewise.
  419. * ptw32_InterlockedCompareExchange.c: Sets up macro for inlined use.
  420. * implement.h (pthread_mutex_t_): Remove Critical Section element.
  421. (PTW32_INTERLOCKED_COMPARE_EXCHANGE): Set to default non-inlined
  422. version of InterlockedCompareExchange().
  423. * private.c: Include ptw32_InterlockedCompareExchange.c first for
  424. inlining.
  425. * GNUmakefile: Add commandline option to use inlined
  426. InterlockedCompareExchange().
  427. * Makefile: Likewise.
  428. 2004-09-27  Ross Johnson  <rpj at callisto.canberra.edu.au>
  429. * pthread_mutex_lock.c (pthread_mutex_lock): Separate
  430. PTHREAD_MUTEX_NORMAL logic since we do not need to keep or check some
  431. state required by other mutex types; do not check mutex pointer arg
  432. for validity - leave this to the system since we are only checking
  433. for NULL pointers. This should improve speed of NORMAL mutexes and
  434. marginally improve speed of other type.
  435. * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise.
  436. * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise; also avoid
  437. entering the critical section for the no-waiters case, with approx.
  438. 30% reduction in lock/unlock overhead for this case.
  439. * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise; also
  440. no longer keeps mutex if post-timeout second attempt succeeds - this
  441. will assist applications that wish to impose strict lock deadlines,
  442. rather than simply to escape from frozen locks.
  443. 2004-09-09  Tristan Savatier  <tristan at mpegtv.com>
  444. * pthread.h (struct pthread_once_t_): Qualify the 'done' element
  445. as 'volatile'.
  446. * pthread_once.c: Concerned about possible race condition,
  447. specifically on MPU systems re concurrent access to multibyte types.
  448. [Maintainer's note: the race condition is harmless on SPU systems
  449. and only a problem on MPU systems if concurrent access results in an
  450. exception (presumably generated by a hardware interrupt). There are
  451. other instances of similar harmless race conditions that have not
  452. been identified as issues.]
  453. 2004-09-09  Ross Johnson  <rpj at callisto.canberra.edu.au>
  454. * pthread.h: Declare additional types as volatile.
  455. 2004-08-27  Ross Johnson  <rpj at callisto.canberra.edu.au>
  456. * pthread_barrier_wait.c (pthread_barrier_wait): Remove excessive code
  457. by substituting the internal non-cancelable version of sem_wait
  458. (ptw32_semwait).
  459. 2004-08-25  Ross Johnson  <rpj at callisto.canberra.edu.au>
  460. * pthread_join.c (pthread_join): Rewrite and re-order the conditional
  461. tests in an attempt to improve efficiency and remove a race
  462. condition.
  463. 2004-08-23  Ross Johnson  <rpj at callisto.canberra.edu.au>
  464. * create.c (pthread_create): Don't create a thread if the thread
  465. id pointer location (first arg) is inaccessible. A memory
  466. protection fault will result if the thread id arg isn't an accessible
  467. location. This is consistent with GNU/Linux but different to
  468. Solaris or MKS (and possibly others), which accept NULL as meaning
  469. 'don't return the created thread's ID'. Applications that run
  470. using pthreads-win32 will run on all other POSIX threads
  471. implementations, at least w.r.t. this feature.
  472. It was decided not to copy the Solaris et al behaviour because,
  473. although it would have simplified some application porting (but only
  474. from Solaris to Windows), the feature is not technically necessary,
  475. and the alternative segfault behaviour helps avoid buggy application
  476. code.
  477. 2004-07-01  Anuj Goyal  <anuj.goyal at gmail.com>
  478. * builddmc.bat: New; Windows bat file to build the library.
  479. * config.h (__DMC__): Support for Digital Mars compiler.
  480. * create.c (__DMC__): Likewise.
  481. * pthread_exit.c (__DMC__): Likewise.
  482. * pthread_join.c (__DMC__): Likewise.
  483. * ptw32_threadDestroy.c (__DMC__): Likewise.
  484. * ptw32_threadStart.c (__DMC__): Likewise.
  485. * ptw32_throw.c (__DMC__): Likewise.
  486. 2004-06-29  Anuj Goyal  <anuj.goyal at gmail.com>
  487. * pthread.h (__DMC__): Initial support for Digital Mars compiler.
  488. 2004-06-29  Will Bryant  <will.bryant at ecosm.com>
  489. * README.Borland: New; description of Borland changes.
  490. * Bmakefile: New makefile for the Borland make utility.
  491. * ptw32_InterlockedCompareExchange.c:
  492. Add Borland compatible asm code.
  493. 2004-06-26  Jason Bard  <BardJA at Npt.NUWC.Navy.Mil>
  494. * pthread.h (HAVE_STRUCT_TIMESPEC): If undefined, define it
  495. to avoid timespec struct redefined errors elsewhere in an
  496. application.
  497. 2004-06-21  Ross Johnson  <rpj at callisto.canberra.edu.au>
  498. * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER): Mutex
  499. initialiser added for compatibility with Linux threads and
  500. others; currently not included in SUSV3.
  501. * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER): Likewise.
  502. * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): Likewise.
  503. * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Likewise.
  504. * ptw32_mutex_check_need_init.c (ptw32_mutex_check_need_init): 
  505. Add new initialisers.
  506. * pthread_mutex_lock.c (pthread_mutex_lock): Check for new
  507. initialisers.
  508. * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise.
  509. * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise.
  510. * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise.
  511. * pthread_mutex_destroy.c (pthread_mutex_destroy): Likewise.
  512. 2004-05-20  Ross Johnson  <rpj at callisto.canberra.edu.au>
  513. * README.NONPORTABLE: Document pthread_win32_test_features_np().
  514. * FAQ: Update various answers.
  515. 2004-05-19  Ross Johnson  <rpj at callisto.canberra.edu.au>
  516. * Makefile: Don't define _WIN32_WINNT on compiler command line.
  517. * GNUmakefile: Likewise.
  518. 2004-05-16  Ross Johnson  <rpj at callisto.canberra.edu.au>
  519. * pthread_cancel.c (pthread_cancel): Adapted to use auto-detected
  520. QueueUserAPCEx features at run-time.
  521. (ptw32_RegisterCancelation): Drop in replacement for QueueUserAPCEx()
  522. if it can't be used. Provides older style non-preemptive async
  523. cancelation.
  524. * pthread_win32_attach_detach_np.c (pthread_win32_attach_np):
  525. Auto-detect quserex.dll and the availability of alertdrv.sys;
  526. initialise and close on process attach/detach.
  527. * global.c (ptw32_register_cancelation): Pointer to either
  528. QueueUserAPCEx() or ptw32_RegisterCancelation() depending on
  529. availability. QueueUserAPCEx makes pre-emptive async cancelation
  530. possible.
  531. * implement.h: Add definitions and prototypes related to QueueUserAPC.
  532. 2004-05-16  Panagiotis E. Hadjidoukas <peh at hpclab.ceid.upatras.gr>
  533. * QueueUserAPCEx (separate contributed package): Provides preemptive
  534. APC feature.
  535. * pthread_cancel.c (pthread_cancel): Initial integration of
  536. QueueUserAPCEx into pthreads-win32 to provide true pre-emptive
  537. async cancelation of threads, including blocked threads.
  538. 2004-05-06  Makoto Kato  <raven at oldskool.jp>
  539. * pthread.h (DWORD_PTR): Define typedef for older MSVC.
  540. * pthread_cancel.c (AMD64): Add architecture specific Context register.
  541. * ptw32_getprocessors.c: Use correct types (DWORD_PTR) for mask
  542. variables.
  543. 2004-04-06  P. van Bruggen  <pietvb at newbridges.nl>
  544. * ptw32_threadDestroy.c: Destroy threadLock mutex to
  545. close a memory leak.
  546. 2004-02-13  Gustav Hallberg  <gustav at virtutech.com>
  547. * pthread_equal.c: Remove redundant equality logic.
  548. 2003-12-10  Philippe Di Cristo  <philipped at voicebox.com>
  549. * sem_timedwait.c (sem_timedwait): Fix timeout calculations.
  550. 2003-10-20  Alexander Terekhov  <TEREKHOV at de.ibm.com>
  551. * pthread_mutex_timedlock.c (ptw32_semwait): Move to individual module.
  552. * ptw32_semwait.c: New module.
  553. * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Replace cancelable
  554. sem_wait() call with non-cancelable ptw32_semwait() call.
  555. * pthread.c (private.c): Re-order for inlining. GNU C warned that
  556. function ptw32_semwait() was defined 'inline' after it was called.
  557. * pthread_cond_signal.c (ptw32_cond_unblock): Likewise.
  558. * pthread_delay_np.c: Disable Watcom warning with comment.
  559. * *.c (process.h): Remove include from .c files. This is conditionally
  560. included by the common project include files.
  561. 2003-10-20  James Ewing  <james.ewing at sveasoft.com>
  562. * ptw32_getprocessors.c: Some Win32 environments don't have
  563. GetProcessAffinityMask(), so always return CPU count = 1 for them.
  564. * config.h (NEED_PROCESSOR_AFFINITY_MASK): Define for WinCE.
  565. 2003-10-15  Ross Johnson  <ross at callisto.canberra.edu.au>
  566. * Re-indented all .c files using default GNU style to remove assorted
  567. editor ugliness (used GNU indent utility in default style).
  568. 2003-10-15  Alex Blanco  <Alex.Blanco at motorola.com>
  569. * sem_init.c (sem_init): Would call CreateSemaphore even if the sema
  570. struct calloc failed; was not freeing calloced memory if either
  571. CreateSemaphore or CreateEvent failed.
  572. 2003-10-14  Ross Johnson  <ross at callisto.canberra.edu.au>
  573. * pthread.h: Add Watcom compiler compatibility. Esssentially just add
  574. the cdecl attribute to all exposed function prototypes so that Watcom
  575. generates function call code compatible with non-Watcom built libraries.
  576. By default, Watcom uses registers to pass function args if possible rather
  577. than pushing to stack.
  578. * semaphore.h: Likewise.
  579. * sched.h: Likewise.
  580. * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Define with cdecl attribute
  581. for Watcom compatibility. This routine is called via pthread_cleanup_push so
  582. it had to match function arg definition.
  583. * Wmakefile: New makefile for Watcom builds.
  584. 2003-09-14  Ross Johnson  <rpj at callisto.canberra.edu.au>
  585. * pthread_setschedparam.c (pthread_setschedparam): Attempt to map
  586. all priority levels between max and min (as returned by
  587. sched_get_priority_min/max) to reasonable Win32 priority levels - i.e.
  588. levels between THREAD_PRIORITY_LOWEST/IDLE to THREAD_PRIORITY_LOWEST and
  589. between THREAD_PRIORITY_HIGHEST/TIME_CRITICAL to THREAD_PRIORITY_HIGHEST
  590. while others remain unchanged; record specified thread priority level
  591. for return by pthread_getschedparam.
  592. Note that, previously, specified levels not matching Win32 priority levels
  593. would silently leave the current thread priority unaltered.
  594. * pthread_getschedparam.c (pthread_getschedparam): Return the priority
  595. level specified by the latest pthread_setschedparam or pthread_create rather
  596. than the actual running thread priority as returned by GetThreadPriority - as
  597. required by POSIX. I.e. temporary or adjusted actual priority levels are not
  598. returned by this routine.
  599. * pthread_create.c (pthread_create): For priority levels specified via
  600. pthread attributes, attempt to map all priority levels between max and
  601. min (as returned by sched_get_priority_min/max) to reasonable Win32
  602. priority levels; record priority level given via attributes, or
  603. inherited from parent thread, for later return by pthread_getschedparam.
  604. * ptw32_new.c (ptw32_new): Initialise pthread_t_ sched_priority element.
  605. * pthread_self.c (pthread_self): Set newly created implicit POSIX thread
  606. sched_priority to Win32 thread's current actual priority. Temporarily
  607. altered priorities can't be avoided in this case.
  608. * implement.h (struct pthread_t_): Add new sched_priority element.
  609. 2003-09-12  Ross Johnson  <rpj at callisto.canberra.edu.au>
  610. * sched_get_priority_min.c (sched_get_priority_min): On error should return -1
  611. with errno set.
  612. * sched_get_priority_max.c (sched_get_priority_max): Likewise.
  613. 2003-09-03  Ross Johnson  <rpj at callisto.canberra.edu.au>
  614. * w32_cancelableWait.c (ptw32_cancelable_wait): Allow cancelation
  615. of implicit POSIX threads as well.
  616. 2003-09-02  Ross Johnson  <rpj at callisto.canberra.edu.au>
  617. * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np):
  618. Add comment.
  619. * pthread_exit.c (pthread_exit): Fix to recycle the POSIX thread handle in
  620. addition to calling user TSD destructors. Move the implicit POSIX thread exit
  621. handling to ptw32_throw to centralise the logic.
  622. * ptw32_throw.c (ptw32_throw): Implicit POSIX threads have no point
  623. to jump or throw to, so cleanup and exit the thread here in this case. For
  624. processes using the C runtime, the exit code will be set to the POSIX
  625. reason for the throw (i.e. PTHREAD_CANCEL or the value given to pthread_exit).
  626. Note that pthread_exit() already had similar logic, which has been moved to
  627. here.
  628. * ptw32_threadDestroy.c (ptw32_threadDestroy): Don't close the Win32 handle
  629. of implicit POSIX threads - expect this to be done by Win32?
  630. 2003-09-01  Ross Johnson  <rpj at callisto.canberra.edu.au>
  631. * pthread_self.c (pthread_self): The newly aquired pthread_t must be
  632. assigned to the reuse stack, not freed, if the routine fails somehow.
  633. 2003-08-13  Ross Johnson  <rpj at ise.canberra.edu.au>
  634. * pthread_getschedparam.c (pthread_getschedparam): An invalid thread ID
  635. parameter was returning an incorrect error value; now uses a more exhaustive
  636. check for validity.
  637. * pthread_setschedparam.c (pthread_setschedparam): Likewise.
  638. * pthread_join.c (pthread_join): Now uses a more exhaustive
  639. check for validity.
  640. * pthread_detach.c (pthread_detach): Likewise.
  641. * pthread_cancel.c (pthread_cancel): Likewise.
  642. * ptw32_threadDestroy.c (ptw32_threadDestroy): pthread_t structs are
  643. never freed - push them onto a stack for reuse.
  644. * ptw32_new.c (ptw32_new): Check for reusable pthread_t before dynamically
  645. allocating new memory for the struct.
  646. * pthread_kill.c (pthread_kill): New file; new routine; takes only a zero
  647. signal arg so that applications can check the thread arg for validity; checks
  648. that the underlying Win32 thread HANDLE is valid.
  649. * pthread.h (pthread_kill): Add prototype.
  650. * ptw32_reuse.c (ptw32_threadReusePop): New file; new routine; pop a
  651. pthread_t off the reuse stack. pthread_t_ structs that have been destroyed, i.e.
  652. have exited detached or have been joined, are cleaned up and put onto a reuse
  653. stack. Consequently, thread IDs are no longer freed once calloced. The library
  654. will attempt to get a struct off this stack before asking the system to alloc
  655. new memory when creating threads. The stack is guarded by a global mutex.
  656. (ptw32_threadReusePush): New routine; push a pthread_t onto the reuse stack.
  657. * implement.h (ptw32_threadReusePush): Add new prototype.
  658. (ptw32_threadReusePop): Likewise.
  659. (pthread_t): Add new element.
  660. * ptw32_processTerminate.c (ptw32_processTerminate): Delete the thread
  661. reuse lock; free all thread ID structs on the thread reuse stack.
  662. * ptw32_processInitialize.c (ptw32_processInitialize): Initialise the
  663. thread reuse lock.
  664. 2003-07-19  Ross Johnson  <rpj at ise.canberra.edu.au>
  665. * GNUmakefile: modified to work under MsysDTK environment.
  666. * pthread_spin_lock.c (pthread_spin_lock): Check for NULL arg.
  667. * pthread_spin_unlock.c (pthread_spin_unlock): Likewise.
  668. * pthread_spin_trylock.c (pthread_spin_trylock): Likewise;
  669. fix incorrect pointer value if lock is dynamically initialised by
  670. this function.
  671. * sem_init.c (sem_init): Initialise sem_t value to quell compiler warning.
  672. * sem_destroy.c (sem_destroy): Likewise.
  673. * ptw32_threadStart.c (non-MSVC code sections): Include <exception> rather
  674. than old-style <new.h>; fix all std:: namespace entities such as
  675. std::terminate_handler instances and associated methods.
  676. * ptw32_callUserDestroyRoutines.c (non-MSVC code sections): Likewise.
  677. 2003-06-24  Piet van Bruggen  <pietvb at newbridges.nl>
  678. * pthread_spin_destroy.c (pthread_spin_destroy): Was not freeing the
  679. spinlock struct.
  680. 2003-06-22  Nicolas Barry  <boozai at yahoo.com>
  681. * pthread_mutex_destroy.c (pthread_mutex_destroy): When called
  682. with a recursive mutex that was locked by the current thread, the
  683. function was failing with a success return code.
  684. 2003-05-15  Steven Reddie  <Steven.Reddie at ca.com>
  685. * pthread_win32_attach_detach_np.c (pthread_win32_process_detach_np):
  686. NULLify ptw32_selfThreadKey after the thread is destroyed, otherwise
  687. destructors calling pthreads routines might resurrect it again, creating
  688. memory leaks. Call the underlying Win32 Tls routine directly rather than
  689. pthread_setspecific().
  690. (pthread_win32_thread_detach_np): Likewise.
  691. 2003-05-14  Viv  <vcotirlea at hotmail.com>
  692. * pthread.dsp: Change /MT compile flag to /MD.
  693. 2003-03-04  Alexander Terekhov  <TEREKHOV at de.ibm.com>
  694. * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Fix failure to
  695. set ownership of mutex on second grab after abstime timeout.
  696. - bug reported by Robert Strycek <strycek at posam.sk>
  697. 2002-12-17  Thomas Pfaff  <tpfaff at gmx.net>
  698. * pthread_mutex_lock.c (ptw32_semwait): New static routine to provide
  699. a non-cancelable sem_wait() function. This is consistent with the
  700. way that pthread_mutex_timedlock.c does it.
  701. (pthread_mutex_lock): Use ptw32_semwait() instead of sem_wait().
  702. 2002-12-11  Thomas Pfaff  <tpfaff at gmx.net>
  703. * pthread_mutex_trylock.c: Should return EBUSY rather than EDEADLK.
  704. * pthread_mutex_destroy.c: Remove redundant ownership test (the
  705. trylock call does this for us); do not destroy a recursively locked
  706. mutex.
  707. 2002-09-20  Michael Johnson  <michaelj at maine.rr.com>
  708. * pthread_cond_destroy.c (pthread_cond_destroy): 
  709. When two different threads exist, and one is attempting to
  710. destroy a condition variable while the other is attempting to
  711. initialize a condition variable that was created with
  712. PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink
  713. the ptw32_cond_list_lock critical section to fix it.
  714. 2002-07-31  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  715. * ptw32_threadStart.c (ptw32_threadStart): Thread cancelLock
  716. destruction moved to ptw32_threadDestroy().
  717. * ptw32_threadDestroy.c (ptw32_threadDestroy):  Destroy
  718. the thread's cancelLock. Moved here from ptw32_threadStart.c
  719. to cleanup implicit threads as well.
  720. 2002-07-30  Alexander Terekhov  <TEREKHOV at de.ibm.com>
  721. * pthread_cond_wait.c (ptw32_cond_wait_cleanup): 
  722. Remove code designed to avoid/prevent spurious wakeup
  723. problems. It is believed that the sem_timedwait() call
  724. is consuming a CV signal that it shouldn't and this is
  725. breaking the avoidance logic.
  726. 2002-07-30  Ross Johnson  <rpj at ise.canberra.edu.au>
  727. * sem_timedwait.c (sem_timedwait): Tighten checks for
  728. unreasonable abstime values - that would result in
  729. unexpected timeout values.
  730. * w32_CancelableWait.c (ptw32_cancelable_wait):
  731. Tighten up return value checking and add comments.
  732. 2002-06-08  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  733. * sem_getvalue.c (sem_getvalue): Now returns a value for the
  734. NEED_SEM version (i.e. earlier versions of WinCE).
  735. 2002-06-04  Rob Fanner  <rfanner at stonethree.com>
  736. * sem_getvalue.c (sem_getvalue): The Johnson M. Hart
  737. approach didn't work - we are forced to take an
  738. intrusive approach. We try to decrement the sema
  739. and then immediately release it again to get the
  740. value. There is a small probability that this may
  741. block other threads, but only momentarily.
  742. 2002-06-03  Ross Johnson  <rpj at ise.canberra.edu.au>
  743. * sem_init.c (sem_init): Initialise Win32 semaphores
  744. to _POSIX_SEM_VALUE_MAX (which this implementation
  745. defines in pthread.h) so that sem_getvalue() can use
  746. the trick described in the comments in sem_getvalue().
  747. * pthread.h (_POSIX_SEM_VALUE_MAX): Defined.
  748. (_POSIX_SEM_NSEMS_MAX): Defined - not used but may be
  749. useful for source code portability.
  750. 2002-06-03  Rob Fanner  <rfanner at stonethree.com>
  751. * sem_getvalue.c (sem_getvalue): Did not work on NT.
  752. Use approach suggested by Johnson M. Hart in his book
  753. "Win32 System Programming".
  754. 2002-02-28  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  755. * errno.c: Compiler directive was incorrectly including code.
  756. * pthread.h: Conditionally added some #defines from config.h
  757. needed when not building the library. e.g. NEED_ERRNO, NEED_SEM.
  758. (PTW32_DLLPORT): Now only defined if _DLL defined.
  759. (_errno): Compiler directive was incorrectly including prototype.
  760. * sched.h: Conditionally added some #defines from config.h
  761. needed when not building the library.
  762. * semaphore.h: Replace an instance of NEED_SEM that should
  763. have been NEED_ERRNO. This change currently has nil effect.
  764. * GNUmakefile: Correct some recent changes.
  765. * Makefile: Add rule to generate pre-processor output.
  766. 2002-02-23  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  767. * pthread_rwlock_timedrdlock.c: New - untested.
  768. * pthread_rwlock_timedwrlock.c: New - untested.
  769. * Testsuite passed (except known MSVC++ problems)
  770. * pthread_cond_destroy.c: Expand the time change
  771. critical section to solve deadlock problem.
  772. * pthread.c: Add all remaining C modules.
  773. * pthread.h: Use dllexport/dllimport attributes on functions
  774. to avoid using pthread.def.
  775. * sched.h: Likewise.
  776. * semaphore.h: Likewise.
  777. * GNUmakefile: Add new targets for single translation
  778. unit build to maximise inlining potential; generate
  779. pthread.def automatically.
  780. * Makefile: Likewise, but no longer uses pthread.def.
  781. 2002-02-20  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  782. * pthread_cond_destroy.c (pthread_cond_destroy):
  783. Enter the time change critical section earlier.
  784. 2002-02-17  Ross Johnson  <rpj at setup1.ise.canberra.edu.au
  785. * Testsuite passed.
  786. * pthread_timechange_handler_np.c: New; following
  787. a suggestion from Alexander Terekhov that CVs should
  788. be broadcast so that they all re-evaluate their
  789. condition variables and reset a new timeout if
  790. required, whenever an application receives a
  791. WM_TIMECHANGE message. This message indicates that
  792. the system time has been changed. Therefore, CVs
  793. waiting for a timeout set as an abs_time will possibly
  794. not wake up at the expected time. Some applications
  795. may not be tolerant of this.
  796. * pthread_cond_init.c: Add CV to linked list.
  797. * pthread_cond_destroy.c: Remove CV from linked list.
  798. * global.c (ptw32_cond_list_head): New variable.
  799. (ptw32_cond_list_tail): New variable.
  800. (ptw32_cond_list_cs): New critical section.
  801. * ptw32_processInitialize (ptw32_cond_list_cs): Initialize.
  802. * ptw32_processTerminate (ptw32_cond_list_cs): Delete.
  803. * Reduce executable size.
  804.   -----------------------
  805. When linking with the static library, only those
  806. routines actually called, either directly or indirectly
  807. should be included.
  808. [Gcc has the -ffunction-segments option to do this but MSVC
  809. doesn't have this feature as far as I can determine. Other
  810. compilers are undetermined as well. - rpj]
  811. * spin.c: Split file into function segments.
  812. * ptw32_spinlock_check_need_init.c: Separated routine from spin.c.
  813. * pthread_spin_init.c: Likewise.
  814. * pthread_spin_destroy.c: Likewise.
  815. * pthread_spin_lock.c: Likewise.
  816. * pthread_spin_unlock.c: Likewise.
  817. * pthread_spin_trylock.c: Likewise.
  818. * sync.c: Split file into function segments.
  819. * pthread_detach.c: Separated routine from sync.c.
  820. * pthread_join.c: Likewise.
  821. * tsd.c: Split file into function segments.
  822. * pthread_key_create.c: Separated routine from tsd.c.
  823. * pthread_key_delete.c: Likewise.
  824. * pthread_setspecific.c: Likewise.
  825. * pthread_getspecific.c: Likewise.
  826. * sched.c: Split file into function segments.
  827. * pthread_attr_setschedpolicy.c: Separated routine from sched.c.
  828. * pthread_attr_getschedpolicy.c: Likewise.
  829. * pthread_attr_setschedparam.c: Likewise.
  830. * pthread_attr_getschedparam.c: Likewise.
  831. * pthread_attr_setinheritsched.c: Likewise.
  832. * pthread_attr_getinheritsched.c: Likewise.
  833. * pthread_setschedparam.c: Likewise.
  834. * pthread_getschedparam.c: Likewise.
  835. * sched_get_priority_max.c: Likewise.
  836. * sched_get_priority_min.c: Likewise.
  837. * sched_setscheduler.c: Likewise.
  838. * sched_getscheduler.c: Likewise.
  839. * sched_yield.c: Likewise.
  840. 2002-02-16  Ross Johnson  <rpj at setup1.ise.canberra.edu.au
  841. Reduce executable size.
  842. -----------------------
  843. When linking with the static library, only those
  844. routines actually called, either directly or indirectly
  845. should be included.
  846. [Gcc has the -ffunction-segments option to do this but MSVC
  847. doesn't have this feature as far as I can determine. Other
  848. compilers are undetermined as well. - rpj]
  849. * mutex.c: Split file into function segments.
  850. * pthread_mutexattr_destroy.c: Separated routine from mutex.c
  851. * pthread_mutexattr_getpshared.c: Likewise.
  852. * pthread_mutexattr_gettype.c: Likewise.
  853. * pthread_mutexattr_init.c: Likewise.
  854. * pthread_mutexattr_setpshared.c: Likewise.
  855. * pthread_mutexattr_settype.c: Likewise.
  856. * ptw32_mutex_check_need_init.c: Likewise.
  857. * pthread_mutex_destroy.c: Likewise.
  858. * pthread_mutex_init.c: Likewise.
  859. * pthread_mutex_lock.c: Likewise.
  860. * pthread_mutex_timedlock.c: Likewise.
  861. * pthread_mutex_trylock.c: Likewise.
  862. * pthread_mutex_unlock.c: Likewise.
  863. * private.c: Split file into function segments.
  864. * ptw32_InterlockedCompareExchange.c: Separated routine from private.c
  865. * ptw32_callUserDestroyRoutines.c: Likewise.
  866. * ptw32_getprocessors.c: Likewise.
  867. * ptw32_processInitialize.c: Likewise.
  868. * ptw32_processTerminate.c: Likewise.
  869. * ptw32_threadDestroy.c: Likewise.
  870. * ptw32_threadStart.c: Likewise.
  871. * ptw32_throw.c: Likewise.
  872. * ptw32_timespec.c: Likewise.
  873. * ptw32_tkAssocCreate.c: Likewise.
  874. * ptw32_tkAssocDestroy.c: Likewise.
  875. * rwlock.c: Split file into function segments.
  876. * pthread_rwlockattr_destroy.c: Separated routine from rwlock.c
  877. * pthread_rwlockattr_getpshared.c: Likewise.
  878. * pthread_rwlockattr_init.c: Likewise.
  879. * pthread_rwlockattr_setpshared.c: Likewise.
  880. * ptw32_rwlock_check_need_init.c: Likewise.
  881. * pthread_rwlock_destroy.c: Likewise.
  882. * pthread_rwlock_init.c: Likewise.
  883. * pthread_rwlock_rdlock.c: Likewise.
  884. * pthread_rwlock_tryrdlock.c: Likewise.
  885. * pthread_rwlock_trywrlock.c: Likewise.
  886. * pthread_rwlock_unlock.c: Likewise.
  887. * pthread_rwlock_wrlock.c: Likewise.
  888. 2002-02-10  Ross Johnson  <rpj at setup1.ise.canberra.edu.au
  889. Reduce executable size.
  890. -----------------------
  891. When linking with the static library, only those
  892. routines actually called, either directly or indirectly
  893. should be included.
  894. [Gcc has the -ffunction-segments option to do this but MSVC
  895. doesn't have this feature as far as I can determine. Other
  896. compilers are undetermined as well. - rpj]
  897. * nonportable.c: Split file into function segments.
  898. * np_delay.c: Separated routine from nonportable.c
  899. * np_getw32threadhandle.c: Likewise.
  900. * np_mutexattr_setkind.c: Likewise.
  901. * np_mutexattr_getkind.c: Likewise.
  902. * np_num_processors.c: Likewise.
  903. * np_win32_attach_detach.c: Likewise.
  904. * misc.c: Split file into function segments.
  905. * pthread_equal.c: Separated routine from nonportable.c.
  906. * pthread_getconcurrency.c: Likewise.
  907. * pthread_once.c: Likewise.
  908. * pthread_self.c: Likewise.
  909. * pthread_setconcurrency.c: Likewise.
  910. * ptw32_calloc.c: Likewise.
  911. * ptw32_new.c: Likewise.
  912. * w32_CancelableWait.c: Likewise.
  913. 2002-02-09  Ross Johnson  <rpj at setup1.ise.canberra.edu.au
  914. Reduce executable size.
  915. -----------------------
  916. When linking with the static library, only those
  917. routines actually called, either directly or indirectly
  918. should be included.
  919. [Gcc has the -ffunction-segments option to do this but MSVC
  920. doesn't have this feature as far as I can determine. Other
  921. compilers are undetermined as well. - rpj]
  922. * condvar.c: Split file into function segments.
  923. * pthread_condattr_destroy.c: Separated routine from condvar.c.
  924. * pthread_condattr_getpshared.c: Likewise.
  925. * pthread_condattr_init.c: Likewise.
  926. * pthread_condattr_setpshared.c: Likewise.
  927. * ptw32_cond_check_need_init.c: Likewise.
  928. * pthread_cond_destroy.c: Likewise.
  929. * pthread_cond_init.c: Likewise.
  930. * pthread_cond_signal.c: Likewise.
  931. * pthread_cond_wait.c: Likewise.
  932. 2002-02-07  Alexander Terekhov<TEREKHOV at de.ibm.com>
  933. * nonportable.c (pthread_delay_np): Make a true
  934. cancelation point. Deferred cancels will interrupt the
  935. wait.
  936. 2002-02-07  Ross Johnson  <rpj at setup1.ise.canberra.edu.au
  937. * misc.c (ptw32_new): Add creation of cancelEvent so that
  938. implicit POSIX threads (Win32 threads with a POSIX face)
  939. are cancelable; mainly so that pthread_delay_np doesn't fail
  940. if called from the main thread.
  941. * create.c (pthread_create): Remove creation of cancelEvent
  942. from here; now in ptw32_new().
  943. Reduce executable size.
  944. -----------------------
  945. When linking with the static library, only those
  946. routines actually called, either directly or indirectly
  947. should be included.
  948. [Gcc has the -ffunction-segments option to do this but MSVC
  949. doesn't have this feature as far as I can determine. Other
  950. compilers are undetermined as well. - rpj]
  951. * barrier.c: All routines are now in separate compilation units;
  952. This file is used to congregate the separate modules for
  953. potential inline optimisation and backward build compatibility.
  954. * cancel.c: Likewise.
  955. * pthread_barrierattr_destroy.c: Separated routine from cancel.c.
  956. * pthread_barrierattr_getpshared.c: Likewise.
  957. * pthread_barrierattr_init.c: Likewise.
  958. * pthread_barrierattr_setpshared.c: Likewise.
  959. * pthread_barrier_destroy.c: Likewise.
  960. * pthread_barrier_init.c: Likewise.
  961. * pthread_barrier_wait.c: Likewise.
  962. * pthread_cancel.c: Likewise.
  963. * pthread_setcancelstate.c: Likewise.
  964. * pthread_setcanceltype.c: Likewise.
  965. * pthread_testcancel.c: Likewise.
  966. 2002-02-04  Max Woodbury <mtew at cds.duke.edu>
  967. Reduced name space pollution.
  968. -----------------------------
  969. When the appropriate symbols are defined, the headers
  970. will restrict the definitions of new names. In particular,
  971. it must be possible to NOT include the <windows.h>
  972. header and related definitions with some combination
  973. of symbol definitions. Secondly, it should be possible
  974. that additional definitions should be limited to POSIX 
  975. compliant symbols by the definition of appropriate symbols.
  976. * pthread.h: POSIX conditionals.
  977. * sched.h: POSIX conditionals.
  978. * semaphore.h: POSIX conditionals.
  979. * semaphore.c: Included <limits.h>.
  980. (sem_init): Changed magic 0x7FFFFFFFL to INT_MAX.
  981. (sem_getvalue): Trial version.
  982. Reduce executable size.
  983. -----------------------
  984. When linking with the static library, only those
  985. routines actually called, either directly or indirectly
  986. should be included.
  987. [Gcc has the -ffunction-segments option to do this but MSVC
  988. doesn't have this feature as far as I can determine. Other
  989. compilers are undetermined as well. - rpj]
  990. * semaphore.c: All routines are now in separate compilation units;
  991. This file is used to congregate the separate modules for
  992. potential inline optimisation and backward build compatibility.
  993. * sem_close.c: Separated routine from semaphore.c.
  994. * ptw32_decrease_semaphore.c: Likewise.
  995. * sem_destroy.c: Likewise.
  996. * sem_getvalue.c: Likewise.
  997. * ptw32_increase_semaphore.c: Likewise.
  998. * sem_init.c: Likewise.
  999. * sem_open.c: Likewise.
  1000. * sem_post.c: Likewise.
  1001. * sem_post_multiple.c: Likewise.
  1002. * sem_timedwait.c: Likewise.
  1003. * sem_trywait.c: Likewise.
  1004. * sem_unlink.c: Likewise.
  1005. * sem_wait.c: Likewise.
  1006. 2002-02-04  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1007. The following extends the idea above to the rest of pthreads-win32 - rpj
  1008. * attr.c: All routines are now in separate compilation units;
  1009. This file is used to congregate the separate modules for
  1010. potential inline optimisation and backward build compatibility.
  1011. * pthread_attr_destroy.c: Separated routine from attr.c.
  1012. * pthread_attr_getdetachstate.c: Likewise.
  1013. * pthread_attr_getscope.c: Likewise.
  1014. * pthread_attr_getstackaddr.c: Likewise.
  1015. * pthread_attr_getstacksize.c: Likewise.
  1016. * pthread_attr_init.c: Likewise.
  1017. * pthread_attr_is_attr.c: Likewise.
  1018. * pthread_attr_setdetachstate.c: Likewise.
  1019. * pthread_attr_setscope.c: Likewise.
  1020. * pthread_attr_setstackaddr.c: Likewise.
  1021. * pthread_attr_setstacksize.c: Likewise.
  1022. * pthread.c: Agregation of agregate modules for super-inlineability.
  1023. 2002-02-02  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1024. * cancel.c: Rearranged some code and introduced checks
  1025. to disable cancelation at the start of a thread's cancelation
  1026. run to prevent double cancelation. The main problem
  1027. arises if a thread is canceling and then receives a subsequent
  1028. async cancel request.
  1029. * private.c: Likewise.
  1030. * condvar.c: Place pragmas around cleanup_push/pop to turn
  1031. off inline optimisation (/Obn where n>0 - MSVC only). Various
  1032. optimisation switches in MSVC turn this on, which interferes with
  1033. the way that cleanup handlers are run in C++ EH and SEH
  1034. code. Application code compiled with inline optimisation must
  1035. also wrap cleanup_push/pop blocks with the pragmas, e.g.
  1036.   #pragma inline_depth(0)
  1037.   pthread_cleanup_push(...)
  1038.     ...
  1039.   pthread_cleanup_pop(...)
  1040.   #pragma inline_depth(8)
  1041. * rwlock.c: Likewise.
  1042. * mutex.c: Remove attempts to inline some functions.
  1043. * signal.c: Modify misleading comment.
  1044. 2002-02-01  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1045. * semaphore.c (sem_trywait): Fix missing errno return
  1046. for systems that define NEED_SEM (e.g. early WinCE).
  1047. * mutex.c (pthread_mutex_timedlock): Return ENOTSUP
  1048. for systems that define NEED_SEM since they don't
  1049. have sem_trywait().
  1050. 2002-01-27  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1051. * mutex.c (pthread_mutex_timedlock): New function suggested by
  1052. Alexander Terekhov. The logic required to implement this
  1053. properly came from Alexander, with some collaboration
  1054. with Thomas Pfaff.
  1055. (pthread_mutex_unlock): Wrap the waiters check and sema
  1056. post in a critical section to prevent a race with
  1057. pthread_mutex_timedlock.
  1058. (ptw32_timed_semwait): New function;
  1059. returns a special result if the absolute timeout parameter
  1060. represents a time already passed when called; used by
  1061. pthread_mutex_timedwait(). Have deliberately not reused
  1062. the name "ptw32_sem_timedwait" because they are not the same
  1063. routine.
  1064. * condvar.c (ptw32_cond_timedwait): Use the new sem_timedwait()
  1065. instead of ptw32_sem_timedwait(), which now has a different
  1066. function. See previous.
  1067. * implement.h: Remove prototype for ptw32_sem_timedwait.
  1068. See next.
  1069. (pthread_mutex_t_): Add critical section element for access
  1070. to lock_idx during mutex post-timeout processing.
  1071. * semaphore.h (sem_timedwait): See next.
  1072. * semaphore.c (sem_timedwait): See next.
  1073. * private.c (ptw32_sem_timedwait): Move to semaphore.c
  1074. and rename as sem_timedwait().
  1075. 2002-01-18  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1076. * sync.c (pthread_join): Was getting the exit code from the
  1077. calling thread rather than the joined thread if
  1078. defined(__MINGW32__) && !defined(__MSVCRT__).
  1079. 2002-01-15  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1080. * pthread.h: Unless the build explicitly defines __CLEANUP_SEH,
  1081. __CLEANUP_CXX, or __CLEANUP_C, then the build defaults to
  1082. __CLEANUP_C style cleanup. This style uses setjmp/longjmp
  1083. in the cancelation and thread exit implementations and therefore
  1084. won't do stack unwinding if linked to applications that have it
  1085. (e.g. C++ apps). This is currently consistent with most/all
  1086. commercial Unix POSIX threads implementations.
  1087. * spin.c (pthread_spin_init): Edit renamed function call.
  1088. * nonportable.c (pthread_num_processors_np): New.
  1089. (pthread_getprocessors_np): Renamed to ptw32_getprocessors
  1090. and moved to private.c.
  1091. * private.c (pthread_getprocessors): Moved here from
  1092. nonportable.c.
  1093. * pthread.def (pthread_getprocessors_np): Removed
  1094. from export list.
  1095. * rwlock.c (pthread_rwlockattr_init): New.
  1096. (pthread_rwlockattr_destroy): New.
  1097. (pthread_rwlockattr_getpshared): New.
  1098. (pthread_rwlockattr_setpshared): New.
  1099. 2002-01-14  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1100. * attr.c (pthread_attr_setscope): Fix struct pointer
  1101. indirection error introduced 2002-01-04.
  1102. (pthread_attr_getscope): Likewise.
  1103. 2002-01-12  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1104. * pthread.dsp (SOURCE): Add missing source files.
  1105. 2002-01-08  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1106. * mutex.c (pthread_mutex_trylock): use
  1107. ptw32_interlocked_compare_exchange function pointer
  1108. rather than ptw32_InterlockedCompareExchange() directly
  1109. to retain portability to non-iX86 processors,
  1110. e.g. WinCE etc. The pointer will point to the native
  1111. OS version of InterlockedCompareExchange() if the
  1112. OS supports it (see ChangeLog entry of 2001-10-17).
  1113. 2002-01-07  Thomas Pfaff <tpfaff at gmx.net>, Alexander Terekhov <TEREKHOV at de.ibm.com>
  1114. * mutex.c (pthread_mutex_init): Remove critical
  1115. section calls.
  1116. (pthread_mutex_destroy): Likewise.
  1117. (pthread_mutex_unlock): Likewise.
  1118. (pthread_mutex_trylock): Likewise; uses
  1119. ptw32_InterlockedCompareExchange() to avoid need for
  1120. critical section; library is no longer i386 compatible;
  1121. recursive mutexes now increment the lock count rather
  1122. than return EBUSY; errorcheck mutexes return EDEADLCK
  1123. rather than EBUSY. This behaviour is consistent with the
  1124. Solaris pthreads implementation.
  1125. * implement.h (pthread_mutex_t_): Remove critical
  1126. section element - no longer needed.
  1127. 2002-01-04  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1128. * attr.c (pthread_attr_setscope): Add more error
  1129. checking and actually store the scope value even
  1130. though it's not really necessary.
  1131. (pthread_attr_getscope): Return stored value.
  1132. * implement.h (pthread_attr_t_): Add new scope element.
  1133. * ANNOUNCE: Fix out of date comment next to
  1134. pthread_attr_setscope in conformance section.
  1135. 2001-12-21  Alexander Terekhov <TEREKHOV at de.ibm.com>
  1136. * mutex.c (pthread_mutex_lock): Decrementing lock_idx was
  1137. not thread-safe.
  1138. (pthread_mutex_trylock): Likewise.
  1139. 2001-10-26  prionx@juno.com
  1140. * semaphore.c (sem_init): Fix typo and missing bracket
  1141. in conditionally compiled code. Only older versions of
  1142. WinCE require this code, hence it doesn't normally get
  1143. tested; somehow when sem_t reverted to an opaque struct
  1144. the calloc NULL check was left in the conditionally included
  1145. section.
  1146. (sem_destroy): Likewise, the calloced sem_t wasn't being freed.
  1147. 2001-10-25  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1148. * GNUmakefile (libwsock32): Add to linker flags for
  1149. WSAGetLastError() and WSASetLastError().
  1150. * Makefile (wsock32.lib): Likewise.
  1151. * create.c: Minor mostly inert changes.
  1152. * implement.h (PTW32_MAX): Move into here and renamed
  1153. from sched.h.
  1154. (PTW32_MIN): Likewise.
  1155. * GNUmakefile (TEST_ICE): Define if testing internal
  1156. implementation of InterlockedCompareExchange.
  1157. * Makefile (TEST_ICE): Likewise.
  1158. * private.c (TEST_ICE): Likewise.
  1159. 2001-10-24  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1160. * attr.c (pthread_attr_setstacksize): Quell warning
  1161. from LCC by conditionally compiling the stacksize
  1162. validity check. LCC correctly warns that the condition
  1163. (stacksize < PTHREAD_STACK_MIN) is suspicious
  1164. because STACK_MIN is 0 and stacksize is of type
  1165. size_t (or unsigned int).
  1166. 2001-10-17  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1167. * barrier.c: Move _LONG and _LPLONG defines into
  1168. implement.h; rename to PTW32_INTERLOCKED_LONG and
  1169. PTW32_INTERLOCKED_LPLONG respectively.
  1170. * spin.c: Likewise; ptw32_interlocked_compare_exchange used
  1171. in place of InterlockedCompareExchange directly.
  1172. * global.c (ptw32_interlocked_compare_exchange): Add
  1173. prototype for this new routine pointer to be used when
  1174. InterlockedCompareExchange isn't supported by Windows.
  1175. * nonportable.c (pthread_win32_process_attach_np): Check for
  1176. support of InterlockedCompareExchange in kernel32 and assign its
  1177. address to ptw32_interlocked_compare_exchange if it exists, or
  1178. our own ix86 specific implementation ptw32_InterlockedCompareExchange.
  1179. *private.c (ptw32_InterlockedCompareExchange): An
  1180. implementation of InterlockedCompareExchange() which is
  1181. specific to ix86; written directly in assembler for either
  1182. MSVC or GNU C; needed because Windows 95 doesn't support
  1183. InterlockedCompareExchange().
  1184. * sched.c (sched_get_priority_min): Extend to return
  1185. THREAD_PRIORITY_IDLE.
  1186. (sched_get_priority_max): Extend to return
  1187. THREAD_PRIORITY_CRITICAL.
  1188. 2001-10-15  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1189. * spin.c (pthread_spin_lock): PTHREAD_SPINLOCK_INITIALIZER
  1190. was causing a program fault.
  1191. (pthread_spin_init): Could have alloced memory
  1192. without freeing under some error conditions.
  1193. * mutex.c (pthread_mutex_init): Move memory
  1194. allocation of mutex struct after checking for
  1195. PROCESS_SHARED.
  1196. 2001-10-12  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1197. * spin.c (pthread_spin_unlock): Was not returning
  1198. EPERM if the spinlock was not locked, for multi CPU
  1199. machines.
  1200. 2001-10-08  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1201. * spin.c (pthread_spin_trylock): Was not returning
  1202. EBUSY for multi CPU machines.
  1203. 2001-08-24  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1204. * condvar.c (pthread_cond_destroy): Remove cv element
  1205. that is no longer used.
  1206. * implement.h: Likewise.
  1207. 2001-08-23  Alexander Terekhov <TEREKHOV at de.ibm.com>
  1208. * condvar.c (pthread_cond_destroy): fix bug with
  1209. respect to deadlock in the case of concurrent
  1210. _destroy/_unblock; a condition variable can be destroyed
  1211. immediately after all the threads that are blocked on
  1212. it are awakened.
  1213. 2001-08-23  Phil Frisbie, Jr. <phil at hawksoft.com>
  1214. * tsd.c (pthread_getspecific): Preserve the last
  1215. winsock error [from WSAGetLastError()].
  1216. 2001-07-18  Scott McCaskill <scott at magruder.org>
  1217. * mutex.c (pthread_mutexattr_init): Return ENOMEM
  1218. immediately and don't dereference the NULL pointer
  1219. if calloc fails.
  1220. (pthread_mutexattr_getpshared): Don't dereference
  1221. a pointer that is possibly NULL.
  1222. * barrier.c (pthread_barrierattr_init): Likewise
  1223. (pthread_barrierattr_getpshared): Don't dereference
  1224. a pointer that is possibly NULL.
  1225. * condvar.c (pthread_condattr_getpshared): Don't dereference
  1226. a pointer that is possibly NULL.
  1227. 2001-07-15  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1228. * rwlock.c (pthread_rwlock_wrlock): Is allowed to be
  1229. a cancelation point; re-enable deferred cancelability
  1230. around the CV call.
  1231. 2001-07-10  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1232. * barrier.c: Still more revamping. The exclusive access
  1233. mutex isn't really needed so it has been removed and replaced
  1234. by an InterlockedDecrement(). nSerial has been removed.
  1235. iStep is now dual-purpose. The process shared attribute
  1236. is now stored in the barrier struct.
  1237. * implement.h (pthread_barrier_t_): Lost some/gained one
  1238. elements.
  1239. * private.c (ptw32_threadStart): Removed some comments.
  1240. 2001-07-10  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1241. * barrier.c: Revamped to fix the race condition. Two alternating
  1242. semaphores are used instead of the PulseEvent. Also improved
  1243. overall throughput by returning PTHREAD_BARRIER_SERIAL_THREAD
  1244. to the first waking thread.
  1245. * implement.h (pthread_barrier_t_): Revamped.
  1246. 2001-07-09  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1247. * barrier.c: Fix several bugs in all routines. Now passes
  1248. tests/barrier5.c which is fairly rigorous. There is still
  1249. a non-optimal work-around for a race condition between
  1250. the barrier breeched event signal and event wait. Basically
  1251. the last (signalling) thread to hit the barrier yields
  1252. to allow any other threads, which may have lost the race,
  1253. to complete.
  1254. 2001-07-07  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1255. * barrier.c: Changed synchronisation mechanism to a
  1256. Win32 manual reset Event and use PulseEvent to signal
  1257. waiting threads. If the implementation continued to use
  1258. a semaphore it would require a second semaphore and
  1259. some management to use them alternately as barriers. A
  1260. single semaphore allows threads to cascade from one barrier
  1261. through the next, leaving some threads blocked at the first.
  1262. * implement.h (pthread_barrier_t_): As per above.
  1263. * general: Made a number of other routines inlinable.
  1264. 2001-07-07  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1265. * spin.c: Revamped and working; included static initialiser.
  1266. Now beta level.
  1267. * barrier.c: Likewise.
  1268. * condvar.c: Macro constant change; inline auto init routine.
  1269. * mutex.c: Likewise.
  1270. * rwlock.c: Likewise.
  1271. * private.c: Add support for spinlock initialiser.
  1272. * global.c: Likewise.
  1273. * implement.h: Likewise.
  1274. * pthread.h (PTHREAD_SPINLOCK_INITIALIZER): Fix typo.
  1275. 2001-07-05  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1276. * barrier.c: Remove static initialisation - irrelevent
  1277. for this object.
  1278. * pthread.h (PTHREAD_BARRIER_INITIALIZER): Removed.
  1279. * rwlock.c (pthread_rwlock_wrlock): This routine is
  1280. not a cancelation point - disable deferred
  1281. cancelation around call to pthread_cond_wait().
  1282. 2001-07-05  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1283. * spin.c: New module implementing spin locks.
  1284. * barrier.c: New module implementing barriers.
  1285. * pthread.h (_POSIX_SPIN_LOCKS): defined.
  1286. (_POSIX_BARRIERS): Defined.
  1287. (pthread_spin_*): Defined.
  1288. (pthread_barrier*): Defined.
  1289. (PTHREAD_BARRIER_SERIAL_THREAD): Defined.
  1290. * implement.h (pthread_spinlock_t_): Defined.
  1291. (pthread_barrier_t_): Defined.
  1292. (pthread_barrierattr_t_): Defined.
  1293. * mutex.c (pthread_mutex_lock): Return with the error
  1294. if an auto-initialiser initialisation fails.
  1295. * nonportable.c (pthread_getprocessors_np): New; gets the
  1296. number of available processors for the current process.
  1297. 2001-07-03  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1298. * pthread.h (_POSIX_READER_WRITER_LOCKS): Define it
  1299. if not already defined.
  1300. 2001-07-01  Alexander Terekhov <TEREKHOV at de.ibm.com>
  1301. * condvar.c: Fixed lost signal bug reported by Timur Aydin
  1302. (taydin@snet.net).
  1303. [RPJ (me) didn't translate the original algorithm
  1304. correctly.]
  1305. * semaphore.c: Added sem_post_multiple; this is a useful
  1306. routine, but it doesn't appear to be standard. For now it's
  1307. not an exported function.
  1308. 2001-06-25  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1309. * create.c (pthread_create): Add priority inheritance
  1310. attributes.
  1311. * mutex.c (pthread_mutex_lock): Remove some overhead for
  1312. PTHREAD_MUTEX_NORMAL mutex types. Specifically, avoid
  1313. calling pthread_self() and pthread_equal() to check/set
  1314. the mutex owner. Introduce a new pseudo owner for this
  1315. type. Test results suggest increases in speed of up to
  1316. 90% for non-blocking locks.
  1317. This is the default type of mutex used internally by other
  1318. synchronising objects, ie. condition variables and
  1319. read-write locks. The test rwlock7.c shows about a
  1320. 30-35% speed increase over snapshot 2001-06-06. The
  1321. price of this is that the application developer
  1322. must ensure correct behaviour, or explicitly set the
  1323. mutex to a safer type such as PTHREAD_MUTEX_ERRORCHECK.
  1324. For example, PTHREAD_MUTEX_NORMAL (or PTHREAD_MUTEX_DEFAULT)
  1325. type mutexes will not return an error if a thread which is not
  1326. the owner calls pthread_mutex_unlock. The call will succeed
  1327. in unlocking the mutex if it is currently locked, but a
  1328. subsequent unlock by the true owner will then fail with EPERM.
  1329. This is however consistent with some other implementations.
  1330. (pthread_mutex_unlock): Likewise.
  1331. (pthread_mutex_trylock): Likewise.
  1332. (pthread_mutex_destroy): Likewise.
  1333. * attr.c (pthread_attr_init): PTHREAD_EXPLICIT_SCHED is the
  1334. default inheritance attribute; THREAD_PRIORITY_NORMAL is
  1335. the default priority for new threads.
  1336. * sched.c (pthread_attr_setschedpolicy): Added routine.
  1337. (pthread_attr_getschedpolicy): Added routine.
  1338. (pthread_attr_setinheritsched): Added routine.
  1339. (pthread_attr_getinheritsched): Added routine.
  1340. * pthread.h (sched_rr_set_interval): Added as a macro;
  1341. returns -1 with errno set to ENOSYS.
  1342. 2001-06-23  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1343. *sched.c (pthread_attr_setschedparam): Add priority range
  1344. check.
  1345. (sched_setscheduler): New function; checks for a valid
  1346. pid and policy; checks for permission to set information
  1347. in the target process; expects pid to be a Win32 process ID,
  1348. not a process handle; the only scheduler policy allowed is
  1349. SCHED_OTHER.
  1350. (sched_getscheduler): Likewise, but checks for permission
  1351. to query.
  1352. * pthread.h (SCHED_*): Moved to sched.h as defined in the
  1353. POSIX standard.
  1354. * sched.h (SCHED_*): Moved from pthread.h.
  1355. (pid_t): Defined if necessary.
  1356. (sched_setscheduler): Defined.
  1357. (sched_getscheduler): Defined.
  1358. * pthread.def (sched_setscheduler): Exported.
  1359. (sched_getscheduler): Likewise.
  1360. 2001-06-23  Ralf Brese <Ralf.Brese at pdb4.siemens.de>
  1361. * create.c (pthread_create): Set thread priority from
  1362. thread attributes.
  1363. 2001-06-18  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1364. * Made organisational-only changes to UWIN additions.
  1365. * dll.c (dllMain): Moved UWIN process attach code
  1366. to pthread_win32_process_attach_np(); moved
  1367. instance of pthread_count to global.c.
  1368. * global.c (pthread_count): Moved from dll.c.
  1369. * nonportable.c (pthread_win32_process_attach_np):
  1370. Moved _UWIN code to here from dll.c.
  1371. * implement.h (pthread_count): Define extern int.
  1372. * create.c (pthread_count): Remove extern int.
  1373. * private.c (pthread_count): Likewise.
  1374. * exit.c (pthread_count): Likewise.
  1375. 2001-06-18  David Korn <dgk at research.att.com>
  1376. * dll.c: Added changes necessary to work with UWIN.
  1377. * create.c: Likewise.
  1378. * pthread.h: Likewise.
  1379. * misc.c: Likewise.
  1380. * exit.c: Likewise.
  1381. * private.c: Likewise.
  1382. * implement.h: Likewise.
  1383. There is some room at the start of struct pthread_t_
  1384. to implement the signal semantics in UWIN's posix.dll
  1385. although this is not yet complete.
  1386. * Nmakefile: Compatible with UWIN's Nmake utility.
  1387. * Nmakefile.tests: Likewise - for running the tests.
  1388. 2001-06-08  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1389. * semaphore.h (sem_t): Fixed for compile and test.
  1390. * implement.h (sem_t_): Likewise.
  1391. * semaphore.c: Likewise.
  1392. * private.c (ptw32_sem_timedwait): Updated to use new
  1393. opaque sem_t.
  1394. 2001-06-06  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1395. * semaphore.h (sem_t): Is now an opaque pointer;
  1396. moved actual definition to implement.h.
  1397. * implement.h (sem_t_): Move here from semaphore.h;
  1398. was the definition of sem_t.
  1399. * semaphore.c: Wherever necessary, changed use of sem
  1400. from that of a pointer to a pointer-pointer; added
  1401. extra checks for a valid sem_t; NULL sem_t when
  1402. it is destroyed; added extra checks when creating
  1403. and destroying sem_t elements in the NEED_SEM
  1404. code branches; changed from using a pthread_mutex_t
  1405. ((*sem)->mutex) to CRITICAL_SECTION ((*sem)->sem_lock_cs)
  1406. in NEED_SEM branches for access serialisation.
  1407. 2001-06-06  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1408. * mutex.c (pthread_mutexattr_init): Remove 
  1409. ptw32_mutex_default_kind.
  1410. 2001-06-05  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1411. * nonportable.c (pthread_mutex_setdefaultkind_np):
  1412. Remove - should not have been included in the first place.
  1413. (pthread_mutex_getdefaultkind_np): Likewise.
  1414. * global.c (ptw32_mutex_default_kind): Likewise.
  1415. * mutex.c (pthread_mutex_init): Remove use of
  1416. ptw32_mutex_default_kind.
  1417. * pthread.h (pthread_mutex_setdefaultkind_np): Likewise.
  1418. (pthread_mutex_getdefaultkind_np): Likewise.
  1419. * pthread.def (pthread_mutexattr_setkind_np): Added.
  1420. (pthread_mutexattr_getkind_np): Likewise.
  1421. * README: Many changes that should have gone in before
  1422. the last snapshot.
  1423. * README.NONPORTABLE: New - referred to by ANNOUNCE
  1424. but never created; documents the non-portable routines
  1425. included in the library - moved from README with new
  1426. routines added.
  1427. * ANNOUNCE (pthread_mutexattr_setkind_np): Added to
  1428. compliance list.
  1429. (pthread_mutexattr_getkind_np): Likewise.
  1430. 2001-06-04  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1431. * condvar.c: Add original description of the algorithm as
  1432. developed by Terekhov and Thomas, plus reference to
  1433. README.CV.
  1434. 2001-06-03  Alexander Terekhov <TEREKHOV at de.ibm.com>, Louis Thomas <lthomas at arbitrade.com>
  1435. * condvar.c (pthread_cond_init): Completely revamped.
  1436. (pthread_cond_destroy): Likewise.
  1437. (ptw32_cond_wait_cleanup): Likewise.
  1438. (ptw32_cond_timedwait): Likewise.
  1439. (ptw32_cond_unblock): New general signaling routine.
  1440. (pthread_cond_signal): Now calls ptw32_cond_unblock.
  1441. (pthread_cond_broadcast): Likewise.
  1442. * implement.h (pthread_cond_t_): Revamped.
  1443. * README.CV: New; explanation of the above changes.
  1444. 2001-05-30  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1445. * pthread.h (rand_r): Fake using _seed argument to quell
  1446. compiler warning (compiler should optimise this away later).
  1447. * GNUmakefile (OPT): Leave symbolic information out of the library
  1448. and increase optimisation level - for smaller faster prebuilt
  1449. dlls.
  1450. 2001-05-29  Milan Gardian <Milan.Gardian at LEIBINGER.com>
  1451. * Makefile: fix typo.
  1452. * pthreads.h: Fix problems with stdcall/cdecl conventions, in particular
  1453. remove the need for PT_STDCALL everywhere; remove warning supression.
  1454. * (errno): Fix the longstanding "inconsistent dll linkage" problem
  1455. with errno; now also works with /MD debugging libs - 
  1456. warnings emerged when compiling pthreads library with /MD (or /MDd)
  1457. compiler switch, instead of /MT (or /MTd) (i.e. when compiling pthreads
  1458. using Multithreaded DLL CRT instead of Multithreaded statically linked
  1459. CRT).
  1460. * create.c (pthread_create): Likewise; fix typo.
  1461. * private.c (ptw32_threadStart): Eliminate use of terminate() which doesn't
  1462. throw exceptions.
  1463. * Remove unnecessary #includes from a number of modules -
  1464. [I had to #include malloc.h in implement.h for gcc - rpj].
  1465. 2001-05-29  Thomas Pfaff <tpfaff at gmx.net>
  1466. * pthread.h (PTHREAD_MUTEX_DEFAULT): New; equivalent to
  1467. PTHREAD_MUTEX_DEFAULT_NP.
  1468. * (PTHREAD_MUTEX_NORMAL): Similarly.
  1469. * (PTHREAD_MUTEX_ERRORCHECK): Similarly.
  1470. * (PTHREAD_MUTEX_RECURSIVE): Similarly.
  1471. * (pthread_mutex_setdefaultkind_np): New; Linux compatibility stub
  1472. for pthread_mutexattr_settype.
  1473. * (pthread_mutexattr_getkind_np): New; Linux compatibility stub
  1474. for pthread_mutexattr_gettype.
  1475. * mutex.c (pthread_mutexattr_settype): New; allow
  1476. the following types of mutex:
  1477.   PTHREAD_MUTEX_DEFAULT_NP
  1478.   PTHREAD_MUTEX_NORMAL_NP
  1479.   PTHREAD_MUTEX_ERRORCHECK_NP
  1480.   PTHREAD_MUTEX_RECURSIVE_NP
  1481. * Note that PTHREAD_MUTEX_DEFAULT is equivalent to
  1482. PTHREAD_MUTEX_NORMAL - ie. mutexes should no longer
  1483. be recursive by default, and a thread will deadlock if it
  1484. tries to relock a mutex it already owns. This is inline with
  1485. other pthreads implementations.
  1486. * (pthread_mutex_lock): Process the lock request
  1487. according to the mutex type.
  1488. * (pthread_mutex_init): Eliminate use of Win32 mutexes as the
  1489. basis of POSIX mutexes - instead, a combination of one critical section
  1490. and one semaphore are used in conjunction with Win32 Interlocked* routines.
  1491. * (pthread_mutex_destroy): Likewise.
  1492. * (pthread_mutex_lock): Likewise.
  1493. * (pthread_mutex_trylock): Likewise.
  1494. * (pthread_mutex_unlock): Likewise.
  1495. * Use longjmp/setjmp to implement cancelation when building the library
  1496. using a C compiler which doesn't support exceptions, e.g. gcc -x c (note
  1497. that gcc -x c++ uses exceptions).
  1498. * Also fixed some of the same typos and eliminated PT_STDCALL as
  1499. Milan Gardian's patches above.
  1500. 2001-02-07  Alexander Terekhov <TEREKHOV at de.ibm.com>
  1501. * rwlock.c: Revamped.
  1502. * implement.h (pthread_rwlock_t_): Redefined.
  1503. This implementation does not have reader/writer starvation problem.
  1504. Rwlock attempts to behave more like a normal mutex with
  1505. races and scheduling policy determining who is more important;
  1506. It also supports recursive locking,
  1507. has less synchronization overhead (no broadcasts at all,
  1508. readers are not blocked on any condition variable) and seem to
  1509. be faster than the current implementation [W98 appears to be
  1510. approximately 15 percent faster at least - on top of speed increase
  1511. from Thomas Pfaff's changes to mutex.c - rpj].
  1512. 2000-12-29  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1513. * Makefile: Back-out "for" loops which don't work.
  1514. * GNUmakefile: Remove the fake.a target; add the "realclean"
  1515. target; don't remove built libs under the "clean" target.
  1516. * config.h: Add a guard against multiple inclusion.
  1517. * semaphore.h: Add some defines from config.h to make
  1518. semaphore.h independent of config.h when building apps.
  1519. * pthread.h (_errno): Back-out previous fix until we know how to
  1520. fix it properly.
  1521. * implement.h (lockCount): Add missing element to pthread_mutex_t_.
  1522. * sync.c (pthread_join): Spelling fix in comment.
  1523. * private.c (ptw32_threadStart): Reset original termination
  1524. function (C++).
  1525. (ptw32_threadStart): Cleanup detached threads early in case
  1526. the library is statically linked.
  1527. (ptw32_callUserDestroyRoutines): Remove [SEH] __try block from
  1528. destructor call so that unhandled exceptions will be passed through
  1529. to the  system; call terminate() from [C++] try block for the same
  1530. reason.
  1531. * tsd.c (pthread_getspecific): Add comment.
  1532. * mutex.c (pthread_mutex_init): Initialise new elements in
  1533. pthread_mutex_t.
  1534. (pthread_mutex_unlock): Invert "pthread_equal()" test.
  1535. 2000-12-28  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1536. * semaphore.c (mode_t): Use ifndef HAVE_MODE_T to include definition.
  1537. * config.h.in (HAVE_MODE_T): Added.
  1538. (_UWIN): Start adding defines for the UWIN package.
  1539. * private.c (ptw32_threadStart): Unhandled exceptions are
  1540. now passed through to the system to deal with. This is consistent
  1541. with normal Windows behaviour. C++ applications may use
  1542. set_terminate() to override the default behaviour which is
  1543. to call ptw32_terminate(). Ptw32_terminate() cleans up some
  1544. POSIX thread stuff before calling the system default function
  1545. which calls abort(). The users termination function should conform
  1546. to standard C++ semantics which is to not return. It should
  1547. exit the thread (call pthread_exit()) or exit the application.
  1548. * private.c (ptw32_terminate): Added as the default set_terminate()
  1549. function. It calls the system default function after cleaning up
  1550. some POSIX thread stuff.
  1551. * implement.h (ptw32_try_enter_critical_section): Move
  1552. declaration.
  1553. * global.c (ptw32_try_enter_critical_section): Moved
  1554. from dll.c.
  1555. * dll.c: Move process and thread attach/detach code into
  1556. functions in nonportable.c.
  1557. * nonportable.c (pthread_win32_process_attach_np): Process
  1558. attach code from dll.c is now available to static linked
  1559. applications.
  1560. * nonportable.c (pthread_win32_process_detach_np): Likewise.
  1561. * nonportable.c (pthread_win32_thread_attach_np): Likewise.
  1562. * nonportable.c (pthread_win32_thread_detach_np): Likewise.
  1563. * pthread.h: Add new non-portable prototypes for static
  1564. linked applications.
  1565. * GNUmakefile (OPT): Increase optimisation flag and remove
  1566. debug info flag.
  1567. * pthread.def: Add new non-portable exports for static
  1568. linked applications.
  1569. 2000-12-11  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1570. * FAQ: Update Answer 6 re getting a fully working
  1571. Mingw32 built library.
  1572. 2000-10-10  Steven Reddie <smr at essemer.com.au>
  1573.  
  1574.         * misc.c (pthread_self): Restore Win32 "last error"
  1575.         cleared by TlsGetValue() call in
  1576.         pthread_getspecific()
  1577.  
  1578. 2000-09-20  Arthur Kantor <akantor at bexusa.com>
  1579.  
  1580.         * mutex.c (pthread_mutex_lock): Record the owner
  1581.         of the mutex. This requires also keeping count of
  1582.         recursive locks ourselves rather than leaving it
  1583.         to Win32 since we need to know when to NULL the
  1584.         thread owner when the mutex is unlocked.
  1585.         (pthread_mutex_trylock): Likewise.
  1586.         (pthread_mutex_unlock): Check that the calling
  1587.         thread owns the mutex, decrement the recursive
  1588.         lock count, and NULL the owner if zero. Return
  1589.         EPERM if the mutex is owned by another thread.
  1590.         * implement.h (pthread_mutex_t_): Add ownerThread
  1591.         and lockCount members.
  1592. 2000-09-13  Jef Gearhart <jgearhart at tpssys.com>
  1593. * mutex.c (pthread_mutex_init): Call
  1594. TryEnterCriticalSection through the pointer
  1595. rather than directly so that the dll can load
  1596. on Windows versions that can't resolve the
  1597. function, eg. Windows 95
  1598. 2000-09-09  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1599. * pthread.h (ctime_r): Fix arg.
  1600. 2000-09-08  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1601. * GNUmakefile(_WIN32_WINNT=0x400): Define in CFLAGS;
  1602. doesn't seem to be needed though.
  1603. * cancel.c (pthread_cancel): Must get "self" through
  1604. calling pthread_self() which will ensure a POSIX thread
  1605. struct is built for non-POSIX threads; return an error
  1606. if this fails
  1607. - Ollie Leahy <ollie at mpt.ie>
  1608. (pthread_setcancelstate): Likewise.
  1609. (pthread_setcanceltype): Likewise.
  1610. * misc.c (ptw32_cancelable_wait): Likewise.
  1611. * private.c (ptw32_tkAssocCreate): Remove unused #if 0
  1612. wrapped code.
  1613. * pthread.h (ptw32_get_exception_services_code):
  1614. Needed to be forward declared unconditionally.
  1615. 2000-09-06  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1616. * cancel.c (pthread_cancel): If called from the main
  1617. thread "self" would be NULL; get "self" via pthread_self()
  1618. instead of directly from TLS so that an implicit
  1619. pthread object is created.
  1620. * misc.c (pthread_equal): Strengthen test for NULLs.
  1621. 2000-09-02  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1622. * condvar.c (ptw32_cond_wait_cleanup): Ensure that all
  1623. waking threads check if they are the last, and notify
  1624. the broadcaster if so - even if an error occurs in the
  1625. waiter.
  1626. * semaphore.c (_decrease_semaphore): Should be
  1627. a call to ptw32_decrease_semaphore.
  1628. (_increase_semaphore): Should be a call to
  1629. ptw32_increase_semaphore.
  1630. * misc.c (ptw32_cancelable_wait): Renamed from
  1631. CancelableWait.
  1632. * rwlock.c (_rwlock_check*): Renamed to
  1633. ptw32_rwlock_check*.
  1634. * mutex.c (_mutex_check*): Renamed to ptw32_mutex_check*.
  1635. * condvar.c (cond_timed*): Renamed to ptw32_cond_timed*.
  1636. (_cond_check*): Renamed to ptw32_cond_check*.
  1637. (cond_wait_cleanup*): Rename to ptw32_cond_wait_cleanup*.
  1638. (ptw32_cond_timedwait): Add comments.
  1639. 2000-08-22  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1640. * private.c (ptw32_throw): Fix exception test;
  1641. move exceptionInformation declaration.
  1642. * tsd.c (pthread_key_create): newkey wrongly declared.
  1643. * pthread.h: Fix comment block.
  1644. 2000-08-18  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1645. * mutex.c (pthread_mutex_destroy): Check that the mutex isn't
  1646. held; invalidate the mutex as early as possible to avoid
  1647. contention; not perfect - FIXME!
  1648. * rwlock.c (pthread_rwlock_init): Remove redundant assignment
  1649. to "rw".
  1650. (pthread_rwlock_destroy): Invalidate the rwlock before
  1651. freeing up any of it's resources - to avoid contention.
  1652. * private.c (ptw32_tkAssocCreate): Change assoc->lock
  1653. to use a dynamically initialised mutex - only consumes
  1654. a W32 mutex or critical section when first used,
  1655. not before.
  1656. * mutex.c (pthread_mutex_init): Remove redundant assignment
  1657. to "mx".
  1658. (pthread_mutexattr_destroy): Set attribute to NULL
  1659. before freeing it's memory - to avoid contention.
  1660. * implement.h (PTW32_EPS_CANCEL/PTW32_EPS_EXIT):
  1661. Must be defined for all compilers - used as generic
  1662. exception selectors by ptw32_throw().
  1663. * Several: Fix typos from scripted edit session
  1664. yesterday.
  1665. * nonportable.c (pthread_mutexattr_setforcecs_np):
  1666. Moved this function from mutex.c.
  1667. (pthread_getw32threadhandle_np): New function to
  1668. return the win32 thread handle that the POSIX
  1669. thread is using.
  1670. * mutex.c (pthread_mutexattr_setforcecs_np):
  1671. Moved to new file "nonportable.c".
  1672. * pthread.h (PTW32_BUILD): Only redefine __except
  1673. and catch compiler keywords if we aren't building
  1674. the library (ie. PTW32_BUILD is not defined) - 
  1675. this is safer than defining and then undefining
  1676. if not building the library.
  1677. * implement.h: Remove __except and catch undefines.
  1678. * Makefile (CFLAGS): Define PTW32_BUILD.
  1679. * GNUmakefile (CFLAGS): Define PTW32_BUILD.
  1680. * All appropriate: Change Pthread_exception* to
  1681. ptw32_exception* to be consistent with internal
  1682. identifier naming.
  1683. * private.c (ptw32_throw): New function to provide
  1684. a generic exception throw for all internal
  1685. exceptions and EH schemes.
  1686. (ptw32_threadStart): pthread_exit() value is now
  1687. returned via the thread structure exitStatus
  1688. element.
  1689. * exit.c (pthread_exit): pthread_exit() value is now
  1690. returned via the thread structure exitStatus
  1691. element.
  1692. * cancel.c (ptw32_cancel_self): Now uses ptw32_throw.
  1693. (pthread_setcancelstate): Ditto.
  1694. (pthread_setcanceltype): Ditto.
  1695. (pthread_testcancel): Ditto.
  1696. (pthread_cancel): Ditto.
  1697. * misc.c (CancelableWait): Ditto.
  1698. * exit.c (pthread_exit): Ditto.
  1699. * All applicable: Change PTW32_ prefix to
  1700. PTW32_ prefix to remove leading underscores
  1701. from private library identifiers.
  1702. 2000-08-17  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1703. * All applicable: Change _pthread_ prefix to
  1704. ptw32_ prefix to remove leading underscores
  1705. from private library identifiers (single
  1706. and double leading underscores are reserved in the
  1707. ANSI C standard for compiler implementations).
  1708. * tsd.c (pthread_create_key): Initialise temporary
  1709. key before returning it's address to avoid race
  1710. conditions.
  1711. 2000-08-13  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1712. * errno.c: Add _MD precompile condition; thus far
  1713. had no effect when using /MD compile option but I
  1714. thnk it should be there.
  1715. * exit.c: Add __cplusplus to various #if lines;
  1716. was compiling SEH code even when VC++ had
  1717. C++ compile options.
  1718. * private.c: ditto.
  1719. * create.c (pthread_create): Add PT_STDCALL macro to
  1720. function pointer arg in _beginthread().
  1721. * pthread.h: PT_STDCALL really does need to be defined
  1722. in both this and impliment.h; don't set it to __cdecl
  1723. - this macro is only used to extend function pointer
  1724. casting for functions that will be passed as parameters.
  1725. (~PThreadCleanup): add cast and group expression.
  1726. (_errno): Add _MD compile conditional.
  1727. (PtW32NoCatchWarn): Change pragma message.
  1728. * implement.h: Move and change PT_STDCALL define.
  1729. * need_errno.h: Add _MD to compilation conditional.
  1730. * GNUmakefile: Substantial rewrite for new naming
  1731. convention; set for nil optimisation (turn it up
  1732. when we have a working library build; add target
  1733. "fake.a" to build a libpthreadw32.a from the VC++
  1734. built DLL pthreadVCE.dll.
  1735. * pthread.def (LIBRARY): Don't specify in the .def
  1736. file - it is specified on the linker command line
  1737. since we now use the same .def file for variously
  1738. named .dlls.
  1739. * Makefile: Substantial rewrite for new naming
  1740. convention; default nmake target only issues a
  1741. help message; run nmake with specific target
  1742. corresponding to the EH scheme being used.
  1743. * README: Update information; add naming convention
  1744. explanation.
  1745. * ANNOUNCE: Update information.
  1746. 2000-08-12  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1747. * pthread.h: Add compile-time message when using
  1748. MSC_VER compiler and C++ EH to warn application
  1749. programmers to use PtW32Catch instead of catch(...)
  1750. if they want cancelation and pthread_exit to work.
  1751. * implement.h: Remove #include <semaphore.h>; we
  1752. use our own local semaphore.h.
  1753. 2000-08-10  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1754. * cleanup.c (pthread_pop_cleanup): Remove _pthread
  1755. prefix from __except and catch keywords; implement.h
  1756. now simply undefines ptw32__except and
  1757. ptw32_catch if defined; VC++ was not textually
  1758. substituting ptw32_catch etc back to catch as
  1759. it was redefined; the reason for using the prefixed
  1760. version was to make it clear that it was not using
  1761. the pthread.h redefined catch keyword.
  1762. * private.c (ptw32_threadStart): Ditto.
  1763. (ptw32_callUserDestroyRoutines): Ditto.
  1764. * implement.h (ptw32__except): Remove #define.
  1765. (ptw32_catch): Remove #define.
  1766. * GNUmakefile (pthread.a): New target to build
  1767. libpthread32.a from pthread.dll using dlltool.
  1768. * buildlib.bat: Duplicate cl commands with args to
  1769. build C++ EH version of pthread.dll; use of .bat
  1770. files is redundant now that nmake compatible
  1771. Makefile is included; used as a kludge only now.
  1772. * Makefile: Localise some macros and fix up the clean:
  1773. target to extend it and work properly.
  1774. * CONTRIBUTORS: Add contributors.
  1775. * ANNOUNCE: Updated.
  1776. * README: Updated.
  1777. 2000-08-06  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1778. * pthread.h: Remove #warning - VC++ doesn't accept it.
  1779. 2000-08-05  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1780. * pthread.h (PtW32CatchAll): Add macro. When compiling
  1781. applications using VC++ with C++ EH rather than SEH
  1782. 'PtW32CatchAll' must be used in place of any 'catch( ... )'
  1783. if the application wants pthread cancelation or
  1784. pthread_exit() to work.
  1785. 2000-08-03  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1786. * pthread.h: Add a base class ptw32_exception for
  1787. library internal exceptions and change the "catch"
  1788. re-define macro to use it.
  1789. 2000-08-02  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1790. * GNUmakefile (CFLAGS): Add -mthreads.
  1791. Add new targets to generate cpp and asm output.
  1792. * sync.c (pthread_join): Remove dead code.
  1793. 2000-07-25  Tristan Savatier <tristan at mpegtv.com>
  1794. * sched.c (sched_get_priority_max): Handle different WinCE and
  1795. Win32 priority values together.
  1796. (sched_get_priority_min): Ditto.
  1797. 2000-07-25  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1798. * create.c (pthread_create): Force new threads to wait until
  1799. pthread_create has the new thread's handle; we also retain
  1800. a local copy of the handle for internal use until
  1801. pthread_create returns.
  1802. * private.c (ptw32_threadStart): Initialise ei[].
  1803. (ptw32_threadStart): When beginthread is used to start the
  1804. thread, force waiting until the creator thread had the 
  1805. thread handle.
  1806. * cancel.c (ptw32_cancel_thread): Include context switch
  1807. code for defined(_X86_) environments in addition to _M_IX86.
  1808. * rwlock.c (pthread_rwlock_destroy): Assignment changed
  1809. to avoid compiler warning.
  1810. * private.c (ptw32_get_exception_services_code): Cast
  1811. NULL return value to avoid compiler warning.
  1812. * cleanup.c (pthread_pop_cleanup): Initialise "cleanup" variable
  1813. to avoid compiler warnings.
  1814. * misc.c (ptw32_new): Change "new" variable to "t" to avoid
  1815. confusion with the C++ keyword of the same name.
  1816. * condvar.c (cond_wait_cleanup): Initialise lastWaiter variable.
  1817. (cond_timedwait): Remove unused local variables. to avoid
  1818. compiler warnings.
  1819. * dll.c (dllMain): Remove 2000-07-21 change - problem
  1820. appears to be in pthread_create().
  1821. 2000-07-22  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1822. * tsd.c (pthread_key_create): If a destructor was given
  1823. and the pthread_mutex_init failed, then would try to
  1824. reference a NULL pointer (*key); eliminate this section of
  1825. code by using a dynamically initialised mutex
  1826. (PTHREAD_MUTEX_INITIALIZER).
  1827. * tsd.c (pthread_setspecific): Return an error if
  1828. unable to set the value; simplify cryptic conditional.
  1829. * tsd.c (pthread_key_delete): Locking threadsLock relied
  1830. on mutex_lock returning an error if the key has no destructor.
  1831. ThreadsLock is only initialised if the key has a destructor.
  1832. Making this mutex a static could reduce the number of mutexes
  1833. used by an application since it is actually created only at
  1834. first use and it's often destroyed soon after.
  1835. 2000-07-22  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1836. * FAQ: Added Q5 and Q6.
  1837. 2000-07-21  David Baggett <dmb at itasoftware.com>
  1838. * dll.c: Include resource leakage work-around. This is a
  1839. partial FIXME which doesn't stop all leakage. The real
  1840. problem needs to be found and fixed.
  1841. 2000-07-21  Ross Johnson  <rpj at setup1.ise.canberra.edu.au>
  1842. * create.c (pthread_create): Set threadH to 0 (zero)
  1843. everywhere. Some assignments were using NULL. Maybe
  1844. it should be NULL everywhere - need to check. (I know
  1845. they are nearly always the same thing - but not by
  1846. definition.)
  1847. * misc.c (pthread_self): Try to catch NULL thread handles
  1848. at the point where they might be generated, even though
  1849. they should always be valid at this point.
  1850. * tsd.c (pthread_setspecific): return an error value if
  1851. pthread_self() returns NULL.
  1852. * sync.c (pthread_join): return an error value if
  1853. pthread_self() returns NULL.
  1854. * signal.c (pthread_sigmask): return an error value if
  1855. pthread_self() returns NULL.
  1856. 2000-03-02  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1857. * attr.c (pthread_attr_init): Set default stacksize to zero (0)
  1858. rather than PTHREAD_STACK_MIN even though these are now the same.
  1859. * pthread.h (PTHREAD_STACK_MIN): Lowered to 0.
  1860. 2000-01-28  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1861. * mutex.c (pthread_mutex_init): Free mutex if it has been alloced;
  1862. if critical sections can be used instead of Win32 mutexes, test
  1863. that the critical section works and return an error if not.
  1864. 2000-01-07  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1865. * cleanup.c (pthread_pop_cleanup): Include SEH code only if MSC is not
  1866. compiling as C++.
  1867. (pthread_push_cleanup): Include SEH code only if MSC is not
  1868. compiling as C++.
  1869. * pthread.h: Include SEH code only if MSC is not
  1870. compiling as C++.
  1871. * implement.h: Include SEH code only if MSC is not
  1872. compiling as C++.
  1873. * cancel.c (ptw32_cancel_thread): Add _M_IX86 check.
  1874. (pthread_testcancel): Include SEH code only if MSC is not
  1875. compiling as C++.
  1876. (ptw32_cancel_self): Include SEH code only if MSC is not
  1877. compiling as C++.
  1878. 2000-01-06  Erik Hensema <erik.hensema at group2000.nl>
  1879. * Makefile: Remove inconsistencies in 'cl' args
  1880. 2000-01-04  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1881. * private.c (ptw32_get_exception_services_code): New; returns
  1882. value of EXCEPTION_PTW32_SERVICES.
  1883. (ptw32_processInitialize): Remove initialisation of
  1884. ptw32_exception_services which is no longer needed.
  1885. * pthread.h (ptw32_exception_services): Remove extern.
  1886. (ptw32_get_exception_services_code): Add function prototype;
  1887. use this to return EXCEPTION_PTW32_SERVICES value instead of
  1888. using the ptw32_exception_services variable which I had
  1889. trouble exporting through pthread.def.
  1890. * global.c (ptw32_exception_services): Remove declaration.
  1891. 1999-11-22  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1892. * implement.h: Forward declare ptw32_new();
  1893. * misc.c (ptw32_new): New; alloc and initialise a new pthread_t.
  1894. (pthread_self): New thread struct is generated  by new routine
  1895. ptw32_new().
  1896. * create.c (pthread_create): New thread struct is generated
  1897. by new routine ptw32_new().
  1898. 1999-11-21  Ross Johnson  <rpj at special.ise.canberra.edu.au>
  1899. * global.c (ptw32_exception_services): Declare new variable. 
  1900. * private.c (ptw32_threadStart): Destroy thread's
  1901. cancelLock mutex; make 'catch' and '__except' usageimmune to
  1902. redfinitions in pthread.h.