- Remove ROSRTL. The era is over. Thanks to Filip for his help during the last month. Modified: trunk/reactos/drivers/net/tcpip/include/precomp.h Added: trunk/reactos/drivers/net/tcpip/recmutex/ Added: trunk/reactos/drivers/net/tcpip/recmutex/recmutex.c Added: trunk/reactos/drivers/net/tcpip/recmutex/recmutex.h Modified: trunk/reactos/drivers/net/tcpip/tcpip.xml Deleted: trunk/reactos/include/rosrtl/ Modified: trunk/reactos/lib/directory.xml Modified: trunk/reactos/lib/dnsapi/dnsapi.xml Modified: trunk/reactos/lib/gdi32/gdi32.xml Modified: trunk/reactos/lib/kernel32/kernel32.xml Modified: trunk/reactos/lib/kernel32/tests/kernel32.xml Modified: trunk/reactos/lib/ntdll/ntdll.xml Deleted: trunk/reactos/lib/rosrtl/ Added: trunk/reactos/lib/rtl/qsort.c Modified: trunk/reactos/lib/rtl/rtl.xml Modified: trunk/reactos/lib/user32/user32.xml Modified: trunk/reactos/ntoskrnl/ntoskrnl.xml Modified: trunk/reactos/subsys/win32k/tests/win32k.xml Modified: trunk/reactos/subsys/win32k/win32k.xml _____
Modified: trunk/reactos/drivers/net/tcpip/include/precomp.h --- trunk/reactos/drivers/net/tcpip/include/precomp.h 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/drivers/net/tcpip/include/precomp.h 2005-07-26 04:52:11 UTC (rev 16731) @@ -1,7 +1,7 @@
#include <roscfg.h> #include <limits.h> #include <ddk/ntddk.h> -#include <rosrtl/recmutex.h> +#include <../recmutex/recmutex.h> #include <roscfg.h> #include <tcpip.h> #include <loopback.h> _____
Copied: trunk/reactos/drivers/net/tcpip/recmutex/recmutex.c (from rev 16725, trunk/reactos/lib/rosrtl/recmutex/recmutex.c) --- trunk/reactos/lib/rosrtl/recmutex/recmutex.c 2005-07-25 20:28:29 UTC (rev 16725) +++ trunk/reactos/drivers/net/tcpip/recmutex/recmutex.c 2005-07-26 04:52:11 UTC (rev 16731) @@ -0,0 +1,83 @@
+#include <ddk/ntddk.h> +#include "recmutex.h" + +VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) { + RtlZeroMemory( RecMutex, sizeof(*RecMutex) ); + KeInitializeSpinLock( &RecMutex->SpinLock ); + ExInitializeFastMutex( &RecMutex->Mutex ); + KeInitializeEvent( &RecMutex->StateLockedEvent, + NotificationEvent, FALSE ); +} + +/* NOTE: When we leave, the FAST_MUTEX must have been released. The result + * is that we always exit in the same irql as entering */ +UINT RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOL ToWrite ) { + NTSTATUS Status = STATUS_SUCCESS; + PVOID CurrentThread = KeGetCurrentThread(); + + /* Wait for the previous user to unlock the RecMutex state. There might be + * multiple waiters waiting to change the state. We need to check each + * time we get the event whether somebody still has the state locked */ + + if( !RecMutex ) return FALSE; + + if( CurrentThread == RecMutex->CurrentThread || + (!ToWrite && !RecMutex->Writer) ) { + RecMutex->LockCount++; + return TRUE; + } + + if( KeGetCurrentIrql() == PASSIVE_LEVEL ) { + ExAcquireFastMutex( &RecMutex->Mutex ); + RecMutex->OldIrql = PASSIVE_LEVEL; + while( RecMutex->Locked ) { + ExReleaseFastMutex( &RecMutex->Mutex ); + Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, + UserRequest, + KernelMode, + FALSE, + NULL ); + ExAcquireFastMutex( &RecMutex->Mutex ); + if( Status == STATUS_SUCCESS ) break; + } + RecMutex->Locked = TRUE; + RecMutex->Writer = ToWrite; + RecMutex->CurrentThread = CurrentThread; + RecMutex->LockCount++; + ExReleaseFastMutex( &RecMutex->Mutex ); + } else { + KeAcquireSpinLock( &RecMutex->SpinLock, &RecMutex->OldIrql ); + RecMutex->Locked = TRUE; + RecMutex->Writer = ToWrite; + RecMutex->CurrentThread = CurrentThread; + RecMutex->LockCount++; + } + + return TRUE; +} + +VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) { + if( RecMutex->LockCount == 0 ) { + return; + } else + RecMutex->LockCount--; + + if( !RecMutex->LockCount ) { + RecMutex->CurrentThread = NULL; + if( RecMutex->OldIrql == PASSIVE_LEVEL ) { + ExAcquireFastMutex( &RecMutex->Mutex ); + RecMutex->Locked = FALSE; + RecMutex->Writer = FALSE; + ExReleaseFastMutex( &RecMutex->Mutex ); + } else { + RecMutex->Locked = FALSE; + RecMutex->Writer = FALSE; + KeReleaseSpinLock( &RecMutex->SpinLock, RecMutex->OldIrql ); + } + + RecMutex->OldIrql = PASSIVE_LEVEL; + KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT, + FALSE ); + } +} + _____
Copied: trunk/reactos/drivers/net/tcpip/recmutex/recmutex.h (from rev 16725, trunk/reactos/include/rosrtl/recmutex.h) _____
Modified: trunk/reactos/drivers/net/tcpip/tcpip.xml --- trunk/reactos/drivers/net/tcpip/tcpip.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/drivers/net/tcpip/tcpip.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -8,7 +8,6 @@
<library>ip</library> <library>oskittcp</library> <library>ndis</library> - <library>rosrtl</library> <library>pseh</library> <library>ntoskrnl</library> <library>hal</library> @@ -18,6 +17,9 @@ <directory name="datalink"> <file>lan.c</file> </directory> + <directory name="recmutex"> + <file>recmutex.c</file> + </directory> <directory name="tcpip"> <file>buffer.c</file> <file>bug.c</file> _____
Modified: trunk/reactos/lib/directory.xml --- trunk/reactos/lib/directory.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/directory.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -214,9 +214,6 @@
<directory name="riched20"> <xi:include href="riched20/riched20.xml" /> </directory> -<directory name="rosrtl"> - <xi:include href="rosrtl/rosrtl.xml" /> -</directory> <directory name="rossym"> <xi:include href="rossym/rossym.xml" /> </directory> _____
Modified: trunk/reactos/lib/dnsapi/dnsapi.xml --- trunk/reactos/lib/dnsapi/dnsapi.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/dnsapi/dnsapi.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -7,7 +7,6 @@
<define name="ADNS_JGAA_WIN32" /> <define name="__USE_W32API" /> <library>adns</library> - <library>rosrtl</library> <library>ntdll</library> <library>kernel32</library> <library>user32</library> _____
Modified: trunk/reactos/lib/gdi32/gdi32.xml --- trunk/reactos/lib/gdi32/gdi32.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/gdi32/gdi32.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -7,7 +7,6 @@
<define name="WINVER">0x0600</define> <define name="_WIN32_WINNT">0x0501</define> <library>ntdll</library> - <library>rosrtl</library> <library>kernel32</library> <library>advapi32</library> <directory name="include"> _____
Modified: trunk/reactos/lib/kernel32/kernel32.xml --- trunk/reactos/lib/kernel32/kernel32.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/kernel32/kernel32.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -118,7 +118,6 @@
<define name="WINVER">0x0500</define> <library>kernel32_base</library> <library>pseh</library> - <library>rosrtl</library> <library>intrlck</library> <library>ntdll</library> <linkerflag>-lgcc</linkerflag> _____
Modified: trunk/reactos/lib/kernel32/tests/kernel32.xml --- trunk/reactos/lib/kernel32/tests/kernel32.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/kernel32/tests/kernel32.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -10,7 +10,6 @@
<library>regtests</library> <library>kernel32_base</library> <library>pseh</library> - <library>rosrtl</library> <library>ntdll</library> <library>msvcrt</library> <linkerflag>-lgcc</linkerflag> _____
Modified: trunk/reactos/lib/ntdll/ntdll.xml --- trunk/reactos/lib/ntdll/ntdll.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/ntdll/ntdll.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -8,7 +8,6 @@
<define name="_WIN32_WINNT">0x0502</define> <define name="_NTOSKRNL_" /> <library>rtl</library> - <library>rosrtl</library> <library>intrlck</library> <library>string</library> <linkerflag>-lgcc</linkerflag> _____
Added: trunk/reactos/lib/rtl/qsort.c --- trunk/reactos/lib/rtl/qsort.c 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/rtl/qsort.c 2005-07-26 04:52:11 UTC (rev 16731) @@ -0,0 +1,266 @@
+/* $Id: qsort.c 12852 2005-01-06 13:58:04Z mf $ + * + * FILE: ntoskrnl/rtl/qsort.c + * NOTE: Adapted from CygWin newlib 2000-03-12. + */ +/* +FUNCTION +<<qsort>>---sort an array + +INDEX + qsort + +ANSI_SYNOPSIS + #include <stdlib.h> + void qsort(void *<[base]>, size_t <[nmemb]>, size_t <[size]>, + int (*<[compar]>)(const void *, const void *) ); + +TRAD_SYNOPSIS + #include <stdlib.h> + qsort(<[base]>, <[nmemb]>, <[size]>, <[compar]> ) + char *<[base]>; + size_t <[nmemb]>; + size_t <[size]>; + int (*<[compar]>)(); + +DESCRIPTION +<<qsort>> sorts an array (beginning at <[base]>) of <[nmemb]> objects. +<[size]> describes the size of each element of the array. + +You must supply a pointer to a comparison function, using the argument +shown as <[compar]>. (This permits sorting objects of unknown +properties.) Define the comparison function to accept two arguments, +each a pointer to an element of the array starting at <[base]>. The +result of <<(*<[compar]>)>> must be negative if the first argument is +less than the second, zero if the two arguments match, and positive if +the first argument is greater than the second (where ``less than'' and +``greater than'' refer to whatever arbitrary ordering is appropriate). + +The array is sorted in place; that is, when <<qsort>> returns, the +array elements beginning at <[base]> have been reordered. + +RETURNS +<<qsort>> does not return a result. + +PORTABILITY +<<qsort>> is required by ANSI (without specifying the sorting algorithm). +*/ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef __GNUC__ +#define inline +#endif + +/* FIXME: these types should be from the default includes */ + +typedef int (* _pfunccmp_t) (char *, char *); +typedef int size_t; + +#define min(a,b) ((a)<(b)?(a):(b)) + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + register TYPE *pi = (TYPE *) (parmi); \ + register TYPE *pj = (TYPE *) (parmj); \ + do { \ + register TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + +static inline void +swapfunc ( + char * a, + char * b, + int n, + int swaptype + ) +{ + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +static inline char * +med3 ( + char * a, + char * b, + char * c, + _pfunccmp_t cmp + ) +{ + return cmp(a, b) < 0 ? + (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) + :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); +} + + +/* EXPORTED */ +void +qsort ( + void * a, + size_t n, + size_t es, + _pfunccmp_t cmp + ) +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + int d, r, swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) + { + for ( pm = (char *) a + es; + pm < (char *) a + n * es; + pm += es + ) + { + for ( pl = pm; + pl > (char *) a && cmp(pl - es, pl) > 0; + pl -= es + ) + { + swap(pl, pl - es); + } + } + return; + } + pm = (char *) a + (n / 2) * es; + if (n > 7) + { + pl = (char *) a; + pn = (char *) a + (n - 1) * es; + if (n > 40) + { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp); + pm = med3(pm - d, pm, pm + d, cmp); + pn = med3(pn - 2 * d, pn - d, pn, cmp); + } + pm = med3(pl, pm, pn, cmp); + } + swap(a, pm); + pa = pb = (char *) a + es; + + pc = pd = (char *) a + (n - 1) * es; + for (;;) + { + while (pb <= pc && (r = cmp(pb, a)) <= 0) + { + if (r == 0) + { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (r = cmp(pc, a)) >= 0) + { + if (r == 0) + { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + { + break; + } + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) /* Switch to insertion sort */ + { + for ( pm = (char *) a + es; + pm < (char *) a + n * es; + pm += es + ) + { + for ( pl = pm; + pl > (char *) a && cmp(pl - es, pl) > 0; + pl -= es + ) + { + swap(pl, pl - es); + } + } + return; + } + + pn = (char *) a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > es) + { + qsort(a, r / es, es, cmp); + } + if ((r = pd - pc) > es) + { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ +} + + +/* EOF */ _____
Modified: trunk/reactos/lib/rtl/rtl.xml --- trunk/reactos/lib/rtl/rtl.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/rtl/rtl.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -37,6 +37,7 @@
<file>nls.c</file> <file>ppb.c</file> <file>process.c</file> + <file>qsort.c</file> <file>random.c</file> <file>registry.c</file> <file>sd.c</file> _____
Modified: trunk/reactos/lib/user32/user32.xml --- trunk/reactos/lib/user32/user32.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/lib/user32/user32.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -11,7 +11,6 @@
<library>wine</library> <library>ntdll</library> <library>gdi32</library> - <library>rosrtl</library> <library>kernel32</library> <library>advapi32</library> <directory name="include"> _____
Modified: trunk/reactos/ntoskrnl/ntoskrnl.xml --- trunk/reactos/ntoskrnl/ntoskrnl.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/ntoskrnl/ntoskrnl.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -14,7 +14,6 @@
<library>kjs</library> <library>pseh</library> <library>rtl</library> - <library>rosrtl</library> <library>rossym</library> <library>string</library> <library>wdmguid</library> _____
Modified: trunk/reactos/subsys/win32k/tests/win32k.xml --- trunk/reactos/subsys/win32k/tests/win32k.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/subsys/win32k/tests/win32k.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -14,7 +14,6 @@
<library>regtests</library> <library>win32k_base</library> <library>pseh</library> - <library>rosrtl</library> <directory name="tests"> <file>DIB_24BPP_ColorFill-performance.c</file> </directory> _____
Modified: trunk/reactos/subsys/win32k/win32k.xml --- trunk/reactos/subsys/win32k/win32k.xml 2005-07-26 04:14:10 UTC (rev 16730) +++ trunk/reactos/subsys/win32k/win32k.xml 2005-07-26 04:52:11 UTC (rev 16731) @@ -132,7 +132,6 @@
<importlibrary definition="win32k.def" /> <library>win32k_base</library> <library>pseh</library> - <library>rosrtl</library> <library>ntoskrnl</library> <library>hal</library> <library>freetype</library>