This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
4fc65d31f02c9608583061d9763b0382d19b81da
[perl5.git] / NetWare / nwperlsys.c
1 /*
2  * Copyright © 2001 Novell, Inc. All Rights Reserved.
3  *
4  * You may distribute under the terms of either the GNU General Public
5  * License or the Artistic License, as specified in the README file.
6  *
7  */
8
9 /*
10  * FILENAME     :   nwperlsys.c
11  * DESCRIPTION  :   Contains calls to Perl APIs and
12  *                  utility functions calls
13  *                  
14  * Author       :   SGP
15  * Date Created :   June 12th 2001.
16  * Date Modified:   June 26th 2001.
17  */
18
19 #include "EXTERN.h"
20 #include "perl.h"
21
22
23 //CHKSGP
24 //Including this is giving premature end-of-file error during compilation
25 //#include "XSUB.h"
26
27 #ifdef PERL_IMPLICIT_SYS
28
29 //Includes iperlsys.h and function definitions
30 #include "nwperlsys.h"
31
32 /*============================================================================================
33
34  Function               :       fnFreeMemEntry
35
36  Description    :       Called for each outstanding memory allocation at the end of a script run.
37                                         Frees the outstanding allocations
38
39  Parameters     :       ptr     (IN).
40                                         context (IN)
41
42  Returns                :       Nothing.
43
44 ==============================================================================================*/
45
46 void fnFreeMemEntry(void* ptr, void* context)
47 {
48         if(ptr)
49         {
50                 PerlMemFree(NULL, ptr);
51         }
52 }
53 /*============================================================================================
54
55  Function               :       fnAllocListHash
56
57  Description    :       Hashing function for hash table of memory allocations.
58
59  Parameters     :       invalue (IN).
60
61  Returns                :       unsigned.
62
63 ==============================================================================================*/
64
65 unsigned fnAllocListHash(void* const& invalue)
66 {
67     return (((unsigned) invalue & 0x0000ff00) >> 8);
68 }
69
70 /*============================================================================================
71
72  Function               :       perl_alloc
73
74  Description    :       creates a Perl interpreter variable and initializes
75
76  Parameters     :       none
77
78  Returns                :       Pointer to Perl interpreter
79
80 ==============================================================================================*/
81
82 EXTERN_C PerlInterpreter*
83 perl_alloc(void)
84 {
85     PerlInterpreter* my_perl = NULL;
86
87         WCValHashTable<void*>*  m_allocList;
88         m_allocList = new WCValHashTable<void*> (fnAllocListHash, 256);
89         fnInsertHashListAddrs(m_allocList, FALSE);
90
91         my_perl = perl_alloc_using(&perlMem,
92                                    NULL,
93                                    NULL,
94                                    &perlEnv,
95                                    &perlStdIO,
96                                    &perlLIO,
97                                    &perlDir,
98                                    &perlSock,
99                                    &perlProc);
100         if (my_perl) {
101                 //nw5_internal_host = m_allocList;
102         }
103     return my_perl;
104 }
105
106 /*============================================================================================
107
108  Function               :       perl_alloc_override
109
110  Description    :       creates a Perl interpreter variable and initializes
111
112  Parameters     :       Pointer to structure containing function pointers
113
114  Returns                :       Pointer to Perl interpreter
115
116 ==============================================================================================*/
117 EXTERN_C PerlInterpreter*
118 perl_alloc_override(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
119                  struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
120                  struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
121                  struct IPerlDir** ppDir, struct IPerlSock** ppSock,
122                  struct IPerlProc** ppProc)
123 {
124     PerlInterpreter *my_perl = NULL;
125
126         struct IPerlMem*        lpMem;
127         struct IPerlEnv*        lpEnv;
128         struct IPerlStdIO*      lpStdio;
129         struct IPerlLIO*        lpLIO;
130         struct IPerlDir*        lpDir;
131         struct IPerlSock*       lpSock;
132         struct IPerlProc*       lpProc;
133
134         WCValHashTable<void*>*  m_allocList;
135         m_allocList = new WCValHashTable<void*> (fnAllocListHash, 256);
136         fnInsertHashListAddrs(m_allocList, FALSE);
137
138         if (!ppMem)
139                 lpMem=&perlMem;
140         else
141                 lpMem=*ppMem;
142
143         if (!ppEnv)
144                 lpEnv=&perlEnv;
145         else
146                 lpEnv=*ppEnv;
147         
148         if (!ppStdIO)
149                 lpStdio=&perlStdIO;
150         else
151                 lpStdio=*ppStdIO;
152
153         if (!ppLIO)
154                 lpLIO=&perlLIO;
155         else
156                 lpLIO=*ppLIO;
157         
158         if (!ppDir)
159                 lpDir=&perlDir;
160         else
161                 lpDir=*ppDir;
162
163         if (!ppSock)
164                 lpSock=&perlSock;
165         else
166                 lpSock=*ppSock;
167
168         if (!ppProc)
169                 lpProc=&perlProc;
170         else
171                 lpProc=*ppProc;
172
173         my_perl = perl_alloc_using(lpMem,
174                                    NULL,
175                                    NULL,
176                                    lpEnv,
177                                    lpStdio,
178                                    lpLIO,
179                                    lpDir,
180                                    lpSock,
181                                    lpProc);
182         
183         if (my_perl) {
184             //nw5_internal_host = pHost;
185         }
186     return my_perl;
187 }
188 /*============================================================================================
189
190  Function               :       nw5_delete_internal_host
191
192  Description    :       Deletes the alloc_list pointer
193
194  Parameters     :       alloc_list pointer
195
196  Returns                :       none
197
198 ==============================================================================================*/
199
200 EXTERN_C void
201 nw5_delete_internal_host(void *h)
202 {
203         WCValHashTable<void*>*  m_allocList;
204         void **listptr;
205         BOOL m_dontTouchHashLists;
206         if (fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
207                 m_allocList = (WCValHashTable<void*>*)listptr;
208                 fnInsertHashListAddrs(m_allocList, TRUE);
209                 if (m_allocList)
210                 {
211                         m_allocList->forAll(fnFreeMemEntry, NULL);
212                         fnInsertHashListAddrs(NULL, FALSE);
213                         delete m_allocList;
214                 }
215         }
216 }
217
218 #endif /* PERL_IMPLICIT_SYS */