1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "prstrms.h"
7 
8 #include "prinit.h"
9 #include "prio.h"
10 #include "prthread.h"
11 
12 #include <cstring>
13 #include <iostream>
14 
15 #ifdef XP_UNIX
16 #include <sys/stat.h>
17 #endif
18 
19 using std::cout;
20 using std::endl;
21 using std::ios;
22 
23 const unsigned int MaxCnt = 1;
24 
25 typedef struct threadarg {
26     const char *mytag;
27 } threadarg;
28 
29 void threadwork(threadarg *arg);
30 
31 void
32 threadmain(void *mytag)
33 {
34     threadarg arg;
35 
36     arg.mytag = static_cast<const char *>(mytag);
37 
38     threadwork(&arg);
39 }
40 
41 void
42 threadwork(threadarg *arg)
43 {
44     unsigned int i;
45 
46     char fname1[256];
del_ba(dt,str,flags)47     char fname2[256];
48 
49     strcpy(fname1, arg->mytag);
50     strcpy(fname2, arg->mytag);
51     strcat(fname2, "2");
52     PR_Delete(fname1);
53     PR_Delete(fname2);
54 
55     PRfilebuf *fb[MaxCnt];
56     PRifstream *ifs[MaxCnt];
57     PRofstream *ofs[MaxCnt];
58     int mode = 0;
59 #ifdef XP_UNIX
60     mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
61 #endif
62 
63     //
64     // Allocate a bunch
65     cout << "Testing unused filebufs ----------------" << endl;
66     for (i=0; i < MaxCnt; i++) {
67         fb[i] = new PRfilebuf;
68     }
69     // Delete them
70     for (i=0; i < MaxCnt; i++) {
71         delete fb[i];
72     }
73     cout << "Unused filebufs complete ---------------" << endl;
74 
75     //
76     // Allocate a bunch
77     cout << "Testing unused ifstream -----------------" << endl;
78     for (i=0; i < MaxCnt; i++) {
79         ifs[i] = new PRifstream;
80     }
81     //
82     // Delete them
83     for (i=0; i < MaxCnt; i++) {
84         delete ifs[i];
85     }
86     cout << "Unused ifstream complete ----------------" << endl;
87     //
88     // Allocate a bunch
89     cout << "Testing unused ofstream -----------------" << endl;
90     for (i=0; i < MaxCnt; i++) {
91         ofs[i] = new PRofstream;
92     }
93     for (i=0; i < MaxCnt; i++) {
94         *(ofs[i]) << "A"; // Write a bit
95         delete ofs[i]; // Delete it.
96     }
97     cout << "Unused ofstream complete ----------------" << endl;
98 
99     cout << "Testing use of ofstream 1 (extra filebuf allocated) ---------" << endl;
100     PRofstream *aos = new PRofstream(fname1, ios::out|ios::ate, mode);
101     for (i=0; i < MaxCnt; i++) {
102         for (int j=0; j < 8192; j++) {
103             *aos << "AaBbCcDdEeFfGg" << endl;
104         }
105         fb[i] = new PRfilebuf; // Allocate as we go to hack at the heap
106     }
107     //
108     // Delete the extra foo we allocated
109     for (i=0; i < MaxCnt; i++) {
110         delete fb[i];
111     }
112     aos->flush(); // Explicit flush
113     delete aos;
114     cout << "Testing use of ofstream 1 complete (extra filebuf deleted) --" << endl;
115     cout << "Testing use of ofstream 2 (extra filebuf allocated) ---------" << endl;
116     PRofstream *aos2 = new PRofstream(fname2, ios::out, mode);
117 
118     for (i=0; i < MaxCnt; i++) {
119         *aos2 << "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
120     }
121     // Force flushing in the dtor
122     delete aos2;
123     cout << "Testing use of ofstream 2 complete (extra filebuf deleted) --" << endl;
124     char line[1024];
125     cout << "Testing use of ifstream 1 (stack allocation) -------------" << endl;
126     PRifstream ais(fname1);
127     for (i=0; i < MaxCnt; i++) {
128         ais >> line;
129     }
130     cout << "Testing use of ifstream 1 complete -----------------------" << endl;
131     cout << "Testing use of ifstream 2 ----------------------" << endl;
132     PRifstream *ais2 = new PRifstream(fname2);
133     char achar;
134     for (i=0; i < MaxCnt*10; i++) {
135         *ais2 >> achar;
136     }
137     delete ais2;
138     cout << "Testing use of ifstream 2 complete -------------" << endl;
139 }
140 
141 #define STACKSIZE 1024*1024
142 int
143 main()
144 {
145     PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 256);
146     threadmain(const_cast<char *>("TestFile"));
147     PRThread *thr1 = PR_CreateThread(PR_SYSTEM_THREAD,
148                                      threadmain,
149                                      const_cast<char *>("TestFile1"),
150                                      PR_PRIORITY_NORMAL,
151                                      PR_GLOBAL_THREAD,
152                                      PR_JOINABLE_THREAD,
153                                      STACKSIZE);
154     PRThread *thr2 = PR_CreateThread(PR_SYSTEM_THREAD,
155                                      threadmain,
156                                      const_cast<char *>("TestFile2"),
157                                      PR_PRIORITY_NORMAL,
158                                      PR_GLOBAL_THREAD,
159                                      PR_JOINABLE_THREAD,
160                                      STACKSIZE);
161     PRThread *thr3 = PR_CreateThread(PR_SYSTEM_THREAD,
162                                      threadmain,
163                                      const_cast<char *>("TestFile3"),
164                                      PR_PRIORITY_NORMAL,
165                                      PR_GLOBAL_THREAD,
166                                      PR_JOINABLE_THREAD,
167                                      STACKSIZE);
168     PR_JoinThread(thr1);
169     PR_JoinThread(thr2);
170     PR_JoinThread(thr3);
171     return 0;
172 }
173