NOTE: The comments in this file relate to the original WinCE port | |
done by Tristan Savatier. The semaphore routines have been | |
completely rewritten since (2005-04-25), having been progressively | |
broken more and more by changes to the library. All of the semaphore | |
routines implemented for W9x/WNT/2000 and up should now also work for | |
WinCE. Also, pthread_mutex_timedlock should now work. [RPJ] | |
---- | |
Some interesting news: | |
I have been able to port pthread-win32 to Windows-CE, | |
which uses a subset of the WIN32 API. | |
Since we intend to keep using pthread-win32 for our | |
Commercial WinCE developments, I would be very interested | |
if WinCE support could be added to the main source tree | |
of pthread-win32. Also, I would like to be credited | |
for this port :-) | |
Now, here is the story... | |
The port was performed and tested on a Casio "Cassiopeia" | |
PalmSize PC, which runs a MIP processor. The OS in the | |
Casio is WinCE version 2.11, but I used VC++ 6.0 with | |
the WinCE SDK for version 2.01. | |
I used pthread-win32 to port a heavily multithreaded | |
commercial application (real-time MPEG video player) | |
from Linux to WinCE. I consider the changes that | |
I have done to be quite well tested. | |
Overall the modifications that we had to do are minor. | |
The WinCE port were based on pthread-win32-snap-1999-05-30, | |
but I am certain that they can be integrated very easiely | |
to more recent versions of the source. | |
I have attached the modified source code: | |
pthread-win32-snap-1999-05-30-WinCE. | |
All the changes do not affect the code compiled on non-WinCE | |
environment, provided that the macros used for WinCE compilation | |
are not used, of course! | |
Overall description of the WinCE port: | |
------------------------------------- | |
Most of the changes had to be made in areas where | |
pthread-win32 was relying on some standard-C librairies | |
(e.g. _ftime, calloc, errno), which are not available | |
on WinCE. We have changed the code to use native Win32 | |
API instead (or in some cases we made wrappers). | |
The Win32 Semaphores are not available, | |
so we had to re-implement Semaphores using mutexes | |
and events. | |
Limitations / known problems of the WinCE port: | |
---------------------------------------------- | |
Not all the semaphore routines have been ported | |
(semaphores are defined by Posix but are not part | |
pf pthread). I have just done enough to make | |
pthread routines (that rely internally on semaphores) | |
work, like signal conditions. | |
I noticed that the Win32 threads work slightly | |
differently on WinCE. This may have some impact | |
on some tricky parts of pthread-win32, but I have | |
not really investigated. For example, on WinCE, | |
the process is killed if the main thread falls off | |
the bottom (or calls pthread_exit), regardless | |
of the existence of any other detached thread. | |
Microsoft manual indicates that this behavior is | |
deffirent from that of Windows Threads for other | |
Win32 platforms. | |
Detailed descriptions of the changes and rationals: | |
------------------------------------ | |
- use a new macro NEED_ERRNO. | |
If defined, the code in errno.c that defines a reentrant errno | |
is compiled, regardless of _MT and _REENTRANT. | |
Rational: On WinCE, there is no support for <stdio.h>, <errno.h> or | |
any other standard C library, i.e. even if _MT or _REENTRANT | |
is defined, errno is not provided by any library. NEED_ERRNO | |
must be set to compile for WinCE. | |
------------------------------------ | |
- In implement.h, change #include <semaphore.h> to #include "semaphore.h". | |
Rational: semaphore.h is provided in pthread-win32 and should not | |
be searched in the systems standard include. would not compile. | |
This change does not seem to create problems on "classic" win32 | |
(e.g. win95). | |
------------------------------------ | |
- use a new macro NEED_CALLOC. | |
If defined, some code in misc.c will provide a replacement | |
for calloc, which is not available on Win32. | |
------------------------------------ | |
- use a new macro NEED_CREATETHREAD. | |
If defined, implement.h defines the macro _beginthreadex | |
and _endthreadex. | |
Rational: On WinCE, the wrappers _beginthreadex and _endthreadex | |
do not exist. The native Win32 routines must be used. | |
------------------------------------ | |
- in misc.c: | |
#ifdef NEED_DUPLICATEHANDLE | |
/* DuplicateHandle does not exist on WinCE */ | |
self->threadH = GetCurrentThread(); | |
#else | |
if( !DuplicateHandle( | |
GetCurrentProcess(), | |
GetCurrentThread(), | |
GetCurrentProcess(), | |
&self->threadH, | |
0, | |
FALSE, | |
DUPLICATE_SAME_ACCESS ) ) | |
{ | |
free( self ); | |
return (NULL); | |
} | |
#endif | |
Rational: On WinCE, DuplicateHandle does not exist. I could not understand | |
why DuplicateHandle must be used. It seems to me that getting the current | |
thread handle with GetCurrentThread() is sufficient, and it seems to work | |
perfectly fine, so maybe DuplicateHandle was just plain useless to begin with ? | |
------------------------------------ | |
- In private.c, added some code at the beginning of ptw32_processInitialize | |
to detect the case of multiple calls to ptw32_processInitialize. | |
Rational: In order to debug pthread-win32, it is easier to compile | |
it as a regular library (it is not possible to debug DLL's on winCE). | |
In that case, the application must call ptw32_rocessInitialize() | |
explicitely, to initialize pthread-win32. It is safer in this circumstance | |
to handle the case where ptw32_processInitialize() is called on | |
an already initialized library: | |
int | |
ptw32_processInitialize (void) | |
{ | |
if (ptw32_processInitialized) { | |
/* | |
* ignore if already initialized. this is useful for | |
* programs that uses a non-dll pthread | |
* library. such programs must call ptw32_processInitialize() explicitely, | |
* since this initialization routine is automatically called only when | |
* the dll is loaded. | |
*/ | |
return TRUE; | |
} | |
ptw32_processInitialized = TRUE; | |
[...] | |
} | |
------------------------------------ | |
- in private.c, if macro NEED_FTIME is defined, add routines to | |
convert timespec_to_filetime and filetime_to_timespec, and modified | |
code that was using _ftime() to use Win32 API instead. | |
Rational: _ftime is not available on WinCE. It is necessary to use | |
the native Win32 time API instead. | |
Note: the routine timespec_to_filetime is provided as a convenience and a mean | |
to test that filetime_to_timespec works, but it is not used by the library. | |
------------------------------------ | |
- in semaphore.c, if macro NEED_SEM is defined, add code for the routines | |
_increase_semaphore and _decrease_semaphore, and modify significantly | |
the implementation of the semaphores so that it does not use CreateSemaphore. | |
Rational: CreateSemaphore is not available on WinCE. I had to re-implement | |
semaphores using mutexes and Events. | |
Note: Only the semaphore routines that are used by pthread are implemented | |
(i.e. signal conditions rely on a subset of the semaphores routines, and | |
this subset works). Some other semaphore routines (e.g. sem_trywait) are | |
not yet supported on my WinCE port (and since I don't need them, I am not | |
planning to do anything about them). | |
------------------------------------ | |
- in tsd.c, changed the code that defines TLS_OUT_OF_INDEXES | |
/* TLS_OUT_OF_INDEXES not defined on WinCE */ | |
#ifndef TLS_OUT_OF_INDEXES | |
#define TLS_OUT_OF_INDEXES 0xffffffff | |
#endif | |
Rational: TLS_OUT_OF_INDEXES is not defined in any standard include file | |
on WinCE. | |
------------------------------------ | |
- added file need_errno.h | |
Rational: On WinCE, there is no errno.h file. need_errno.h is just a | |
copy of windows version of errno.h, with minor modifications due to the fact | |
that some of the error codes are defined by the WinCE socket library. | |
In pthread.h, if NEED_ERRNO is defined, the file need_errno.h is | |
included (instead of <errno.h>). | |
-- eof |