source: rtems/cpukit/httpd/h.c @ 58ce601

4.104.114.84.95
Last change on this file since 58ce601 was ee3afa2, checked in by Joel Sherrill <joel.sherrill@…>, on 04/11/03 at 14:46:55

2002-04-10 Mike Siers <mikes@…>

  • rtems_webserver/NOTES, rtems_webserver/asp.c, rtems_webserver/balloc.c, rtems_webserver/default.c, rtems_webserver/ej.h, rtems_webserver/ejIntrn.h, rtems_webserver/ejlex.c, rtems_webserver/ejparse.c, rtems_webserver/emfdb.c, rtems_webserver/emfdb.h, rtems_webserver/form.c, rtems_webserver/h.c, rtems_webserver/handler.c, rtems_webserver/license.txt, rtems_webserver/md5.h, rtems_webserver/md5c.c, rtems_webserver/mime.c, rtems_webserver/misc.c, rtems_webserver/ringq.c, rtems_webserver/rom.c, rtems_webserver/security.c, rtems_webserver/sock.c, rtems_webserver/sym.c, rtems_webserver/uemf.c, rtems_webserver/uemf.h, rtems_webserver/um.c, rtems_webserver/um.h, rtems_webserver/url.c, rtems_webserver/value.c, rtems_webserver/wbase64.c, rtems_webserver/webcomp.c, rtems_webserver/webpage.c, rtems_webserver/webrom.c, rtems_webserver/webs.c, rtems_webserver/webs.h, rtems_webserver/websuemf.c, rtems_webserver/wsIntrn.h: Update to GoAhead? Webserver 2.1.4. The following URL is the release notes from GoAhead?.

http://data.goahead.com/Software/Webserver/2.1.4/release.htm

I have only done a minimal amount of testing (i.e. the network
demo program works fine). Please try this out and let me know
if it works. The patch needs to be applied on the
c/src/libnetworking/rtems_webserver directory.

  • Property mode set to 100644
File size: 4.1 KB
Line 
1/*
2 * h.c -- Handle allocation module
3 *
4 * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
5 * See the file "license.txt" for usage and redistribution license requirements
6 *
7 * $Id$
8 */
9
10/******************************** Description *********************************/
11
12/*
13 *      This module provides a simple API to allocate and free handles
14 *      It maintains a dynamic array of pointers. These usually point to
15 *      per-handle structures.
16 */
17
18/********************************* Includes ***********************************/
19
20#ifdef UEMF
21        #include        "uemf.h"
22#else
23        #include        "basic/basicInternal.h"
24#endif
25
26/********************************** Defines ***********************************/
27/*
28 *      The handle list stores the length of the list and the number of used
29 *      handles in the first two words.  These are hidden from the caller by
30 *      returning a pointer to the third word to the caller
31 */
32
33#define H_LEN           0               /* First entry holds length of list */
34#define H_USED          1               /* Second entry holds number of used */
35#define H_OFFSET        2               /* Offset to real start of list */
36
37#define H_INCR          16              /* Grow handle list in chunks this size */
38
39/*********************************** Code *************************************/
40/*
41 *      Allocate a new file handle.  On the first call, the caller must set the
42 *      handle map to be a pointer to a null pointer.  *map points to the second
43 *      element in the handle array.
44 */
45
46#ifdef B_STATS
47int HALLOC(B_ARGS_DEC, void ***map)
48#else
49int hAlloc(void ***map)
50#endif
51{
52        int             *mp;
53        int             handle, len, memsize, incr;
54
55        a_assert(map);
56
57        if (*map == NULL) {
58                incr = H_INCR;
59                memsize = (incr + H_OFFSET) * sizeof(void**);
60#ifdef B_STATS
61                if ((mp = (int*) balloc(B_ARGS, memsize)) == NULL) {
62#else
63                if ((mp = (int*) balloc(B_L, memsize)) == NULL) {
64#endif
65                        return -1;
66                }
67                memset(mp, 0, memsize);
68                mp[H_LEN] = incr;
69                mp[H_USED] = 0;
70                *map = (void**) &mp[H_OFFSET];
71        } else {
72                mp = &((*(int**)map)[-H_OFFSET]);
73        }
74
75        len = mp[H_LEN];
76
77/*
78 *      Find the first null handle
79 */
80        if (mp[H_USED] < mp[H_LEN]) {
81                for (handle = 0; handle < len; handle++) {
82                        if (mp[handle+H_OFFSET] == 0) {
83                                mp[H_USED]++;
84                                return handle;
85                        }
86                }
87        } else {
88                handle = len;
89        }
90
91/*
92 *      No free handle so grow the handle list. Grow list in chunks of H_INCR.
93 */
94        len += H_INCR;
95        memsize = (len + H_OFFSET) * sizeof(void**);
96        if ((mp = (int*) brealloc(B_L, (void*) mp, memsize)) == NULL) {
97                return -1;
98        }
99        *map = (void**) &mp[H_OFFSET];
100        mp[H_LEN] = len;
101        memset(&mp[H_OFFSET + len - H_INCR], 0, sizeof(int*) * H_INCR);
102        mp[H_USED]++;
103        return handle;
104}
105
106/******************************************************************************/
107/*
108 *      Free a handle.  This function returns the value of the largest
109 *      handle in use plus 1, to be saved as a max value.
110 */
111
112int hFree(void ***map, int handle)
113{
114        int             *mp;
115        int             len;
116
117        a_assert(map);
118        mp = &((*(int**)map)[-H_OFFSET]);
119        a_assert(mp[H_LEN] >= H_INCR);
120
121        a_assert(mp[handle + H_OFFSET]);
122        a_assert(mp[H_USED]);
123        mp[handle + H_OFFSET] = 0;
124        if (--(mp[H_USED]) == 0) {
125                bfree(B_L, (void*) mp);
126                *map = NULL;
127        }
128
129/*
130 *      Find the greatest handle number in use.
131 */
132        if (*map == NULL) {
133                handle = -1;
134        } else {
135                len = mp[H_LEN];
136                if (mp[H_USED] < mp[H_LEN]) {
137                        for (handle = len - 1; handle >= 0; handle--) {
138                                if (mp[handle + H_OFFSET])
139                                        break;
140                        }
141                } else {
142                        handle = len;
143                }
144        }
145        return handle + 1;
146}
147
148/******************************************************************************/
149/*
150 *      Allocate an entry in the halloc array.
151 */
152
153#ifdef B_STATS
154int HALLOCENTRY(B_ARGS_DEC, void ***list, int *max, int size)
155#else
156int hAllocEntry(void ***list, int *max, int size)
157#endif
158{
159        char_t  *cp;
160        int             id;
161
162        a_assert(list);
163        a_assert(max);
164
165#ifdef B_STATS
166        if ((id = HALLOC(B_ARGS, (void***) list)) < 0) {
167#else
168        if ((id = hAlloc((void***) list)) < 0) {
169#endif
170                return -1;
171        }
172
173        if (size > 0) {
174#ifdef B_STATS
175                if ((cp = balloc(B_ARGS, size)) == NULL) {
176#else
177                if ((cp = balloc(B_L, size)) == NULL) {
178#endif
179                        hFree(list, id);
180                        return -1;
181                }
182                a_assert(cp);
183                memset(cp, 0, size);
184
185                (*list)[id] = (void*) cp;
186        }
187
188        if (id >= *max) {
189                *max = id + 1;
190        }
191        return id;
192}
193
194/******************************************************************************/
195
Note: See TracBrowser for help on using the repository browser.