File: a00176.html

package info (click to toggle)
omnievents 1%3A2.6.2-5
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 9,004 kB
  • ctags: 14,867
  • sloc: cpp: 7,676; python: 3,138; sh: 2,575; xml: 2,057; java: 1,409; makefile: 317; ansic: 9
file content (746 lines) | stat: -rw-r--r-- 70,300 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>OmniEvents: omniEventsLog.cc Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.3-20050530 -->
<div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a></div>
<h1>omniEventsLog.cc</h1><a href="a00113.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// -*- Mode: C++; -*-</span>
<a name="l00002"></a>00002 <span class="comment">//                            Package   : omniEvents</span>
<a name="l00003"></a>00003 <span class="comment">//  omniEventsLog.cc          Created   : 1/10/99</span>
<a name="l00004"></a>00004 <span class="comment">//                            Author    : Paul Nader (pwn)</span>
<a name="l00005"></a>00005 <span class="comment">//</span>
<a name="l00006"></a>00006 <span class="comment">//    Copyright (C) 1998 Paul Nader, 2003-2005 Alex Tingle.</span>
<a name="l00007"></a>00007 <span class="comment">//</span>
<a name="l00008"></a>00008 <span class="comment">//    This file is part of the omniEvents application.</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">//    omniEvents is free software; you can redistribute it and/or</span>
<a name="l00011"></a>00011 <span class="comment">//    modify it under the terms of the GNU Lesser General Public</span>
<a name="l00012"></a>00012 <span class="comment">//    License as published by the Free Software Foundation; either</span>
<a name="l00013"></a>00013 <span class="comment">//    version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00014"></a>00014 <span class="comment">//</span>
<a name="l00015"></a>00015 <span class="comment">//    omniEvents is distributed in the hope that it will be useful,</span>
<a name="l00016"></a>00016 <span class="comment">//    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00017"></a>00017 <span class="comment">//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00018"></a>00018 <span class="comment">//    Lesser General Public License for more details.</span>
<a name="l00019"></a>00019 <span class="comment">//</span>
<a name="l00020"></a>00020 <span class="comment">//    You should have received a copy of the GNU Lesser General Public</span>
<a name="l00021"></a>00021 <span class="comment">//    License along with this library; if not, write to the Free Software</span>
<a name="l00022"></a>00022 <span class="comment">//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
<a name="l00023"></a>00023 <span class="comment">//</span>
<a name="l00024"></a>00024 <span class="comment">// Description:</span>
<a name="l00025"></a>00025 <span class="comment">//      </span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="comment">/*</span>
<a name="l00028"></a>00028 <span class="comment">  $Log: omniEventsLog.cc,v $</span>
<a name="l00029"></a>00029 <span class="comment">  Revision 1.20.2.3  2005/05/10 14:28:11  alextingle</span>
<a name="l00030"></a>00030 <span class="comment">  Updated copyrights to 2005.</span>
<a name="l00031"></a>00031 <span class="comment"></span>
<a name="l00032"></a>00032 <span class="comment">  Revision 1.20.2.2  2005/05/04 23:06:02  alextingle</span>
<a name="l00033"></a>00033 <span class="comment">  Fixed reference leak. Releases ref to factory servant.</span>
<a name="l00034"></a>00034 <span class="comment"></span>
<a name="l00035"></a>00035 <span class="comment">  Revision 1.20.2.1  2004/11/16 21:46:11  alextingle</span>
<a name="l00036"></a>00036 <span class="comment">  Made several methods virtual to allow users of libomniEvents to override</span>
<a name="l00037"></a>00037 <span class="comment">  the default persistency behaviour. (Dirk O. Siebnich)</span>
<a name="l00038"></a>00038 <span class="comment"></span>
<a name="l00039"></a>00039 <span class="comment">  Revision 1.20  2004/09/25 23:12:28  alextingle</span>
<a name="l00040"></a>00040 <span class="comment">  New method: Orb::reportObjectFailure() - flags unexpected failures at a higher</span>
<a name="l00041"></a>00041 <span class="comment">  priority than normal non-fatal exceptions.</span>
<a name="l00042"></a>00042 <span class="comment"></span>
<a name="l00043"></a>00043 <span class="comment">  New macro: NP_MINORSTRING() - a safe interface to</span>
<a name="l00044"></a>00044 <span class="comment">  CORBA::SystemException::NP_minorString() that returns "??" when there is no</span>
<a name="l00045"></a>00045 <span class="comment">  mapping for the exception's minor code.</span>
<a name="l00046"></a>00046 <span class="comment"></span>
<a name="l00047"></a>00047 <span class="comment">  Revision 1.19  2004/07/26 16:27:08  alextingle</span>
<a name="l00048"></a>00048 <span class="comment">  Support for NT service on windows: main() moved into daemon.cc.</span>
<a name="l00049"></a>00049 <span class="comment">  New (laxer) start up syntax. Port is now set with -p (not -s). There is no</span>
<a name="l00050"></a>00050 <span class="comment">  special cold start mode.</span>
<a name="l00051"></a>00051 <span class="comment">  More flexible naming service name option -N. (No more -K option).</span>
<a name="l00052"></a>00052 <span class="comment"></span>
<a name="l00053"></a>00053 <span class="comment">  Revision 1.18  2004/07/16 08:45:46  alextingle</span>
<a name="l00054"></a>00054 <span class="comment">  New macro: IF_OMNIORB4(). Fixes warnings on AIX xlC_r.</span>
<a name="l00055"></a>00055 <span class="comment"></span>
<a name="l00056"></a>00056 <span class="comment">  Revision 1.17  2004/07/15 16:18:45  alextingle</span>
<a name="l00057"></a>00057 <span class="comment">  Fixed casting warnings on Tru64.</span>
<a name="l00058"></a>00058 <span class="comment"></span>
<a name="l00059"></a>00059 <span class="comment">  Revision 1.16  2004/07/06 12:46:34  alextingle</span>
<a name="l00060"></a>00060 <span class="comment">  Moved default macros into defaults.h</span>
<a name="l00061"></a>00061 <span class="comment"></span>
<a name="l00062"></a>00062 <span class="comment">  Revision 1.15  2004/07/06 10:59:39  alextingle</span>
<a name="l00063"></a>00063 <span class="comment">  Tightened privileges on created files.</span>
<a name="l00064"></a>00064 <span class="comment"></span>
<a name="l00065"></a>00065 <span class="comment">  Revision 1.14  2004/07/05 13:52:37  alextingle</span>
<a name="l00066"></a>00066 <span class="comment">  Improved iostream portability (again).</span>
<a name="l00067"></a>00067 <span class="comment"></span>
<a name="l00068"></a>00068 <span class="comment">  Revision 1.13  2004/07/02 15:20:39  alextingle</span>
<a name="l00069"></a>00069 <span class="comment">  Added daemonization, syslog &amp; pidfile support on Unix.</span>
<a name="l00070"></a>00070 <span class="comment">  Corrected trace levels for consistency with omniORB.</span>
<a name="l00071"></a>00071 <span class="comment"></span>
<a name="l00072"></a>00072 <span class="comment">  Revision 1.12  2004/05/14 14:44:48  alextingle</span>
<a name="l00073"></a>00073 <span class="comment">  Explicitly cast 'flags' to type ios::openmode for platforms where this type is an enum.</span>
<a name="l00074"></a>00074 <span class="comment"></span>
<a name="l00075"></a>00075 <span class="comment">  Revision 1.11  2004/04/20 20:23:03  alextingle</span>
<a name="l00076"></a>00076 <span class="comment">  Cross-platform friendly use of std:ifstream.</span>
<a name="l00077"></a>00077 <span class="comment"></span>
<a name="l00078"></a>00078 <span class="comment">  Revision 1.10  2004/04/20 17:16:16  alextingle</span>
<a name="l00079"></a>00079 <span class="comment">  Corrected openOfstream() arg name/comments.</span>
<a name="l00080"></a>00080 <span class="comment"></span>
<a name="l00081"></a>00081 <span class="comment">  Revision 1.9  2004/03/30 17:31:00  alextingle</span>
<a name="l00082"></a>00082 <span class="comment">  Added exception handlers to thread methods.</span>
<a name="l00083"></a>00083 <span class="comment"></span>
<a name="l00084"></a>00084 <span class="comment">  Revision 1.8  2004/03/28 01:03:58  alextingle</span>
<a name="l00085"></a>00085 <span class="comment">  Refactored class omniEventsLog to allow for more EventChannelFactory parameters.\nNew omniEvents params: -v, -a (alternate endPoint).</span>
<a name="l00086"></a>00086 <span class="comment"></span>
<a name="l00087"></a>00087 <span class="comment">  Revision 1.7  2004/03/23 13:29:34  alextingle</span>
<a name="l00088"></a>00088 <span class="comment">  Fixed bizarre compilation errors on Sun's CC.</span>
<a name="l00089"></a>00089 <span class="comment"></span>
<a name="l00090"></a>00090 <span class="comment">  Revision 1.6  2004/01/11 16:57:26  alextingle</span>
<a name="l00091"></a>00091 <span class="comment">  New persistancy log file format, implemented by PersistNode.h/cc. The new format enables new nodes to be added and old ones erased by appending a single line to the file, rather than by re-persisting the whole application. This is much more efficient when lots of proxies are being created all at once. It's also a much simpler solution, with far fewer lines of code.</span>
<a name="l00092"></a>00092 <span class="comment"></span>
<a name="l00093"></a>00093 <span class="comment">  Revision 1.5  2003/12/21 16:17:19  alextingle</span>
<a name="l00094"></a>00094 <span class="comment">  Added OmniEvents namespace. Now uses POA implementations.</span>
<a name="l00095"></a>00095 <span class="comment"></span>
<a name="l00096"></a>00096 <span class="comment">  Revision 1.4  2003/11/14 14:05:21  alextingle</span>
<a name="l00097"></a>00097 <span class="comment">  New output() members functions. Eliminates the need for friend ostream</span>
<a name="l00098"></a>00098 <span class="comment">  functions that are problematic on earlier versions of Microsoft</span>
<a name="l00099"></a>00099 <span class="comment">  VisualC++. Improved helpfulness of usage and error messages.</span>
<a name="l00100"></a>00100 <span class="comment"></span>
<a name="l00101"></a>00101 <span class="comment">  Revision 1.3  2003/11/03 22:41:00  alextingle</span>
<a name="l00102"></a>00102 <span class="comment">  Oops! Removed excess log comments.</span>
<a name="l00103"></a>00103 <span class="comment"></span>
<a name="l00104"></a>00104 <span class="comment">  Revision 1.2  2003/11/03 22:38:39  alextingle</span>
<a name="l00105"></a>00105 <span class="comment">  Removed many platform specific switches, alas many remain. Now uses</span>
<a name="l00106"></a>00106 <span class="comment">    autoconf,config.h wherever possible.</span>
<a name="l00107"></a>00107 <span class="comment">  Removed local definition of strdup() - omniEvents.cc manages to get</span>
<a name="l00108"></a>00108 <span class="comment">    along without it, so it can't be needed here.</span>
<a name="l00109"></a>00109 <span class="comment">  Moved convoluted code to obtain hostname into its own header file:</span>
<a name="l00110"></a>00110 <span class="comment">    gethostname.h</span>
<a name="l00111"></a>00111 <span class="comment">  Moved code that constructs logfile names into its own private method,</span>
<a name="l00112"></a>00112 <span class="comment">    omniEventsLog::initializeFileNames()</span>
<a name="l00113"></a>00113 <span class="comment">  Added explicit initialisation for all `class omniEventsLog' members.</span>
<a name="l00114"></a>00114 <span class="comment">  Moved code that opens file stream into its own private method,</span>
<a name="l00115"></a>00115 <span class="comment">    omniEventsLog::openOfstream()</span>
<a name="l00116"></a>00116 <span class="comment"></span>
<a name="l00117"></a>00117 <span class="comment">  Revision 1.1.1.1  2002/09/25 19:00:35  shamus13</span>
<a name="l00118"></a>00118 <span class="comment">  Import of OmniEvents source tree from release 2.1.1</span>
<a name="l00119"></a>00119 <span class="comment"></span>
<a name="l00120"></a>00120 <span class="comment">  Revision 1.8  2000/09/26 09:20:26  naderp</span>
<a name="l00121"></a>00121 <span class="comment">  STL Default parameters rework.</span>
<a name="l00122"></a>00122 <span class="comment">  Configurable checkpoint period.</span>
<a name="l00123"></a>00123 <span class="comment"></span>
<a name="l00124"></a>00124 <span class="comment">  Revision 1.7  2000/09/04 05:05:22  naderp</span>
<a name="l00125"></a>00125 <span class="comment">  Fixed problem with triggering multiple checkpoints.</span>
<a name="l00126"></a>00126 <span class="comment"></span>
<a name="l00127"></a>00127 <span class="comment">  Revision 1.6  2000/08/30 04:38:24  naderp</span>
<a name="l00128"></a>00128 <span class="comment">  Fix to prevent recorder thread from terminating.</span>
<a name="l00129"></a>00129 <span class="comment"></span>
<a name="l00130"></a>00130 <span class="comment">  Revision 1.5  2000/08/30 00:57:29  naderp</span>
<a name="l00131"></a>00131 <span class="comment">  Fixed broken persist method exiting after first checkpoint.</span>
<a name="l00132"></a>00132 <span class="comment"></span>
<a name="l00133"></a>00133 <span class="comment">  Revision 1.4  2000/03/06 13:19:58  naderp</span>
<a name="l00134"></a>00134 <span class="comment">  Moved port from global to factory persistency data.</span>
<a name="l00135"></a>00135 <span class="comment"></span>
<a name="l00136"></a>00136 <span class="comment">  Revision 1.3  2000/03/06 04:15:09  naderp</span>
<a name="l00137"></a>00137 <span class="comment">  Removed internal dependency between factory and Naming Service.</span>
<a name="l00138"></a>00138 <span class="comment"></span>
<a name="l00139"></a>00139 <span class="comment">  Revision 1.2  2000/03/02 04:20:09  naderp</span>
<a name="l00140"></a>00140 <span class="comment">  Initialising factory refernce in init().</span>
<a name="l00141"></a>00141 <span class="comment"></span>
<a name="l00142"></a>00142 <span class="comment">  Revision 1.1  2000/03/02 02:00:25  naderp</span>
<a name="l00143"></a>00143 <span class="comment">  Re-open active logfile during re-start.</span>
<a name="l00144"></a>00144 <span class="comment"></span>
<a name="l00145"></a>00145 <span class="comment">  Revision 1.0  1999/11/01 17:04:08  naderp</span>
<a name="l00146"></a>00146 <span class="comment">  Initial revision</span>
<a name="l00147"></a>00147 <span class="comment"></span>
<a name="l00148"></a>00148 <span class="comment">*/</span>
<a name="l00149"></a>00149 
<a name="l00150"></a>00150 <span class="preprocessor">#include "<a class="code" href="a00114.html">omniEventsLog.h</a>"</span>
<a name="l00151"></a>00151 
<a name="l00152"></a>00152 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#  include "<a class="code" href="a00083.html">config.h</a>"</span>
<a name="l00154"></a>00154 <span class="preprocessor">#endif</span>
<a name="l00155"></a>00155 <span class="preprocessor"></span>
<a name="l00156"></a>00156 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00157"></a>00157 
<a name="l00158"></a>00158 <span class="preprocessor">#ifdef HAVE_STDLIB_H</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;stdlib.h&gt;</span>
<a name="l00160"></a>00160 <span class="preprocessor">#endif</span>
<a name="l00161"></a>00161 <span class="preprocessor"></span>
<a name="l00162"></a>00162 <span class="preprocessor">#ifdef HAVE_SYS_TYPES_H</span>
<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;sys/types.h&gt;</span>
<a name="l00164"></a>00164 <span class="preprocessor">#endif</span>
<a name="l00165"></a>00165 <span class="preprocessor"></span>
<a name="l00166"></a>00166 <span class="preprocessor">#ifdef HAVE_SYS_STAT_H</span>
<a name="l00167"></a>00167 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;sys/stat.h&gt;</span>
<a name="l00168"></a>00168 <span class="preprocessor">#endif</span>
<a name="l00169"></a>00169 <span class="preprocessor"></span>
<a name="l00170"></a>00170 <span class="preprocessor">#ifdef HAVE_FCNTL_H</span>
<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;fcntl.h&gt;</span>
<a name="l00172"></a>00172 <span class="preprocessor">#endif</span>
<a name="l00173"></a>00173 <span class="preprocessor"></span>
<a name="l00174"></a>00174 <span class="preprocessor">#if defined(__VMS) &amp;&amp; __CRTL_VER &lt; 70000000</span>
<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;omniVMS/unlink.hxx&gt;</span>
<a name="l00176"></a>00176 <span class="preprocessor">#endif</span>
<a name="l00177"></a>00177 <span class="preprocessor"></span>
<a name="l00178"></a>00178 <span class="preprocessor">#ifdef __WIN32__</span>
<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;io.h&gt;</span>
<a name="l00180"></a>00180 <span class="preprocessor">#  include &lt;winbase.h&gt;</span>
<a name="l00181"></a>00181 <span class="preprocessor">#  define stat(x,y) _stat(x,y)</span>
<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">#  define unlink(x) _unlink(x)</span>
<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">#  define STRUCT_STAT struct _stat</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00185"></a><a class="code" href="a00113.html#a0">00185</a> <span class="preprocessor"></span><span class="preprocessor">#  define STRUCT_STAT struct stat</span>
<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">#endif // __WIN32__</span>
<a name="l00187"></a>00187 <span class="preprocessor"></span>
<a name="l00188"></a>00188 <span class="preprocessor">#ifdef HAVE_UNISTD_H</span>
<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;unistd.h&gt;</span>
<a name="l00190"></a>00190 <span class="preprocessor">#endif</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span>
<a name="l00192"></a>00192 <span class="preprocessor">#ifdef HAVE_LIBC_H</span>
<a name="l00193"></a>00193 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;libc.h&gt;</span>
<a name="l00194"></a>00194 <span class="preprocessor">#endif</span>
<a name="l00195"></a>00195 <span class="preprocessor"></span>
<a name="l00196"></a>00196 <span class="preprocessor">#ifdef HAVE_SYS_PARAM_H</span>
<a name="l00197"></a>00197 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;sys/param.h&gt;</span>
<a name="l00198"></a>00198 <span class="preprocessor">#endif</span>
<a name="l00199"></a>00199 <span class="preprocessor"></span>
<a name="l00200"></a>00200 <span class="preprocessor">#include &lt;errno.h&gt;</span>
<a name="l00201"></a>00201 <span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00202"></a>00202 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00203"></a>00203 <span class="preprocessor">#include "<a class="code" href="a00103.html">gethostname.h</a>"</span>
<a name="l00204"></a>00204 
<a name="l00205"></a>00205 <span class="preprocessor">#include "<a class="code" href="a00096.html">EventChannelFactory.h</a>"</span>
<a name="l00206"></a>00206 <span class="preprocessor">#include "<a class="code" href="a00116.html">Orb.h</a>"</span>
<a name="l00207"></a>00207 <span class="preprocessor">#include "<a class="code" href="a00091.html">defaults.h</a>"</span>
<a name="l00208"></a>00208 
<a name="l00209"></a>00209 <span class="comment">//</span>
<a name="l00210"></a>00210 <span class="comment">// Set flags for use in calls to omniEventsLog::openOfstream()</span>
<a name="l00211"></a>00211 <span class="comment">//</span>
<a name="l00212"></a>00212 
<a name="l00213"></a>00213 <span class="preprocessor">#if defined(HAVE_FSTREAM_OPEN)</span>
<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor">#  define FLAG_TRUNCATE ios::trunc</span>
<a name="l00215"></a>00215 <span class="preprocessor"></span><span class="preprocessor">#  define FLAG_APPEND   ios::app</span>
<a name="l00216"></a>00216 <span class="preprocessor"></span><span class="preprocessor">#  define FLAG_SYNC     0</span>
<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">#elif defined(HAVE_FSTREAM_ATTACH)</span>
<a name="l00218"></a>00218 <span class="preprocessor"></span><span class="preprocessor">#  if defined(__WIN32__)</span>
<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor">#    define FLAG_SYNC 0</span>
<a name="l00220"></a>00220 <span class="preprocessor"></span><span class="preprocessor">#  elif defined(O_SYNC)</span>
<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor">#    define FLAG_SYNC O_SYNC</span>
<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="preprocessor">#  else</span>
<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor">#    define FLAG_SYNC O_FSYNC // FreeBSD 3.2 does not have O_SYNC???</span>
<a name="l00224"></a>00224 <span class="preprocessor"></span><span class="preprocessor">#  endif</span>
<a name="l00225"></a>00225 <span class="preprocessor"></span><span class="preprocessor">#  define FLAG_TRUNCATE O_CREAT|O_TRUNC</span>
<a name="l00226"></a>00226 <span class="preprocessor"></span><span class="preprocessor">#  define FLAG_APPEND   O_APPEND</span>
<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00228"></a>00228 <span class="preprocessor"></span><span class="preprocessor">#  error "Can't open a file without ofstream::open() or ofstream::attach()"</span>
<a name="l00229"></a>00229 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00230"></a>00230 <span class="preprocessor"></span>
<a name="l00231"></a>00231 <span class="comment">//</span>
<a name="l00232"></a>00232 <span class="comment">// Append ';' to VMS filenames to force the latest version.</span>
<a name="l00233"></a>00233 <span class="comment">//</span>
<a name="l00234"></a>00234 
<a name="l00235"></a>00235 <span class="preprocessor">#ifdef __VMS</span>
<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="preprocessor">#  define VMS_SEMICOLON ";"</span>
<a name="l00237"></a>00237 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00238"></a><a class="code" href="a00113.html#a1">00238</a> <span class="preprocessor"></span><span class="preprocessor">#  define VMS_SEMICOLON</span>
<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00240"></a>00240 <span class="preprocessor"></span>
<a name="l00241"></a>00241 <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="a00113.html#a5">yyparse</a>();
<a name="l00242"></a>00242 <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="a00113.html#a2">yydebug</a>;
<a name="l00243"></a>00243 <span class="keyword">extern</span> FILE *<a class="code" href="a00113.html#a3">yyin</a>;
<a name="l00244"></a>00244 
<a name="l00245"></a>00245 <span class="keyword">namespace </span>OmniEvents {
<a name="l00246"></a>00246 
<a name="l00252"></a><a class="code" href="a00078.html">00252</a> <span class="keyword">class </span><a class="code" href="a00078.html">timestamp</a>
<a name="l00253"></a>00253 {
<a name="l00254"></a><a class="code" href="a00078.html#r0">00254</a>   <span class="keywordtype">char</span> <a class="code" href="a00078.html#r0">str</a>[29];
<a name="l00255"></a>00255 <span class="keyword">public</span>:
<a name="l00256"></a><a class="code" href="a00078.html#a0">00256</a>   <a class="code" href="a00078.html#a0">timestamp</a>(<span class="keywordtype">void</span>)
<a name="l00257"></a>00257   {
<a name="l00258"></a>00258     <a class="code" href="a00078.html#r0">str</a>[0] = <span class="charliteral">'['</span>;
<a name="l00259"></a>00259     <a class="code" href="a00078.html#r0">str</a>[1] = <a class="code" href="a00078.html#r0">str</a>[28] = <span class="charliteral">'\0'</span>;
<a name="l00260"></a>00260   }
<a name="l00261"></a><a class="code" href="a00078.html#a1">00261</a>   <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00078.html#a1">t</a>(<span class="keywordtype">void</span>)
<a name="l00262"></a>00262   {
<a name="l00263"></a>00263     time_t <a class="code" href="a00078.html#a1">t</a> =time(NULL);
<a name="l00264"></a>00264     <span class="keywordtype">char</span>*  p =ctime(&amp;t);
<a name="l00265"></a>00265     <span class="keywordflow">if</span>(strncmp(p, &amp;<a class="code" href="a00078.html#r0">str</a>[1], 24) == 0)
<a name="l00266"></a>00266         <span class="keywordflow">return</span> <span class="stringliteral">""</span>;
<a name="l00267"></a>00267     strncpy(&amp;<a class="code" href="a00078.html#r0">str</a>[1], p, 24);
<a name="l00268"></a>00268     <a class="code" href="a00078.html#r0">str</a>[25] = <span class="charliteral">']'</span>;
<a name="l00269"></a>00269     <a class="code" href="a00078.html#r0">str</a>[26] = <span class="charliteral">' '</span>;
<a name="l00270"></a>00270     <a class="code" href="a00078.html#r0">str</a>[27] = <span class="charliteral">' '</span>;
<a name="l00271"></a>00271     <span class="keywordflow">return</span> <a class="code" href="a00078.html#r0">str</a>;
<a name="l00272"></a>00272   }
<a name="l00273"></a>00273 };
<a name="l00274"></a>00274 
<a name="l00275"></a><a class="code" href="a00141.html#a2">00275</a> <a class="code" href="a00078.html">timestamp</a> <a class="code" href="a00141.html#a2">ts</a>;
<a name="l00276"></a>00276 
<a name="l00277"></a>00277 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00278"></a>00278 <span class="comment">//           omniEvents Log Implementation</span>
<a name="l00279"></a>00279 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00280"></a>00280 
<a name="l00281"></a><a class="code" href="a00056.html#t0">00281</a> <a class="code" href="a00056.html">omniEventsLog</a> *<a class="code" href="a00056.html#t0">omniEventsLog::theLog</a> = NULL;
<a name="l00282"></a>00282 
<a name="l00283"></a><a class="code" href="a00056.html#a0">00283</a> <a class="code" href="a00056.html#a0">omniEventsLog::omniEventsLog</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* logdir) :
<a name="l00284"></a>00284   _logstream(),
<a name="l00285"></a>00285   _activeFilename(NULL),
<a name="l00286"></a>00286   _backupFilename(NULL),
<a name="l00287"></a>00287   _checkpointFilename(NULL),
<a name="l00288"></a>00288   _workerThread(NULL),
<a name="l00289"></a>00289   _factory(NULL),
<a name="l00290"></a>00290   _checkpointNeeded(true),
<a name="l00291"></a>00291   _lock()
<a name="l00292"></a>00292 {
<a name="l00293"></a>00293   <a class="code" href="a00056.html#t0">omniEventsLog::theLog</a> = <span class="keyword">this</span>;
<a name="l00294"></a>00294   <a class="code" href="a00056.html#b0">initializeFileNames</a>(logdir);
<a name="l00295"></a>00295 }
<a name="l00296"></a>00296 
<a name="l00297"></a>00297 
<a name="l00298"></a><a class="code" href="a00056.html#a1">00298</a> <a class="code" href="a00056.html#a1">omniEventsLog::~omniEventsLog</a>()
<a name="l00299"></a>00299 {
<a name="l00300"></a>00300   <a class="code" href="a00116.html#a2">DB</a>(20, <span class="stringliteral">"omniEventsLog::~omniEventsLog()"</span>);
<a name="l00301"></a>00301 <span class="comment">/*</span>
<a name="l00302"></a>00302 <span class="comment">  if(NULL != _workerThread)</span>
<a name="l00303"></a>00303 <span class="comment">  {</span>
<a name="l00304"></a>00304 <span class="comment">    _workerThread-&gt;join(0);</span>
<a name="l00305"></a>00305 <span class="comment">    _workerThread = NULL;</span>
<a name="l00306"></a>00306 <span class="comment">  }</span>
<a name="l00307"></a>00307 <span class="comment">*/</span>
<a name="l00308"></a>00308   <span class="keywordflow">if</span>(NULL != <a class="code" href="a00056.html#p5">_factory</a>)
<a name="l00309"></a>00309   {
<a name="l00310"></a>00310     <a class="code" href="a00056.html#p5">_factory</a>-&gt;_remove_ref();
<a name="l00311"></a>00311     <a class="code" href="a00056.html#p5">_factory</a> = NULL;
<a name="l00312"></a>00312   }
<a name="l00313"></a>00313   <a class="code" href="a00056.html#t0">omniEventsLog::theLog</a> = NULL;
<a name="l00314"></a>00314 }
<a name="l00315"></a>00315 
<a name="l00316"></a>00316 
<a name="l00317"></a><a class="code" href="a00056.html#a2">00317</a> <span class="keywordtype">bool</span> <a class="code" href="a00056.html#a2">omniEventsLog::fileExists</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* filename)<span class="keyword"> const</span>
<a name="l00318"></a>00318 <span class="keyword"></span>{
<a name="l00319"></a>00319   <a class="code" href="a00113.html#a0">STRUCT_STAT</a> sb;
<a name="l00320"></a>00320   <span class="keywordflow">return</span>(::stat(filename,&amp;sb) == 0);
<a name="l00321"></a>00321 }
<a name="l00322"></a>00322 
<a name="l00323"></a>00323 
<a name="l00324"></a><a class="code" href="a00056.html#a5">00324</a> <a class="code" href="a00060.html">PersistNode</a>* <a class="code" href="a00056.html#a5">omniEventsLog::bootstrap</a>(<span class="keywordtype">int</span> port, <span class="keyword">const</span> <span class="keywordtype">char</span>* endPointNoListen)
<a name="l00325"></a>00325 {
<a name="l00326"></a>00326   <span class="comment">//</span>
<a name="l00327"></a>00327   <span class="comment">// Construct a new initialState, from the arguments.</span>
<a name="l00328"></a>00328   <a class="code" href="a00060.html">PersistNode</a>* initialState=<span class="keyword">new</span> <a class="code" href="a00060.html">PersistNode</a>();
<a name="l00329"></a>00329   <a class="code" href="a00060.html">PersistNode</a>* ecf =initialState-&gt;<a class="code" href="a00060.html#a6">addnode</a>(<span class="stringliteral">"ecf"</span>);
<a name="l00330"></a>00330   ecf-&gt;<a class="code" href="a00060.html#a8">addattr</a>(<span class="stringliteral">"port"</span>,port);
<a name="l00331"></a>00331   <span class="keywordflow">if</span>(endPointNoListen &amp;&amp; endPointNoListen[0])
<a name="l00332"></a>00332       ecf-&gt;<a class="code" href="a00060.html#a8">addattr</a>(string(<span class="stringliteral">"endPointNoListen="</span>)+endPointNoListen);
<a name="l00333"></a>00333   <span class="keywordflow">return</span> initialState;
<a name="l00334"></a>00334 } <span class="comment">// bootstrap()</span>
<a name="l00335"></a>00335 
<a name="l00336"></a>00336 
<a name="l00337"></a><a class="code" href="a00056.html#a6">00337</a> <a class="code" href="a00060.html">PersistNode</a>* <a class="code" href="a00056.html#a6">omniEventsLog::parse</a>()
<a name="l00338"></a>00338 {
<a name="l00339"></a>00339   <span class="comment">//</span>
<a name="l00340"></a>00340   <span class="comment">// Restart - parse log file.</span>
<a name="l00341"></a>00341   ifstream persiststream(<a class="code" href="a00056.html#p1">_activeFilename</a>);
<a name="l00342"></a>00342   <span class="keywordflow">if</span>(!persiststream)
<a name="l00343"></a>00343   {
<a name="l00344"></a>00344     cerr &lt;&lt; <span class="stringliteral">"Error: cannot read database file '"</span>
<a name="l00345"></a>00345          &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a> &lt;&lt; <span class="stringliteral">"'."</span> &lt;&lt; endl;
<a name="l00346"></a>00346     <span class="keywordflow">if</span>( <a class="code" href="a00056.html#a2">fileExists</a>(<a class="code" href="a00056.html#p2">_backupFilename</a>) ) 
<a name="l00347"></a>00347     {
<a name="l00348"></a>00348       cerr &lt;&lt;
<a name="l00349"></a>00349         <span class="stringliteral">" Backup file '"</span> &lt;&lt; <a class="code" href="a00056.html#p2">_backupFilename</a> &lt;&lt; <span class="stringliteral">"' exists.\n"</span>
<a name="l00350"></a>00350         <span class="stringliteral">" Either rename it to '"</span> &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a> &lt;&lt; <span class="stringliteral">"' to\n"</span>
<a name="l00351"></a>00351         <span class="stringliteral">" to recover the server's state, or delete it to create a new\n"</span>
<a name="l00352"></a>00352         <span class="stringliteral">" database file."</span> &lt;&lt; endl;
<a name="l00353"></a>00353     }
<a name="l00354"></a>00354     exit(1);
<a name="l00355"></a>00355   }
<a name="l00356"></a>00356   <a class="code" href="a00060.html">PersistNode</a>* initialState=<span class="keyword">new</span> <a class="code" href="a00060.html">PersistNode</a>(persiststream);
<a name="l00357"></a>00357   persiststream.close();
<a name="l00358"></a>00358   
<a name="l00359"></a>00359   <span class="comment">//</span>
<a name="l00360"></a>00360   <span class="comment">// Check that the file contains a valid EventChannelFactory.</span>
<a name="l00361"></a>00361   <span class="keyword">const</span> <span class="keywordtype">char</span>* errorStr =NULL;
<a name="l00362"></a>00362   <a class="code" href="a00060.html">PersistNode</a>* ecf=initialState-&gt;<a class="code" href="a00060.html#a13">child</a>(<span class="stringliteral">"ecf"</span>);
<a name="l00363"></a>00363   <span class="keywordflow">if</span>(!ecf)
<a name="l00364"></a>00364       errorStr=<span class="stringliteral">"Can't find EventChannelFactory."</span>;
<a name="l00365"></a>00365   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ecf-&gt;<a class="code" href="a00060.html#a12">attrLong</a>(<span class="stringliteral">"port"</span>,-1)&lt;=0)
<a name="l00366"></a>00366       errorStr=<span class="stringliteral">"EventChannelFactory is not assigned a valid port."</span>;
<a name="l00367"></a>00367 
<a name="l00368"></a>00368   <span class="keywordflow">if</span>(errorStr)
<a name="l00369"></a>00369   {
<a name="l00370"></a>00370     cerr&lt;&lt;<span class="stringliteral">"Error parsing database '"</span>&lt;&lt;<a class="code" href="a00056.html#p1">_activeFilename</a>&lt;&lt;<span class="stringliteral">"'.\n"</span>
<a name="l00371"></a>00371         &lt;&lt;errorStr&lt;&lt;<span class="stringliteral">" Try deleting the file (and any backup)."</span>&lt;&lt;endl;
<a name="l00372"></a>00372     exit(1);
<a name="l00373"></a>00373   }
<a name="l00374"></a>00374 
<a name="l00375"></a>00375   <span class="keywordflow">return</span> initialState;
<a name="l00376"></a>00376 } <span class="comment">// parse()</span>
<a name="l00377"></a>00377 
<a name="l00378"></a>00378 
<a name="l00379"></a><a class="code" href="a00056.html#a7">00379</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#a7">omniEventsLog::incarnateFactory</a>(<a class="code" href="a00060.html">PersistNode</a>* initialState)
<a name="l00380"></a>00380 {
<a name="l00381"></a>00381   assert(initialState!=NULL);
<a name="l00382"></a>00382 
<a name="l00383"></a>00383   <span class="comment">//</span>
<a name="l00384"></a>00384   <span class="comment">// Open the logstream (The EventChannelFactory might want to write to it).</span>
<a name="l00385"></a>00385   <span class="keywordflow">try</span>
<a name="l00386"></a>00386   {
<a name="l00387"></a>00387     <a class="code" href="a00056.html#b2">openOfstream</a>(<a class="code" href="a00056.html#p0">_logstream</a>,<a class="code" href="a00056.html#p1">_activeFilename</a>,FLAG_APPEND);
<a name="l00388"></a>00388   }
<a name="l00389"></a>00389   <span class="keywordflow">catch</span> (<a class="code" href="a00057.html">IOError</a>&amp; ex)
<a name="l00390"></a>00390   {
<a name="l00391"></a>00391     cerr &lt;&lt; <span class="stringliteral">"Error: cannot "</span>
<a name="l00392"></a>00392          &lt;&lt; (<a class="code" href="a00056.html#a2">fileExists</a>(<a class="code" href="a00056.html#p1">_activeFilename</a>)?<span class="stringliteral">"write to"</span>:<span class="stringliteral">"create new"</span>)
<a name="l00393"></a>00393          &lt;&lt; <span class="stringliteral">" database file '"</span> &lt;&lt; _activeFilename
<a name="l00394"></a>00394          &lt;&lt; <span class="stringliteral">"': "</span> &lt;&lt; strerror(errno) &lt;&lt; endl;
<a name="l00395"></a>00395     cerr &lt;&lt; <span class="stringliteral">"\nUse option '-l' or set the environment variable "</span>
<a name="l00396"></a>00396          &lt;&lt; <a class="code" href="a00091.html#a5">OMNIEVENTS_LOGDIR_ENV_VAR</a>
<a name="l00397"></a>00397          &lt;&lt; <span class="stringliteral">"\nto specify the directory where the files are kept.\n"</span>
<a name="l00398"></a>00398          &lt;&lt; endl;
<a name="l00399"></a>00399     <a class="code" href="a00056.html#p0">_logstream</a>.close();
<a name="l00400"></a>00400     unlink(_activeFilename);
<a name="l00401"></a>00401     exit(1);
<a name="l00402"></a>00402   }
<a name="l00403"></a>00403 
<a name="l00404"></a>00404   <span class="comment">//</span>
<a name="l00405"></a>00405   <span class="comment">// Recreate the persisted factory.</span>
<a name="l00406"></a>00406   <a class="code" href="a00060.html">PersistNode</a>* ecf=initialState-&gt;<a class="code" href="a00060.html#a13">child</a>(<span class="stringliteral">"ecf"</span>);
<a name="l00407"></a>00407   assert(ecf!=NULL);
<a name="l00408"></a>00408   <a class="code" href="a00056.html#p5">_factory</a> =<span class="keyword">new</span> <a class="code" href="a00047.html">EventChannelFactory_i</a>(*ecf);
<a name="l00409"></a>00409   CORBA::Object_var obj;
<a name="l00410"></a>00410   assert(!CORBA::is_nil(obj = <a class="code" href="a00056.html#p5">_factory</a>-&gt;_this()));
<a name="l00411"></a>00411 } <span class="comment">// incarnateFactory</span>
<a name="l00412"></a>00412 
<a name="l00413"></a>00413 
<a name="l00414"></a><a class="code" href="a00056.html#a8">00414</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#a8">omniEventsLog::runWorker</a>()
<a name="l00415"></a>00415 {
<a name="l00416"></a>00416   assert(<a class="code" href="a00056.html#p5">_factory</a>!=NULL);
<a name="l00417"></a>00417 
<a name="l00418"></a>00418   <a class="code" href="a00056.html#p4">_workerThread</a>=<span class="keyword">new</span> <a class="code" href="a00058.html">omniEventsLogWorker</a>(
<a name="l00419"></a>00419       <span class="keyword">this</span>,
<a name="l00420"></a>00420       &amp;<a class="code" href="a00056.html#a10">omniEventsLog::checkpoint</a>, <span class="comment">// member function pointer</span>
<a name="l00421"></a>00421       omni_thread::PRIORITY_NORMAL
<a name="l00422"></a>00422     );
<a name="l00423"></a>00423 }
<a name="l00424"></a>00424 
<a name="l00425"></a>00425 
<a name="l00426"></a><a class="code" href="a00056.html#a11">00426</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#a11">omniEventsLog::output</a>(ostream&amp; os)
<a name="l00427"></a>00427 {
<a name="l00428"></a>00428   <a class="code" href="a00056.html#p5">_factory</a>-&gt;<a class="code" href="a00047.html#a9">output</a>(os);
<a name="l00429"></a>00429   os&lt;&lt;endl;
<a name="l00430"></a>00430 }
<a name="l00431"></a>00431 
<a name="l00432"></a>00432 
<a name="l00433"></a><a class="code" href="a00056.html#a10">00433</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#a10">omniEventsLog::checkpoint</a>(<span class="keywordtype">void</span>)
<a name="l00434"></a>00434 {
<a name="l00435"></a>00435   <span class="keywordtype">int</span> idle_time_btw_chkpt;
<a name="l00436"></a>00436   <span class="keyword">static</span> <span class="keywordtype">int</span> firstCheckPoint = 1;
<a name="l00437"></a>00437   <span class="keywordtype">char</span> *itbc = getenv(<span class="stringliteral">"OMNIEVENTS_ITBC"</span>);
<a name="l00438"></a>00438   <span class="keywordflow">if</span> (itbc == NULL || sscanf(itbc,<span class="stringliteral">"%d"</span>,&amp;idle_time_btw_chkpt) != 1)
<a name="l00439"></a>00439   {
<a name="l00440"></a>00440     idle_time_btw_chkpt=<a class="code" href="a00091.html#a6">OMNIEVENTS_LOG_CHECKPOINT_PERIOD</a>;
<a name="l00441"></a>00441   }
<a name="l00442"></a>00442 
<a name="l00443"></a>00443   omni_mutex <a class="code" href="a00131.html#a0">mutex</a>;
<a name="l00444"></a>00444   omni_condition cond(&amp;mutex);
<a name="l00445"></a>00445 
<a name="l00446"></a>00446   mutex.lock();
<a name="l00447"></a>00447   <span class="keywordflow">while</span> (1) {
<a name="l00448"></a>00448 
<a name="l00449"></a>00449     <span class="comment">// Take an initial checkpoint the first time. All subsequent</span>
<a name="l00450"></a>00450     <span class="comment">// checkpoints are conditionally tested on whether they are</span>
<a name="l00451"></a>00451     <span class="comment">// needed or not.</span>
<a name="l00452"></a>00452 
<a name="l00453"></a>00453     <span class="keywordflow">if</span> (! firstCheckPoint)
<a name="l00454"></a>00454     {
<a name="l00455"></a>00455        <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> s, n;
<a name="l00456"></a>00456        omni_thread::get_time(&amp;s, &amp;n, idle_time_btw_chkpt);
<a name="l00457"></a>00457        cond.timedwait(s,n);
<a name="l00458"></a>00458 
<a name="l00459"></a>00459        <a class="code" href="a00056.html#p7">_lock</a>.lock();
<a name="l00460"></a>00460        <span class="keywordflow">if</span>(!<a class="code" href="a00056.html#p6">_checkpointNeeded</a>)
<a name="l00461"></a>00461        {
<a name="l00462"></a>00462           <a class="code" href="a00056.html#p7">_lock</a>.unlock();
<a name="l00463"></a>00463           <span class="keywordflow">continue</span>;
<a name="l00464"></a>00464        }
<a name="l00465"></a>00465     }
<a name="l00466"></a>00466     <span class="keywordflow">else</span>
<a name="l00467"></a>00467     {
<a name="l00468"></a>00468        <a class="code" href="a00056.html#p7">_lock</a>.lock();
<a name="l00469"></a>00469        firstCheckPoint = 0;
<a name="l00470"></a>00470     }
<a name="l00471"></a>00471   
<a name="l00472"></a>00472     <a class="code" href="a00116.html#a2">DB</a>(1,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Checkpointing Phase 1: Prepare."</span>)
<a name="l00473"></a>00473   
<a name="l00474"></a>00474     ofstream ckpf;
<a name="l00475"></a>00475     <span class="keywordtype">int</span> fd = -1;
<a name="l00476"></a>00476   
<a name="l00477"></a>00477     <span class="keywordflow">try</span>
<a name="l00478"></a>00478     {
<a name="l00479"></a>00479       <span class="keywordflow">try</span>
<a name="l00480"></a>00480       {
<a name="l00481"></a>00481         <a class="code" href="a00056.html#b2">openOfstream</a>(ckpf,<a class="code" href="a00056.html#p3">_checkpointFilename</a>,FLAG_TRUNCATE|FLAG_SYNC,&amp;fd);
<a name="l00482"></a>00482       }
<a name="l00483"></a>00483       <span class="keywordflow">catch</span>(<a class="code" href="a00057.html">IOError</a>&amp; ex)
<a name="l00484"></a>00484       {
<a name="l00485"></a>00485         <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: cannot open checkpoint file '"</span>
<a name="l00486"></a>00486              &lt;&lt; <a class="code" href="a00056.html#p3">_checkpointFilename</a> &lt;&lt; <span class="stringliteral">"' for writing."</span>)
<a name="l00487"></a>00487         <span class="keywordflow">throw</span>;
<a name="l00488"></a>00488       }
<a name="l00489"></a>00489   
<a name="l00490"></a>00490       <a class="code" href="a00056.html#a11">output</a>(ckpf);
<a name="l00491"></a>00491   
<a name="l00492"></a>00492       ckpf.close();
<a name="l00493"></a>00493       <span class="keywordflow">if</span>(!ckpf)
<a name="l00494"></a>00494           <span class="keywordflow">throw</span> <a class="code" href="a00057.html">IOError</a>();
<a name="l00495"></a>00495   
<a name="l00496"></a>00496   <span class="comment">// a bug in sparcworks C++ means that the fd doesn't get closed.</span>
<a name="l00497"></a>00497 <span class="preprocessor">#if defined(__sunos__) &amp;&amp; defined(__SUNPRO_CC) &amp;&amp; __SUNPRO_CC &lt; 0x500</span>
<a name="l00498"></a>00498 <span class="preprocessor"></span>      <span class="keywordflow">if</span>(close(fd) &lt; 0)
<a name="l00499"></a>00499           <span class="keywordflow">throw</span> <a class="code" href="a00057.html">IOError</a>();
<a name="l00500"></a>00500 <span class="preprocessor">#endif</span>
<a name="l00501"></a>00501 <span class="preprocessor"></span>  
<a name="l00502"></a>00502     }
<a name="l00503"></a>00503     <span class="keywordflow">catch</span>(<a class="code" href="a00057.html">IOError</a>&amp; ex)
<a name="l00504"></a>00504     {
<a name="l00505"></a>00505       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>()&lt;&lt;<span class="stringliteral">"I/O error writing checkpoint file: "</span>&lt;&lt;strerror(errno)
<a name="l00506"></a>00506            &lt;&lt;<span class="stringliteral">"\nAbandoning checkpoint"</span>)
<a name="l00507"></a>00507       ckpf.close();
<a name="l00508"></a>00508   <span class="comment">// a bug in sparcworks C++ means that the fd doesn't get closed.</span>
<a name="l00509"></a>00509 <span class="preprocessor">#if defined(__sunos__) &amp;&amp; defined(__SUNPRO_CC) &amp;&amp; __SUNPRO_CC &lt; 0x500</span>
<a name="l00510"></a>00510 <span class="preprocessor"></span>      close(fd);
<a name="l00511"></a>00511 <span class="preprocessor">#endif</span>
<a name="l00512"></a>00512 <span class="preprocessor"></span>      unlink(<a class="code" href="a00056.html#p3">_checkpointFilename</a>);
<a name="l00513"></a>00513       <a class="code" href="a00056.html#p7">_lock</a>.unlock();
<a name="l00514"></a>00514       <span class="keywordflow">continue</span>;
<a name="l00515"></a>00515     }
<a name="l00516"></a>00516   
<a name="l00517"></a>00517     <span class="comment">//</span>
<a name="l00518"></a>00518     <span class="comment">// Now commit the checkpoint to become the active log.</span>
<a name="l00519"></a>00519     <span class="comment">//</span>
<a name="l00520"></a>00520   
<a name="l00521"></a>00521     <a class="code" href="a00116.html#a2">DB</a>(1,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Checkpointing Phase 2: Commit."</span>)
<a name="l00522"></a>00522 
<a name="l00523"></a>00523   <span class="comment">// a bug in sparcworks C++ means that the fd doesn't get closed.</span>
<a name="l00524"></a>00524 <span class="preprocessor">#if defined(__sunos__) &amp;&amp; defined(__SUNPRO_CC) &amp;&amp; __SUNPRO_CC &lt; 0x500</span>
<a name="l00525"></a>00525 <span class="preprocessor"></span>    close(<a class="code" href="a00056.html#p0">_logstream</a>.rdbuf()-&gt;fd());
<a name="l00526"></a>00526 <span class="preprocessor">#endif</span>
<a name="l00527"></a>00527 <span class="preprocessor"></span>  
<a name="l00528"></a>00528     <a class="code" href="a00056.html#p0">_logstream</a>.close();
<a name="l00529"></a>00529   
<a name="l00530"></a>00530     unlink(<a class="code" href="a00056.html#p2">_backupFilename</a>);
<a name="l00531"></a>00531   
<a name="l00532"></a>00532 <span class="preprocessor">#if defined(__WIN32__)</span>
<a name="l00533"></a>00533 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(rename(<a class="code" href="a00056.html#p1">_activeFilename</a>, <a class="code" href="a00056.html#p2">_backupFilename</a>) != 0)
<a name="l00534"></a>00534 <span class="preprocessor">#elif defined(__VMS)</span>
<a name="l00535"></a>00535 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(rename(<a class="code" href="a00056.html#p1">_activeFilename</a>, <a class="code" href="a00056.html#p2">_backupFilename</a>) &lt; 0)
<a name="l00536"></a>00536 <span class="preprocessor">#else</span>
<a name="l00537"></a>00537 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(link(<a class="code" href="a00056.html#p1">_activeFilename</a>,<a class="code" href="a00056.html#p2">_backupFilename</a>) &lt; 0)
<a name="l00538"></a>00538 <span class="preprocessor">#endif</span>
<a name="l00539"></a>00539 <span class="preprocessor"></span>    {
<a name="l00540"></a>00540       <span class="comment">// Failure here leaves old active and checkpoint file.</span>
<a name="l00541"></a>00541       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: failed to link backup file '"</span>
<a name="l00542"></a>00542            &lt;&lt; <a class="code" href="a00056.html#p2">_backupFilename</a> &lt;&lt; <span class="stringliteral">"' to old log file '"</span>
<a name="l00543"></a>00543            &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a> &lt;&lt; <span class="stringliteral">"'."</span>)
<a name="l00544"></a>00544       exit(1);
<a name="l00545"></a>00545     }
<a name="l00546"></a>00546   
<a name="l00547"></a>00547 <span class="preprocessor">#if !defined( __VMS) &amp;&amp; !defined(__WIN32__)</span>
<a name="l00548"></a>00548 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(unlink(<a class="code" href="a00056.html#p1">_activeFilename</a>) &lt; 0)
<a name="l00549"></a>00549     {
<a name="l00550"></a>00550       <span class="comment">// Failure here leaves active and backup pointing to the same (old) file.</span>
<a name="l00551"></a>00551       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: failed to unlink old log file '"</span>
<a name="l00552"></a>00552            &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a> &lt;&lt; <span class="stringliteral">"': "</span> &lt;&lt; strerror(errno))
<a name="l00553"></a>00553       exit(1);
<a name="l00554"></a>00554     }
<a name="l00555"></a>00555 <span class="preprocessor">#endif</span>
<a name="l00556"></a>00556 <span class="preprocessor"></span>  
<a name="l00557"></a>00557 <span class="preprocessor">#if defined(__WIN32__)</span>
<a name="l00558"></a>00558 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(rename(<a class="code" href="a00056.html#p3">_checkpointFilename</a>,<a class="code" href="a00056.html#p1">_activeFilename</a>) != 0)
<a name="l00559"></a>00559 <span class="preprocessor">#elif defined(__VMS)</span>
<a name="l00560"></a>00560 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(rename(<a class="code" href="a00056.html#p3">_checkpointFilename</a>,<a class="code" href="a00056.html#p1">_activeFilename</a>) &lt; 0)
<a name="l00561"></a>00561 <span class="preprocessor">#else</span>
<a name="l00562"></a>00562 <span class="preprocessor"></span>    <span class="keywordflow">if</span>(link(<a class="code" href="a00056.html#p3">_checkpointFilename</a>,<a class="code" href="a00056.html#p1">_activeFilename</a>) &lt; 0)
<a name="l00563"></a>00563 <span class="preprocessor">#endif</span>
<a name="l00564"></a>00564 <span class="preprocessor"></span>    {
<a name="l00565"></a>00565       <span class="comment">// Failure here leaves no active but backup points to the old file.</span>
<a name="l00566"></a>00566       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: failed to link log file '"</span> &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a>
<a name="l00567"></a>00567            &lt;&lt; <span class="stringliteral">"' to checkpoint file '"</span> &lt;&lt; <a class="code" href="a00056.html#p3">_checkpointFilename</a> &lt;&lt; <span class="stringliteral">"'."</span>)
<a name="l00568"></a>00568       exit(1);
<a name="l00569"></a>00569     }
<a name="l00570"></a>00570   
<a name="l00571"></a>00571 <span class="preprocessor">#if !defined( __VMS) &amp;&amp; !defined(__WIN32__)</span>
<a name="l00572"></a>00572 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (unlink(<a class="code" href="a00056.html#p3">_checkpointFilename</a>) &lt; 0)
<a name="l00573"></a>00573     {
<a name="l00574"></a>00574       <span class="comment">// Failure here leaves active and checkpoint pointing to the same file.</span>
<a name="l00575"></a>00575       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: failed to unlink checkpoint file '"</span>
<a name="l00576"></a>00576            &lt;&lt; <a class="code" href="a00056.html#p3">_checkpointFilename</a> &lt;&lt; <span class="stringliteral">"'."</span>)
<a name="l00577"></a>00577       exit(1);
<a name="l00578"></a>00578     }
<a name="l00579"></a>00579 <span class="preprocessor">#endif</span>
<a name="l00580"></a>00580 <span class="preprocessor"></span>  
<a name="l00581"></a>00581     <span class="keywordflow">try</span>
<a name="l00582"></a>00582     {
<a name="l00583"></a>00583       <a class="code" href="a00056.html#b2">openOfstream</a>(<a class="code" href="a00056.html#p0">_logstream</a>,<a class="code" href="a00056.html#p1">_activeFilename</a>,FLAG_APPEND|FLAG_SYNC,&amp;fd);
<a name="l00584"></a>00584     }
<a name="l00585"></a>00585     <span class="keywordflow">catch</span> (<a class="code" href="a00057.html">IOError</a>&amp; ex)
<a name="l00586"></a>00586     {
<a name="l00587"></a>00587       <a class="code" href="a00116.html#a2">DB</a>(0,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Error: cannot open new log file '"</span> &lt;&lt; <a class="code" href="a00056.html#p1">_activeFilename</a>
<a name="l00588"></a>00588            &lt;&lt; <span class="stringliteral">"' for writing."</span>)
<a name="l00589"></a>00589       exit(1);
<a name="l00590"></a>00590     }
<a name="l00591"></a>00591   
<a name="l00592"></a>00592     <a class="code" href="a00116.html#a2">DB</a>(1,<a class="code" href="a00141.html#a2">ts</a>.<a class="code" href="a00078.html#a1">t</a>() &lt;&lt; <span class="stringliteral">"Checkpointing completed."</span>)
<a name="l00593"></a>00593   
<a name="l00594"></a>00594     <a class="code" href="a00056.html#p6">_checkpointNeeded</a>=<span class="keyword">false</span>;
<a name="l00595"></a>00595     <a class="code" href="a00056.html#p7">_lock</a>.unlock();
<a name="l00596"></a>00596   }
<a name="l00597"></a>00597   mutex.unlock();
<a name="l00598"></a>00598 } <span class="comment">// checkpoint</span>
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 
<a name="l00611"></a><a class="code" href="a00056.html#b0">00611</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#b0">omniEventsLog::initializeFileNames</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* logdir)
<a name="l00612"></a>00612 {
<a name="l00613"></a>00613   <span class="keywordflow">if</span>(!logdir)
<a name="l00614"></a>00614       logdir=getenv(<a class="code" href="a00091.html#a5">OMNIEVENTS_LOGDIR_ENV_VAR</a>);
<a name="l00615"></a>00615   <span class="keywordflow">if</span>(!logdir)
<a name="l00616"></a>00616       logdir=<a class="code" href="a00091.html#a4">OMNIEVENTS_LOG_DEFAULT_LOCATION</a>;
<a name="l00617"></a>00617 
<a name="l00618"></a>00618   <span class="keyword">const</span> <span class="keywordtype">char</span>* logname =<span class="stringliteral">"omnievents-"</span>;
<a name="l00619"></a>00619   <span class="keywordtype">char</span> hostname[<a class="code" href="a00103.html#a0">MAXHOSTNAMELEN</a>];
<a name="l00620"></a>00620   <span class="keywordflow">if</span> (0!=<a class="code" href="a00103.html#a1">gethostname</a>(hostname,<a class="code" href="a00103.html#a0">MAXHOSTNAMELEN</a>))
<a name="l00621"></a>00621   {
<a name="l00622"></a>00622     cerr &lt;&lt; <span class="stringliteral">"Error: cannot get the name of this host."</span> &lt;&lt; endl;
<a name="l00623"></a>00623     exit(1);
<a name="l00624"></a>00624   }
<a name="l00625"></a>00625   <span class="keyword">const</span> <span class="keywordtype">char</span>* sep =<span class="stringliteral">""</span>;
<a name="l00626"></a>00626 
<a name="l00627"></a>00627 <span class="preprocessor">#if defined(__WIN32__)</span>
<a name="l00628"></a>00628 <span class="preprocessor"></span>  sep=<span class="stringliteral">"\\"</span>;
<a name="l00629"></a>00629 <span class="preprocessor">#elif defined(__VMS)</span>
<a name="l00630"></a>00630 <span class="preprocessor"></span>  <span class="keywordtype">char</span> last( logdir[strlen(logdir)-1] );
<a name="l00631"></a>00631   <span class="keywordflow">if</span> (last != <span class="charliteral">':'</span> &amp;&amp; last != <span class="charliteral">']'</span>)
<a name="l00632"></a>00632   {
<a name="l00633"></a>00633     cerr &lt;&lt; <span class="stringliteral">"Error: "</span> &lt;&lt; <a class="code" href="a00091.html#a5">OMNIEVENTS_LOGDIR_ENV_VAR</a> &lt;&lt; <span class="stringliteral">" ("</span> &lt;&lt; logdir
<a name="l00634"></a>00634          &lt;&lt; <span class="stringliteral">") is not a directory name."</span> &lt;&lt; endl;
<a name="l00635"></a>00635     exit(1);
<a name="l00636"></a>00636   }
<a name="l00637"></a>00637 <span class="preprocessor">#else // Unix</span>
<a name="l00638"></a>00638 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (logdir[0] != <span class="charliteral">'/'</span>)
<a name="l00639"></a>00639   {
<a name="l00640"></a>00640     cerr &lt;&lt; <span class="stringliteral">"Error: "</span> &lt;&lt; <a class="code" href="a00091.html#a5">OMNIEVENTS_LOGDIR_ENV_VAR</a> &lt;&lt; <span class="stringliteral">" ("</span> &lt;&lt; logdir
<a name="l00641"></a>00641          &lt;&lt; <span class="stringliteral">") is not an absolute path name."</span> &lt;&lt; endl;
<a name="l00642"></a>00642     exit(1);
<a name="l00643"></a>00643   }
<a name="l00644"></a>00644   <span class="keywordflow">if</span> (logdir[strlen(logdir)-1] != <span class="charliteral">'/'</span>)
<a name="l00645"></a>00645       sep=<span class="stringliteral">"/"</span>;
<a name="l00646"></a>00646 <span class="preprocessor">#endif</span>
<a name="l00647"></a>00647 <span class="preprocessor"></span>
<a name="l00648"></a>00648   <span class="comment">// VMS_SEMICOLON specifies latest version of the file on VMS</span>
<a name="l00649"></a>00649   <span class="comment">// (essentially, we're saying we don't want to use VMS file versioning).</span>
<a name="l00650"></a>00650 
<a name="l00651"></a>00651   <a class="code" href="a00056.html#b1">setFilename</a>(<a class="code" href="a00056.html#p1">_activeFilename</a>,logdir,sep,logname,hostname,<span class="stringliteral">".log"</span> <a class="code" href="a00113.html#a1">VMS_SEMICOLON</a>);
<a name="l00652"></a>00652   <a class="code" href="a00056.html#b1">setFilename</a>(<a class="code" href="a00056.html#p2">_backupFilename</a>,logdir,sep,logname,hostname,<span class="stringliteral">".bak"</span> <a class="code" href="a00113.html#a1">VMS_SEMICOLON</a>);
<a name="l00653"></a>00653   <a class="code" href="a00056.html#b1">setFilename</a>(
<a name="l00654"></a>00654           <a class="code" href="a00056.html#p3">_checkpointFilename</a>,logdir,sep,logname,hostname,<span class="stringliteral">".ckp"</span> <a class="code" href="a00113.html#a1">VMS_SEMICOLON</a>);
<a name="l00655"></a>00655 }
<a name="l00656"></a>00656 
<a name="l00657"></a>00657 
<a name="l00661"></a><a class="code" href="a00056.html#b1">00661</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#b1">omniEventsLog::setFilename</a>(
<a name="l00662"></a>00662   <span class="keywordtype">char</span>*&amp; filename,     <span class="keyword">const</span> <span class="keywordtype">char</span>* logdir,   <span class="keyword">const</span> <span class="keywordtype">char</span>* sep,
<a name="l00663"></a>00663   <span class="keyword">const</span> <span class="keywordtype">char</span>* logname, <span class="keyword">const</span> <span class="keywordtype">char</span>* hostname, <span class="keyword">const</span> <span class="keywordtype">char</span>* ext)
<a name="l00664"></a>00664 {
<a name="l00665"></a>00665   size_t len=1+
<a name="l00666"></a>00666     strlen(logdir)+strlen(sep)+strlen(logname)+strlen(hostname)+strlen(ext);
<a name="l00667"></a>00667   filename=<span class="keyword">new</span> <span class="keywordtype">char</span>[len];
<a name="l00668"></a>00668   sprintf(filename,<span class="stringliteral">"%s%s%s%s%s"</span>,logdir,sep,logname,hostname,ext);
<a name="l00669"></a>00669 }
<a name="l00670"></a>00670 
<a name="l00671"></a>00671 
<a name="l00685"></a><a class="code" href="a00056.html#b2">00685</a> <span class="keywordtype">void</span> <a class="code" href="a00056.html#b2">omniEventsLog::openOfstream</a>(
<a name="l00686"></a>00686   ofstream&amp; s, <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span>* fd)
<a name="l00687"></a>00687 {
<a name="l00688"></a>00688 <span class="preprocessor">#if defined(HAVE_FSTREAM_OPEN)</span>
<a name="l00689"></a>00689 <span class="preprocessor"></span><span class="preprocessor">#  ifdef HAVE_STD_IOSTREAM</span>
<a name="l00690"></a>00690 <span class="preprocessor"></span>      ios::openmode openmodeflags =ios::out|ios::openmode(flags);
<a name="l00691"></a>00691 <span class="preprocessor">#  else</span>
<a name="l00692"></a>00692 <span class="preprocessor"></span>      <span class="keywordtype">int</span>           openmodeflags =ios::out|flags;
<a name="l00693"></a>00693 <span class="preprocessor">#  endif</span>
<a name="l00694"></a>00694 <span class="preprocessor"></span>
<a name="l00695"></a>00695 <span class="preprocessor">#  ifdef FSTREAM_OPEN_PROT</span>
<a name="l00696"></a>00696 <span class="preprocessor"></span>      s.open(filename,openmodeflags,0644);
<a name="l00697"></a>00697 <span class="preprocessor">#  else</span>
<a name="l00698"></a>00698 <span class="preprocessor"></span>      s.open(filename,openmodeflags);
<a name="l00699"></a>00699 <span class="preprocessor">#  endif</span>
<a name="l00700"></a>00700 <span class="preprocessor"></span>      <span class="keywordflow">if</span> (!s)
<a name="l00701"></a>00701           <span class="keywordflow">throw</span> <a class="code" href="a00057.html">IOError</a>();
<a name="l00702"></a>00702 
<a name="l00703"></a>00703 <span class="preprocessor">#elif defined(HAVE_FSTREAM_ATTACH)</span>
<a name="l00704"></a>00704 <span class="preprocessor"></span><span class="preprocessor">#  ifdef __WIN32__</span>
<a name="l00705"></a>00705 <span class="preprocessor"></span>      <span class="keywordtype">int</span> localFd = _open(filename, O_WRONLY | flags, _S_IWRITE);
<a name="l00706"></a>00706 <span class="preprocessor">#  else</span>
<a name="l00707"></a>00707 <span class="preprocessor"></span>      <span class="keywordtype">int</span> localFd = open(filename, O_WRONLY | flags, 0644);
<a name="l00708"></a>00708 <span class="preprocessor">#  endif </span><span class="comment">/* __WIN32__ */</span>
<a name="l00709"></a>00709       <span class="keywordflow">if</span> (localFd &lt; 0)
<a name="l00710"></a>00710           <span class="keywordflow">throw</span> <a class="code" href="a00057.html">IOError</a>();
<a name="l00711"></a>00711       <span class="keywordflow">if</span>(fd)
<a name="l00712"></a>00712           (*fd)=localFd;
<a name="l00713"></a>00713       s.attach(localFd);
<a name="l00714"></a>00714 <span class="preprocessor">#endif</span>
<a name="l00715"></a>00715 <span class="preprocessor"></span>}
<a name="l00716"></a>00716 
<a name="l00717"></a>00717 
<a name="l00718"></a>00718 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00719"></a>00719 <span class="comment">//           OmniEvents Log Worker Implementation</span>
<a name="l00720"></a>00720 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00721"></a><a class="code" href="a00058.html#a0">00721</a> <a class="code" href="a00058.html#d0">omniEventsLogWorker::omniEventsLogWorker</a>(
<a name="l00722"></a>00722   <a class="code" href="a00056.html">omniEventsLog</a>* object,
<a name="l00723"></a>00723   Method         method,
<a name="l00724"></a>00724   priority_t     priority
<a name="l00725"></a>00725 ):omni_thread(NULL,priority)
<a name="l00726"></a>00726 {
<a name="l00727"></a>00727   <a class="code" href="a00116.html#a2">DB</a>(15, <span class="stringliteral">"omniEventsLogWorker::omniEventsLogWorker()"</span>);
<a name="l00728"></a>00728 
<a name="l00729"></a>00729   <a class="code" href="a00058.html#r1">_method</a>=method;
<a name="l00730"></a>00730   <a class="code" href="a00058.html#r0">_object</a>=object;
<a name="l00731"></a>00731 
<a name="l00732"></a>00732   start_undetached();
<a name="l00733"></a>00733 }
<a name="l00734"></a>00734 
<a name="l00735"></a>00735 
<a name="l00736"></a><a class="code" href="a00058.html#a1">00736</a> <span class="keywordtype">void</span>* <a class="code" href="a00058.html#a1">omniEventsLogWorker::run_undetached</a>(<span class="keywordtype">void</span> *)
<a name="l00737"></a>00737 {
<a name="l00738"></a>00738   <span class="keywordflow">try</span> {
<a name="l00739"></a>00739     <a class="code" href="a00116.html#a2">DB</a>(15, <span class="stringliteral">"omniEventsLogWorker : run_undetached Start"</span>);
<a name="l00740"></a>00740     (<a class="code" href="a00058.html#r0">_object</a>-&gt;*<a class="code" href="a00058.html#r1">_method</a>)();
<a name="l00741"></a>00741     <a class="code" href="a00116.html#a2">DB</a>(15, <span class="stringliteral">"omniEventsLogWorker : run_undetached End"</span>);
<a name="l00742"></a>00742   }
<a name="l00743"></a>00743   <span class="keywordflow">catch</span> (CORBA::SystemException&amp; ex) {
<a name="l00744"></a>00744     <a class="code" href="a00116.html#a2">DB</a>(0,<span class="stringliteral">"omniEventsLogWorker killed by CORBA system exception"</span>
<a name="l00745"></a>00745        <a class="code" href="a00116.html#a1">IF_OMNIORB4</a>(<span class="stringliteral">": "</span>&lt;&lt;ex._name()&lt;&lt;<span class="stringliteral">" ("</span>&lt;&lt;<a class="code" href="a00116.html#a3">NP_MINORSTRING</a>(ex)&lt;&lt;<span class="stringliteral">")"</span>) <span class="stringliteral">"."</span>)
<a name="l00746"></a>00746   }
<a name="l00747"></a>00747   <span class="keywordflow">catch</span> (CORBA::Exception&amp; ex) {
<a name="l00748"></a>00748     <a class="code" href="a00116.html#a2">DB</a>(0,<span class="stringliteral">"omniEventsLogWorker killed by CORBA exception"</span>
<a name="l00749"></a>00749        <a class="code" href="a00116.html#a1">IF_OMNIORB4</a>(<span class="stringliteral">": "</span>&lt;&lt;ex._name()&lt;&lt;) <span class="stringliteral">"."</span>)
<a name="l00750"></a>00750   }
<a name="l00751"></a>00751   <span class="keywordflow">catch</span>(...) {
<a name="l00752"></a>00752     <a class="code" href="a00116.html#a2">DB</a>(0,<span class="stringliteral">"omniEventsLogWorker killed by unknown exception."</span>)
<a name="l00753"></a>00753   }
<a name="l00754"></a>00754   <span class="keywordflow">return</span> NULL;
<a name="l00755"></a>00755 }
<a name="l00756"></a>00756 
<a name="l00757"></a><a class="code" href="a00058.html#a2">00757</a> <a class="code" href="a00058.html#a2">omniEventsLogWorker::~omniEventsLogWorker</a>()
<a name="l00758"></a>00758 {
<a name="l00759"></a>00759   <a class="code" href="a00116.html#a2">DB</a>(20, <span class="stringliteral">"omniEventsLogWorker::~omniEventsLogWorker()"</span>);
<a name="l00760"></a>00760 }
<a name="l00761"></a>00761 
<a name="l00762"></a>00762 
<a name="l00763"></a>00763 }; <span class="comment">// end namespace OmniEvents</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Aug 26 20:56:14 2005 for OmniEvents by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.3-20050530 </small></address>
</body>
</html>