File: commoncpp2.texi

package info (click to toggle)
libcommoncpp2 1.8.1-7
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 5,272 kB
  • sloc: cpp: 29,219; sh: 10,352; ansic: 1,134; makefile: 232; xml: 5
file content (1413 lines) | stat: -rw-r--r-- 56,039 bytes parent folder | download | duplicates (9)
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
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
\input texinfo    @c -*-texinfo-*-
@c %** start of header
@setfilename commoncpp2.info
@settitle GNU Common C++ 2
@afourpaper
@setchapternewpage odd
@documentlanguage en
@documentencoding ISO-8859-1
@c %** end of header

@set EDITION 1.0pre0
@set VERSION 1.0
@set UPDATED September 2002

@dircategory Development
@direntry
* GNU Common C++ 2: (commoncpp2).     GNU Common C++ 2 Framework Documentation.
@end direntry

@c -----------------------------------------------------------------------

@c %** start of summary description and copyright
@ifnottex
GNU Common C++ 2 is the second major release of a C++ framework
offering portable support for threading, sockets, file access,
daemons, persistence, serial I/O, XML parsing, and system services,
initially started by David Sugar and Daniel Silverstone.

Copyright @copyright{} 1999, 2000, 2001, 2002 Open Source Telecom Corporation.
@include fdlnotice.texi
@end ifnottex
@c %** end of summary description and copyright

@c -----------------------------------------------------------------------

@c %** start of title and copyright page
@shorttitlepage @titlefont{GNU Common C++ 2}
@titlepage
@sp 10
@title GNU Common C++ 2
@subtitle 
@subtitle @value{EDITION}th Edition, covering GNU Common C++ version @value{VERSION}
@subtitle @value{UPDATED}
@author David Sugar wrote this document.
@author Federico Montesino Pouzols updated and formatted it in @TeX{}Info

@page
@vskip 0pt plus 1filll
@center{Copyright @copyright{} 1999, 2000, 2001, 2002 Open Source Telecom Corporation}
@include fdlnotice.texi
@page
@end titlepage
@c %** end of title and copyright page

@c -----------------------------------------------------------------------

@c %** start of top node and master menu
@ifnottex
@node Top
@top
This document describes GNU Common C++ 2, the second major release of
a C++ framework offering portable support for threading, sockets, file
access, daemons, persistence, serial I/O, XML parsing, and system
services, initially started by David Sugar and Daniel Silverstone.

This is the edition @value{EDITION} of this manual and documents
GNU Common C++ 2 version @value{VERSION}.
@end ifnottex

@contents

@menu
* Introduction::                  What GNU Common C++ and this manual are.
* Distribution::                  How to get GNU Common C++.
* Framework Description::         GNU Common C++ classes.
* Extras::                        GNU Common C++ extras.
* Serverlets::                    GNU Common C++ serverlets.
* Compiler Options::              Compiler options to use with GNU Common C++.
* Automake Services::             GNU Common C++ automake services.
* Configuring Sources::           Configuring GNU Common C++ sources.
* Developer Documentation::       Information of interest for CC++ developers.
* Licenses::                      Library and documentation licenses.
* Class and Data Type Index::     Index of Common C++ classes and data types.
* Method and Function Index::     Index of Common C++ methods and functions.
* Concept Index::                 Index of concepts.
@end menu
@c %** end of top node and master menu

@c -----------------------------------------------------------------------

@c %** start of body
@node Introduction
@comment  node-name,  next,  previous,  up
@chapter Introduction
@cindex Introduction

@quotation
@strong{PLEASE NOTE;} This is a preliminary version of this
document. Some information may not be complete or even somewhat
obsolete; bug reports, suggestions and contributions are welcome.
@end quotation

@cindex reference manual
In writing this document I hope to better explain what the GNU Common
C++ library is about and how it may be used in developing your own C++
applications.  This document is intended as an overview and unifying
document to support the already detailed class-by-class function
descriptions found and browsable in the "doc" subdirectory of the
Common C++ distribution.

GNU Common C++ offers a set of "portable" classes that can be used to 
build highly portable applications in C++.  In particular, Common C++ 
offers classes that abstract threading, sockets, synchronization, serial 
I/O, "config" file parsing, class object persistence, shared object module
loading, daemon management, and optimized "block" and memory mapped file
I/O under a set of consistent classes that your application can then
be built from.  The goal is to write your application to use the portable
abstract services and classes of the GNU Common C++ libraries rather than
having to access low level system services directly.

There is a large diversity of views in how one should code a C++
framework.  Since a large number of older C++ compilers remain in
everyday use, I choose to use what I felt was an appropriate set of
C++ language features and practices to provide the greatest compiler
compatibility and to generate the most optimized code for GNU Common
C++.  To further reduce the overhead of writing GNU Common C++
applications, I have split the primary library image itself into
several different shared libraries.  This allowed me to collect the
more obscure and less likely to be used features into separate
libraries which need never be loaded.

Finally, in designing GNU Common C++, I assume that class extension
(inheritance) is the primary vehicle for application development. The 
GNU Common C++ framework, while offering many classes that are usable
directly, is designed for one to create applications by extending Common
C++ "base" classes into an application specific versions of said classes
as needed. 


@c -----------------------------------------------------------------------
@node Distribution
@chapter Distribution
@cindex distribution

@cindex free software
@cindex GNU GPL
@cindex linking exception
@cindex GNU FDL
@cindex philosophy
This manual is licensed under the terms of the @acronym{GNU} Free
Documentation License, @xref{GNU Free Documentation License}.

@acronym{GNU} Common C++ is free software (see
@url{http://www.gnu.org/philosophy/philosophy.html}). There are
several ways to get @acronym{GNU} Common C++, refer to
@url{http://www.gnu.org} and
@url{http://www.gnu.org/software/commoncpp/}.

The @acronym{GNU} Common C++ framework is licensed under the terms of
the @acronym{GNU} General Public License, @xref{GNU General Public
License}, plus a linking exception, @xref{GNU Common C++ Linking
Exception}, that grants additional privileges. These privileges are
similar to the terms Guile is licensed under and constitute privileges
similar to the LGPL. David Sugar explains why these licensing terms
were chosen for Common C++ as follows:

The one problem I recall immediately with the LGPL as it applies to
C++ class frameworks is the way it defines and refers to ``linking''
vs ``derived works''.  In concept, a C++ header with inline members or
template is not ``linked'' in the same sense as one might presume the
meaning in traditional C library, and what does one make of a class
who's base class is defined in a header in a LGPL protected library?
Is creating a derived C++ class purely a linking operation or creating
a derived/composite work?

At the time it seemed simpler to take the language of the GPL and
provide an appropriate privileges to allow Common C++ to be used in
ways that achieve the same goals of the LGPL, but without using the
same choice of language for this that is found in the LGPL.  We
actually looked at the Guile license, which also faced many of these
questions, and choose to use their methodology for creating a special
privilege in this regard.  Of course, this was a number of years ago,
and the language of the LGPL (and GPL) has evolved over time to better
address the needs of object oriented frameworks.  If the language of
the current LGPL were close enough to resolving these goals, I think
we would likely switch to it, as that would resolve some confusion
over the exact license status.  I have found it simpler to explain it
as a LGPL-like license since we were trying for much the same effect
within the context of a C++ framework, and most people basically
understand what the LGPL is.


@c -----------------------------------------------------------------------
@node Framework Description
@chapter Framework Description
@cindex Framework Description

This chapter provides a description of the GNU Common C++ framework
main components.

@menu
* Overall Concepts::             Global GNU Common C++ Practices.
* Threading Concepts::           GNU Common C++ Threading Concepts.
* Synchronization::              GNU Common C++ Synchronization.
* Sockets::                      GNU Common C++ Sockets.
* Serial I/O::                   GNU Common C++ Serial I/O.
* Block I/O::                    GNU Common C++ Block I/O.
* Daemons::                      GNU Common C++ Daemon Support.
* Persistence::                  GNU Common C++ Persistence.
* Configuration and Misc.::      GNU Common C++ Configuration and Other Things.
* Numbers and Dates::            GNU Common C++ Numbers and Dates Manipulation.
* URL Streams::                  GNU Common C++ HTTP Support.
* XML Streams and RPC::          GNU Common C++ XML Streams and RPC.
* Exceptions::                   GNU Common C++ Exception Model.
* Templates::                    GNU Common C++ Template Subsystem
@end menu

@c -----------------------------------------------------------------------
@node Overall Concepts
@section Overall Concepts 
@cindex Overall Concepts

@cindex ost
@cindex ost namespace
@cindex namespace
Unless explicitly stated, all GNU Common C++ symbols are under the
@code{ost} namespace@footnote{Provided the C++ compiler used to
compile GNU Common C++ suupports namespaces, which is checked at
configuration time.}. Thus, when we refer to the Thread class, we
actually refer to ost::Thread.

The GNU Common C++ framework actually consists of two libraries:
@file{ccgnu2} and @file{ccext2}@footnote{@xref{Compiler Options}, for
how to specify compiling and linking options for these libraries. On
Win32 systems, these libraries are compiled as @file{ccgnu2.dll} and
@file{ccext2.dll}}. The first includes core functionality that other
things commonly depend on, such as threading and synchronization. That
way, if you are building a tight application with a small footprint,
you can have it used the ccgnu2 shared image alone. On the contrary,
things that require or induce new library link requirements are
included in @file{ccext2}.  Hence, for example, if you do not wish to
use XML parsing in your application, why create an unused library
dependency for libxml2?  The idea being that one can, if one needs to,
use only ``core'' features found in ccgnu2 and then create very
compact executables with very few additional library dependencies.


@c -----------------------------------------------------------------------
@node Threading Concepts
@section Threading Concepts 
@cindex Threading Concepts

@cindex threading
@cindex APE
@cindex Java threading
Threading was the first part of GNU Common C++ I wrote, back when it
was still the APE library.  My goal for GNU Common C++ threading has
been to make threading as natural and easy to use in C++ application
development as threading is in Java.  With this said, one does not
need to use threading at all to take advantage of GNU Common C++.
However, all GNU Common C++ classes are designed at least to be
thread-aware/thread-safe as appropriate and necessary.

@cindex pthread
@cindex ost_pthread.m4
@cindex autoconf
GNU Common C++ threading is currently built either from the Posix
"pthread" library or using the win32 SDK.  In that the Posix "pthread"
draft has gone through many revisions, and many system implementations
are only marginally compliant, and even then usually in different
ways, I wrote a large series of autoconf macros found in
ost_pthread.m4 which handle the task of identifying which pthread
features and capabilities your target platform supports.  In the
process I learned much about what autoconf can and cannot do for
you.

@cindex GNU pth
@cindex pth
Currently the GNU Portable Thread library (GNU pth) is not directly
supported in GNU Common C++.  While GNU "Pth" doesn't offer direct
native threading support or benefit from SMP hardware, many of the
design advantages of threading can be gained from it's use, and the
Pth pthread "emulation" library should be usable with GNU Common C++.
In the future, GNU Common C++ will directly support Pth, as well as
OS/2 and BeOS native threading API's.

@cindex threading model
GNU Common C++ itself defines a fairly "neutral" threading model that
is not tied to any specific API such as pthread, win32, etc.  This
neutral thread model is contained in a series of classes which handle
threading and synchronization and which may be used together to build
reliable threaded applications.

@tindex Thread
@findex Thread::run
@cindex execution context
@cindex termination
@cindex thread termination
GNU Common C++ defines application specific threads as objects which
are derived from the GNU Common C++ "Thread" base class.  At minimum
the "run" method must be implemented, and this method essentially is
the "thread", for it is executed within the execution context of the
thread, and when the run method terminates the thread is assumed to
have terminated.

@cindex priority
@cindex thread priority
GNU Common C++ allows one to specify the running priority of a newly 
created thread relative to the "parent" thread which is the thread that is
executing when the constructor is called.  Since most newer C++
implementations do not allow one to call virtual constructors or virtual
methods from constructors, the thread must be "started" after the
constructor returns.  This is done either by defining a "starting"
semaphore object that one or more newly created thread objects can wait
upon, or by invoking an explicit "Start" member function.

@cindex suspended
@cindex resumed
@cindex SIGUSR1
@cindex SIGSTOP
@cindex SIGCONT
@cindex solaris threads
@cindex linux threads
Threads can be "suspended" and "resumed".  As this behavior is not
defined in the Posix "pthread" specification, it is often emulated
through signals.  Typically SIGUSR1 will be used for this purpose in
GNU Common C++ applications, depending in the target platform.  On
Linux, since threads are indeed processes, SIGSTOP and SIGCONT can be
used.  On solaris, the Solaris thread library supports suspend and
resume directly.

@cindex cancelable threads
Threads can be canceled.  Not all platforms support the concept of
externally cancelable threads.  On those platforms and API
implementations that do not, threads are typically canceled through
the action of a signal handler.

@findex Thread::setCancellation
@findex Thread::exit
@findex Thread::run
@cindex cancellation
@cindex cancellation point
As noted earlier, threads are considered running until the "run"
method returns, or until a cancellation request is made.  GNU Common
C++ threads can control how they respond to cancellation, using
setCancellation().  Cancellation requests can be ignored, set to occur
only when a cancellation "point" has been reached in the code, or
occur immediately.  Threads can also exit by returning from run() or
by invoking the exit() method.

@findex Thread::terminate
@cindex thread initialization
@cindex thread destruction
Generally it is a good practice to initialize any resources the thread
may require within the constructor of your derived thread class, and
to purge or restore any allocated resources in the destructor.  In
most cases, the destructor will be executed after the thread has
terminated, and hence will execute within the context of the thread
that requested a join rather than in the context of the thread that is
being terminated.  Most destructors in derived thread classes should
first call terminate() to make sure the thread has stopped running
before releasing resources.

@cindex thread join
A GNU Common C++ thread is normally canceled by deleting the thread
object.  The process of deletion invokes the thread's destructor, and
the destructor will then perform a "join" against the thread using the
terminate() function.  This behavior is not always desirable since the
thread may block itself from cancellation and block the current
"delete" operation from completing.  One can alternately invoke
terminate() directly before deleting a thread object.

@findex Thread::final
@findex operator new
@cindex detached thread
When a given GNU Common C++ thread exits on it's own through it's
run() method, a "final" method will be called.  This Final method will
be called while the thread is "detached".  If a thread object is
constructed through a "new" operator, it's final method can be used to
"self delete" when done, and allows an independent thread to construct
and remove itself autonomously.

@findex getThread
@cindex pthread_self
A special global function, getThread(), is provided to identify the
thread object that represents the current execution context you are
running under.  This is sometimes needed to deliver signals to the
correct thread.  Since all thread manipulation should be done through
the GNU Common C++ (base) thread class itself, this provides the same
functionality as things like "pthread_self" for GNU Common C++.

GNU Common C++ threads are often aggregated into other classes to
provide services that are "managed" from or operate within the context
of a thread, even within the GNU Common C++ framework itself.  A good
example of this is the TCPSession class, which essentially is a
combination of a TCP client connection and a separate thread the user
can define by deriving a class with a Run() method to handle the
connected service.  This aggregation logically connects the successful
allocation of a given resource with the construction of a thread to
manage and perform operations for said resource.

Threads are also used in "service pools".  In GNU Common C++, a
service pool is one or more threads that are used to manage a set of
resources.  While GNU Common C++ does not provide a direct "pool"
class, it does provide a model for their implementation, usually by
constructing an array of thread "service" objects, each of which can
then be assigned the next new instance of a given resource in turn or
algorithmically.

@findex Thread::signal
@findex Thread::onDisconnect
@findex Thread::onHangup
@cindex SIGPIPE
@cindex SIGHUP
Threads have signal handlers associated with them.  Several signal
types are "predefined" and have special meaning.  All signal handlers
are defined as virtual member functions of the Thread class which are
called when a specific signal is received for a given thread.  The
"SIGPIPE" event is defined as a "onDisconnect" event since it's normally
associated with a socket disconnecting or broken fifo.  The onHangup()
method is associated with the SIGHUP signal.  All other signals are
handled through the more generic signal().

Incidently, unlike Posix, the win32 API has no concept of signals, and
certainly no means to define or deliver signals on a per-thread basis.
For this reason, no signal handling is supported or emulated in the
win32 implementation of GNU Common C++ at this time.

@tindex TCPStream
@tindex TCPSession
In addition to TCPStream, there is a TCPSession class which combines a
thread with a TCPStream object.  The assumption made by TCPSession is
that one will service each TCP connection with a separate thread, and
this makes sense for systems where extended connections may be
maintained and complex protocols are being used over TCP.


@c -----------------------------------------------------------------------
@node Synchronization
@section Synchronization
@cindex Synchronization

Synchronization objects are needed when a single object can be
potentially manipulated by more than one thread (execution) context
concurrently.  GNU Common C++ provides a number of specialized classes
and objects that can be used to synchronize threads.

@tindex Mutex
One of the most basic GNU Common C++ synchronization object is the
Mutex class.  A Mutex only allows one thread to continue execution at
a given time over a specific section of code.  Mutex's have a enter
and leave method; only one thread can continue from the Enter until
the Leave is called.  The next thread waiting can then get through.
Mutex's are also known as "CRITICAL SECTIONS" in win32-speak.

The GNU Common C++ mutex is presumed to support recursive locking.
This was deemed essential because a mutex might be used to block
individual file requests in say, a database, but the same mutex might
be needed to block a whole series of database updates that compose a
"transaction" for one thread to complete together without having to
write alternate non-locking member functions to invoke for each part
of a transaction.

Strangely enough, the original pthread draft standard does not
directly support recursive mutexes.  In fact this is the most common
"NP" extension for most pthread implementations.  GNU Common C++
emulates recursive mutex behavior when the target platform does not
directly support it.

@tindex ThreadLock
In addition to the Mutex, GNU Common C++ supports a rwlock class
(ThreadLock).  This implements the X/Open recommended "rwlock".  On
systems which do not support rwlock's, the behavior is emulated with a
Mutex; however, the advantage of a rwlock over a mutex is then
entirely lost.  There has been some suggested clever hacks for
"emulating" the behavior of a rwlock with a pair of mutexes and a
semaphore, and one of these will be adapted for GNU Common C++ in the
future for platforms that do not support rwlock's directly.

@tindex Semaphore
GNU Common C++ also supports "semaphores".  Semaphores are typically
used as a counter for protecting or limiting concurrent access to a
given resource, such as to permitting at most "x" number of threads to
use resource "y", for example.  Semaphore's are also convenient to use
as synchronization objects to rondevous and signal activity and/or
post pending service requests between one thread thread and another.

@tindex Event
In addition to Semaphore objects, GNU Common C++ supports "Event"
objects.  Event objects are triggered "events" which are used to
notify one thread of some event it is waiting for from another thread.
These event objects use a trigger/reset mechanism and are related to
low level conditional variables.

@tindex ThreadKey
@tindex AtomicCounter
@cindex reference counting
A special class, the ThreadKey, is used to hold state information that
must be unique for each thread of context.  Finally, GNU Common C++
supports a thread-safe "AtomicCounter" class.  This can often be used
for reference counting without having to protect the counter with a
separate Mutex counter.  This lends to lighter-weight code.


@c -----------------------------------------------------------------------
@node Sockets
@section Sockets
@cindex Sockets

@cindex Java sockets
GNU Common C++ provides a set of classes that wrap and define the
operation of network "sockets".  Much like with Java, there are also a
related set of classes that are used to define and manipulate objects
which act as "hostname" and "network addresses" for socket
connections.

@tindex InetAddress
@tindex InetHostAddress
@tindex InetMaskAddress
@tindex BroadcastAddress
The network name and address objects are all derived from a common
InetAddress base class. Specific classes, such as InetHostAddress,
InetMaskAddress, etc, are defined from InetAddress entirely so that
the manner a network address is being used can easily be documented
and understood from the code and to avoid common errors and accidental
misuse of the wrong address object.  For example, a "connection" to
something that is declared as a "InetHostAddress" can be kept
type-safe from a "connection" accidently being made to something that
was declared a "BroadcastAddress".

@tindex Socket
@cindex QoS
@cindex sockopt
@cindex Dont-Route
@cindex Keep-Alive
The socket is itself defined in a single base class named, quite
unremarkably, "Socket".  This base class is not directly used, but is
provided to offer properties common to other GNU Common C++ socket
classes, including the socket exception model and the ability to set
socket properties such as QoS, "sockopts" properties like Dont-Route
and Keep-Alive, etc.

@tindex TCPStream
@findex TCPStream::operator<<
@findex TCPStream::operator>>
The first usable socket class is the TCPStream.  Since a TCP
connection is always a "streamed" virtual circuit with flow control,
the standard stream operators ("<<" and ">>") may be used with
TCPStream directly.  TCPStream itself can be formed either by
connecting to a bound network address of a TCP server, or can be
created when "accepting" a network connection from a TCP server.

@cindex TCPSocket
An implicit and unique TCPSocket object exists in GNU Common C++ to
represent a bound TCP socket acting as a "server" for receiving
connection requests.  This class is not part of TCPStream because such
objects normally perform no physical I/O (read or write operations)
other than to specify a listen backlog queue and perform "accept"
operations for pending connections.  The GNU Common C++ TCPSocket
offers a Peek method to examine where the next pending connection is
coming from, and a Reject method to flush the next request from the
queue without having to create a session.

@findex TCPSocket::onAccept
The TCPSocket also supports a "onAccept" method which can be called
when a TCPStream related object is created from a TCPSocket.  By
creating a TCPStream from a TCPSocket, an accept operation
automatically occurs, and the TCPSocket can then still reject the
client connection through the return status of it's OnAccept method.

@tindex UDPSocket
In addition to connected TCP sessions, GNU Common C++ supports UDP
sockets and these also cover a range of functionality.  Like a
TCPSocket, A UDPSocket can be created bound to a specific network
interface and/or port address, although this is not required.  UDP
sockets also are usually either connected or otherwise "associated"
with a specific "peer" UDP socket.  Since UDP sockets operate through
discreet packets, there are no streaming operators used with UDP
sockets.

@tindex UDPBroadcast
In addition to the UDP "socket" class, there is a "UDPBroadcast"
class.  The UDPBroadcast is a socket that is set to send messages to a
subnet as a whole rather than to an individual peer socket that it may
be associated with.

@tindex UDPDuplex
UDP sockets are often used for building "realtime" media streaming
protocols and full duplex messaging services.  When used in this
manner, typically a pair of UDP sockets are used together; one socket
is used to send and the other to receive data with an associated pair
of UDP sockets on a "peer" host.  This concept is represented through
the GNU Common C++ UDPDuplex object, which is a pair of sockets that
communicate with another UDPDuplex pair.

@tindex SocketPort
@tindex SocketService
Finally, a special set of classes, "SocketPort" and "SocketService",
exist for building realtime streaming media servers on top of UDP and
TCP protocols.  The "SocketPort" is used to hold a connected or
associated TCP or UDP socket which is being "streamed" and which
offers callback methods that are invoked from a "SocketService"
thread.  SocketService's can be pooled into logical thread pools that
can service a group of SocketPorts.  A millisecond accurate "timer" is
associated with each SocketPort and can be used to time synchronize
SocketPort I/O operations.


@c -----------------------------------------------------------------------
@node Serial I/O
@section Serial I/O
@cindex Serial I/O

GNU Common C++ serial I/O classes are used to manage serial devices
and implement serial device protocols.  From the point of view of GNU
Common C++, serial devices are supported by the underlying Posix
specified "termios" call interface.

The serial I/O base class is used to hold a descriptor to a serial
device and to provide an exception handling interface for all serial
I/O classes.  The base class is also used to specify serial I/O
properties such as communication speed, flow control, data size, and
parity.  The "Serial" base class is not itself directly used in
application development, however.

GNU Common C++ Serial I/O is itself divided into two conceptual modes;
frame oriented and line oriented I/O.  Both frame and line oriented
I/O makes use of the ability of the underlying tty driver to buffer
data and return "ready" status from when select either a specified
number of bytes or newline record has been reached by manipulating
termios c_cc fields appropriately.  This provides some advantage in
that a given thread servicing a serial port can block and wait rather
than have to continually poll or read each and every byte as soon as
it appears at the serial port.

@tindex TTYStream
@findex TTYStream::operator<<
@findex TTYStream::operator>>
@tindex ttystream
The first application relevant serial I/O class is the TTYStream
class.  TTYStream offers a linearly buffered "streaming" I/O session
with the serial device.  Furthermore, traditional C++ "stream"
operators (<< and >>) may be used with the serial device.  A more
"true" to ANSI C++ library format "ttystream" is also available, and
this supports an "open" method in which one can pass initial serial
device parameters immediately following the device name in a single
string, as in "/dev/tty3a:9600,7,e,1", as an example.

@tindex TTYSession
The TTYSession aggragates a TTYStream and a GNU Common C++ Thread
which is assumed to be the execution context that will be used to
perform actual I/O operations.  This class is very anagolous to
TCPSession.

@tindex TTYPort
@tindex TTYService
The TTYPort and TTYService classes are used to form thread-pool
serviced serial I/O protocol sets.  These can be used when one has a
large number of serial devices to manage, and a single (or limited
number of) thread(s) can then be used to service the tty port objects
present.  Each tty port supports a timer control and several virtual
methods that the service thread can call when events occur.  This
model provides for "callback" event management, whereby the service
thread performs a "callback" into the port object when events occur.
Specific events supported include the expiration of a TTYPort timer,
pending input data waiting to be read, and "sighup" connection breaks.


@c -----------------------------------------------------------------------
@node Block I/O
@section Block I/O
@cindex Block I/O

@tindex RandomFile
GNU Common C++ block I/O classes are meant to provide more convenient
file control for paged or random access files portably, and to answer
many issues that ANSI C++ leaves untouched in this area.  A common
base class, RandomFile, is provided for setting descriptor attributes
and handling exceptions.  From this, three kinds of random file access
are supported.

@tindex ThreadFile
@findex pwread
@findex pwwrite
ThreadFile is meant for use by a threaded database server where
multiple threads may each perform semi-independent operations on a
given database table stored on disk.  A special "fcb" structure is
used to hold file "state", and pread/pwrite is used whenever possible
for optimized I/O.  On systems that do not offer pwread/pwrite, a
Mutex lock is used to protect concurrent lseek and read/write
operations.  ThreadFile managed databases are assumed to be used only
by the local server and through a single file descriptor.

@tindex SharedFile
SharedFile is used when a database may be shared between multiple
processes.  SharedFile automatically applies low level byte-range
"file locks", and provides an interface to fetch and release
byte-range locked portions of a file.

@tindex MappedFile
@findex MappedFile::sync
The MappedFile class provides a portable interface to memory mapped
file access.  One can map and unmap portions of a file on demand, and
update changed memory pages mapped from files immediately through
sync().


@c -----------------------------------------------------------------------
@node Daemons
@section Daemons
@cindex Daemons

@findex pdetach
@cindex slog
Daemon support consists of two GNU Common C++ features.  The first is
the "pdetach" function.  This function provides a simple and portable
means to fork/detach a process into a daemon.  In addition, the "slog"
object is provided.

@tindex Slog
@cindex slog
@cindex clog
@findex Slog::operator<<
"slog" is an object which behaves very similar to the Standard C++
"clog".  The key difference is that the "slog" object sends it's
output to the system logging daemon (typically syslogd) rather than
through stderr.  "slog" can be streamed with the << operator just like
"clog".  "slog" can also accept arguments to specify logging severity
level, etc.


@c -----------------------------------------------------------------------
@node Persistence
@section Persistence
@cindex Persistence

The GNU Common C++ Persistence library was designed with one thought
foremost - namely that large interlinked structures should be easily
serializable. The current implementation is @emph{not} endian safe,
and so, whilst it should in theory be placed in the "Extras" section,
the codebase itself is considered stable enough to be part of the main
distribution.

@tindex Persistence::BaseObject
@findex IMPLEMENT_PERSISTENCE
@findex DECLARE_PERSISTENCE
The Persistence library classes are designed to provide a quick and
easy way to make your data structures serializable. The only way of
doing this safely is to inherit your classes from the provided class
Persistence::BaseObject. The macros "IMPLEMENT_PERSISTENCE" and
"DECLARE_PERSISTENCE" provide all the function prototypes and
implementation details you may require to get your code off the
ground.


@c -----------------------------------------------------------------------
@node Configuration and Misc.
@section Configuration and Misc.
@cindex Configuration and Misc.

@tindex MemPager
There are a number of odd and specialized utility classes found in
Common C++.  The most common of these is the "MemPager" class.  This
is basically a class to enable page-grouped "cumulative" memory
allocation; all accumulated allocations are dropped during the
destructor.  This class has found it's way in a lot of other utility
classes in GNU Common C++.

@tindex Keydata
The most useful of the misc. classes is the Keydata class.  This class
is used to load and then hold "keyword = value" pairs parsed from a
text based "config" file that has been divided into "[sections]".
Keydata can also load a table of "initialization" values for keyword
pairs that were not found in the external file.

One typically derives an application specific keydata class to load a
specific portion of a known config file and initialize it's values.
One can then declare a global instance of these objects and have
configuration data initialized automatically as the executable is
loaded.

Hence, if I have a "[paths]" section in a "/etc/server.conf" file, I
might define something like:

@example
@cartouche
class KeyPaths : public Keydata
@{
public:
        KeyPaths() : Keydata("/server/paths")
        @{
                static KEYDEF *defvalues = @{
                @{"datafiles", "/var/server"@},
                @{NULL, NULL@}@};

                // @r{override with [paths] from "~/.serverrc" if avail.}

                Load("~server/paths");
                Load(defvalues);
        @}
@};

KeyPaths keypaths;
@end cartouche
@end example


@c -----------------------------------------------------------------------
@node Numbers and Dates
@section Numbers and Dates
@cindex Numbers and Dates

@tindex Number
@tindex ZNumber
@tindex Date
@tindex DateNumber
@emph{TODO.} This section will explain the number manipulation classes
(@code{Number} and @code{ZNumber}, as well as the data related classes
(@code{Date} and @code{DateNumber}).


@c -----------------------------------------------------------------------
@node URL Streams
@section URL Streams
@cindex URL Streams

@tindex URLStream
@cindex URL related functions
@emph{TODO.} This section will explain the URLStream class, as well as
the following URL related functions:

@ftable @code
@item URLStream

@item urlDecode

@item urlEncode

@item b64Decode

@item b64Encode

@end ftable

In the meantime you can have a look at the @file{urlfetch.cpp} demo,
which is a good example of use of URLStream to retrieve documents from
URLs.


@c -----------------------------------------------------------------------
@node XML Streams and RPC
@section XML Streams and RPC
@cindex XML Streams and RPC

@tindex XMLStream
@tindex XMLRPC
@emph{TODO.} This section will explain the XML streams parsing
(@code{XMLStream} class) and XML RPC (@code{XMLRPC} class) facilities
of Common C++. In the meantime, you can have a look at the
@file{xmlfetch.cpp} demo, which defines a basic XML parser for URL
streams.


@c -----------------------------------------------------------------------
@node Exceptions
@section Exceptions
@cindex Exceptions

@tindex Exception
@tindex std::exception
@emph{TODO.} This section will explain the exception model of Common
C++, based on the @code{Exception} class, derived from std::exception.

@tindex Exception
@tindex IOException
@tindex SockException
@tindex DirException
@tindex DSOException
@tindex FIFOException
@tindex PipeException
@tindex FileException
@tindex FTPException
@tindex SerException
@tindex ThrException
@tindex PersistException
Other exception classes that will be commented are:
@code{IOException}, @code{SockException}, @code{DirException},
@code{DSOException}, @code{FIFOException}, @code{PipeException},
@code{FileException}, @code{FTPException}, @code{SerException},
@code{ThrException} and @code{PersistException}. In the meantime you
can have a look at the exception class hierarchy on the reference
manual.


@c -----------------------------------------------------------------------
@node Templates
@section Templates
@cindex Templates

@tindex objCounter
@tindex objList
@tindex objMap
@tindex keyMap]
@tindex objSync
@tindex cstring
@tindex cistring
@tindex Pointer
@tindex Counter
@findex abs
@emph{TODO.} This section will explain the template subsistem of
Common C++.



@c -----------------------------------------------------------------------
@node Extras
@chapter Extras
@cindex Extras

@emph{TODO: this is rather outdated.}

At the time of the release of GNU Common C++ 1.0, it was deemed that
several class libraries either were incomplete or still experimental,
and the 1.0 designation seemed very inappropriate for these libraries.
I also wanted to have a mechanism to later add new GNU Common C++
class libraries without having to disrupt or add experimental code
into the main GNU Common C++ release.

To resolve this issue, a second package has been created, and is named
GNU "GNU Common C++ Extras".  The extras package simply holds class
frameworks that are still not considered "mature" or "recommended".
This package can be downloaded, compiled, and installed, after GNU
Common C++ itself.  Many of the class libraries appearing in the
extras package are likely to appear in GNU Common C++ proper at some
future date, and should be considered usable in their current form.
They are made available both to support continued development of GNU
Common C++ proper and because, while not yet mature, they are
considered "useful" in some manner.

The initial GNU Common C++ "extras" package consisted of two
libraries; Common C++ "scripting" and "math".  The scripting library
(-lccscript) is the GNU Bayonne scripting engine which is used as a
near-realtime event driven embedded scripting engine for "callback"
driven state-event server applications.  The Bayonne scripting engine
directly uses C++ inheritance to extend the Bayonne dialect for
application specific features and is used as a core technology in the
GNU Bayonne, DBS, and Meridian telephony servers and as part of the a
free home automation project.  There has been some discussion about
folding the GNU Bayonne scripting concepts around a more conventional
scripting language, and so this package currently remains in "extras"
rather than part of GNU Common C++ itself.

The other package found in the initial "extras" distribution is the
Common C++ math libraries.  These are still at a VERY early stage of
development, and may well be depreciated if another suitable free C++
math/numerical analysis package comes along.


@c -----------------------------------------------------------------------
@node Serverlets
@chapter Serverlets
@cindex Serverlets

Serverlets are a concept popularized with Java and web servers.  There
is a broad abstract architectural concept of serverlets or plugins
that one also finds in my GNU Common C++ projects, though they are not
directly defined as part of GNU Common C++ itself.

A GNU Common C++ "serverlet" comes about in a Common C++ server
project, such as the Bayonne telephony server, where one wishes to
define functionality for alternate hardware or API's in alternated
shared object files that are selected at runtime, or to add "plugins"
to enhance functionality.  A serverlet is defined in this sense as a
"DSO" loaded "-module" object file which is linked at runtime against
a server process that exports it's base classes using
"-export-dynamic".  The "server" image then acts as a carrier for the
runtime module's base functionality.

Modules, or "serverlets", defined in this way do not need to be
compiled with position independent code.  The module is only used with
a specific server image and so the runtime address is only resolved
once rather than at different load addresses for different arbitrary
processes.

I recommend that GNU Common C++ based "servers" which publish and
export base classes in this manner for plugins should also have a
server specific "include" file which can be installed in the cc++
include directory.


@c -----------------------------------------------------------------------
@node Compiler Options
@chapter Compiler Options
@cindex Compiler Options

@cindex automake
@cindex autoconf
@cindex configuration
@cindex config.h
@cindex ccgnu2-config
GNU Common C++ does a few things special with automake and autoconf.
When the Common C++ library is built, it saves a number of compiler
options that can be retrieved by an application being configured to
use GNU Common C++. These options can be retrieved from the standard
output of the @command{ccgnu2-config} script, which is installed in the
machine binaries path.

This is done to assure the same compiler options are used to build
your application that were in effect when GNU Common C++ itself was
built.  Since linkage information is also saved in this manner, this
means your application's "configure" script does not have to go
through the entire process of testing for libraries or GNU Common C++
related compiler options all over again.  Finally, GNU Common C++
saves it's own generated @file{config.h} file in
@file{cc++/config.h}@footnote{On Win32 systems, a specific
@file{config.h} located under the win32/cc++/ directory is used and
installed.}.

@command{ccgnu2-config} has the following options (which are shown if
you type @command{ccgnu2-config --help}):

@example
Usage: ccgnu2-config [OPTIONS]
Options:
        [--prefix]
        [--version]
        [--flags]
        [--libs]
        [--gnulibs]
        [--iolibs]
        [--extlibs]
        [--stdlibs]
        [--includes]
@end example

For a basic usage of Common C++, you just need the options given by
the following command: @command{ccgnu2-config --flags --stdlibs},
whose output should be something like this:

@example
foo@@bar:~/$ ccgnu2-config --flags --stdlibs
-I/usr/local/include/cc++2 -I/usr/local/include -D_GNU_SOURCE
-L/usr/local/lib -lccext2 -lccgnu2 -lxml2 -lz -ldl -pthread
@end example

Note that this is just an example, the concrete output on your system
will probably differ.  The first output line (corresponding to
@code{--flags}) tells what directories must be added to the compiler
include path, as well as global symbol definitions
(@code{_GNU_SOURCE}) needed to compile with Common C++. The second
output line (corresponding to @code{--stdlibs}) gives the linker
options, both additional library path and libraries that must be
linked. @code{ccgnu2} and @code{ccext2} are the two libraries Common
C++ currently consists of. The other libraries shown in the example
are dependencies of Common C++.

The list shown below tells what information is given by each of the
options that can be specified to @command{ccgnu2-config}. It also
specifies what would be the output corresponding to the example given
before.

@table @code

@item --prefix
Common C++ Installation path prefix. For example, @code{/usr/local}.

@item --version
Common C++ version. For example, @code{1.0.0}.

@item --flags
C++ preprocessor flags. For example, @code{-I/usr/local/include/cc++2
-I/usr/local/include -D_GNU_SOURCE}.

@item --libs
C++ linker options for the main Common C++ library
(@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl
-pthread}.

@item --gnulibs
C++ linker options for the main Common C++ library
(@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl
-pthread}.

@item --iolibs
C++ linker options for the input/output Common C++ library
(@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl
-pthread}.

@item --extlibs
C++ linker options for the Common C++ ``extension'' library
(@code{ccext2}). For exmple, @code{-lccext2 -lxml2 -lz}.

@item --stdlibs
C++ linker options for the whole Common C++ (@code{ccgnu2} and
@code{ccext2}). For example, @code{-L/usr/local/lib -lccext2 -lccgnu2
-lxml2 -lz -ldl -pthread}.

@item --includes
Common C++ specific include path. For example,
@code{/usr/local/include/cc++2}.

@end table


@c -----------------------------------------------------------------------
@node Automake Services
@chapter Automake Services
@cindex Automake Services

@cindex automake services
@cindex automake macros
@cindex ost_commoncxx.m4
@cindex configure.in
@cindex configure.ac
If you are using automake, you can add the @file{ost_check2.m4} macros
to your projects autoconf "m4" directory and use several CCXX2_ macros
for your convenience.  A "minimal" @file{configure.in} or
@file{configure.ac} can be constructed as:

@example
AC_INIT(something...)
AC_PROG_CXX
AC_PROG_CXXCPP
AM_PROG_LIBTOOL
AM_INIT_AUTOMAKE(....)
AM_CONFIG_HEADER(my-local-config.h)
OST_CCXX2_VERSION(1.0.0)
@end example

Where @samp{1.0.0} means configure will check for GNU Common C++ 2
1.0.0 or later. These are the macros currently provided:

@table @code

@cindex OST_CCXX2_VERSION
@item OST_CCXX2_VERSION([MINIMUM-VERSION[,ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]])
Test for usable version of CommonC++.

@cindex OST_CCXX2_XML
@item OST_CCXX2_XML([ACTION-IF-TRUE[,ACTION-IF-FALSE]])
Test whether the CommonC++ library was compiled with XML parsing support.

@cindex OST_CCXX2_HOARD
@item OST_CCXX2_HOARD
Will test for and, if found, add the SMP optimized Hoard memory
allocator to your application link LIBS.

@cindex OST_CCXX2_FOX
@item OST_CCXX2_FOX
Test for the FOX toolkit.

@end table


@c -----------------------------------------------------------------------
@node Configuring Sources
@chapter Configuring Sources
@cindex Configuring Sources

When building GNU Common C++ on platforms that support the use of
configure, the following specific configuration options are provided:

@table @code

@item --with-pthread[=lib]
using specified pthread library

@item --with-linuxthreads
use linux kernel mode library

@item --without-xml
Disable xml support

@item --with-ftp
Enable ftp support

@item --with-memaudit
Enable memory auditing

@item --with-stlport[=dir]
using SGI portable C++ stream library,ie: /usr/local, not all include directory

@item --enable-debug
compile for debugging

@item --enable-profiling
compile for profiling
@end table


@c -----------------------------------------------------------------------
@node Developer Documentation
@chapter Developer Documentation
@cindex Developer Documentation

This chapter contains information of interest for developers of
components for the GNU Common C++ framework.

@menu
* Coding Style::             How a CommonC++ 2 source file should be written.
* Porting::                  Common porting related problems and practices.
@end menu


@c -----------------------------------------------------------------------
@node Coding Style
@section Coding Style
@cindex Coding Style

How a CommonC++ 2 source file should be written.

@menu
* Naming Convention::       Overall GNU Common C++ naming conventions.
* Class Encapsulation::     Class interface design guidelines.
@end menu


@c -----------------------------------------------------------------------
@node Naming Convention
@subsection Naming Convention
@cindex Naming Convention

@itemize
@item @strong{Classes and structs}. 
Begin with uppercase with word parts capitalized (ThisIsAClass)

@item @strong{Method (function member, also static member)}.
Begin with lowercase with word parts capitalized (setSomething, send).
If a member variable is set, a @code{setXxxx} style name should be
used, and if a member variable is fetched, a @code{getXxxx} style name
should be used.  Sometimes things might both set and perform an
action, like @code{setError} in place of @code{Error} in the older
release, in which case, set should still be used as the prefix.
Function to handle some event (such as data arrival) should begin with
@code{on} (ex: @code{onInput})

@item @strong{Data member}.
Begin with lowercase with word parts capitalized
(@code{currentThread}) private member can begin with underscore (_).

@item @strong{Global function}.
Begin with lowercase with word parts capitalized (@code{getThread}).

@item @strong{Enumeration type}.
Begin with uppercase with word parts capitalized (@code{Error}).

@item @strong{Enumeration item}.
Begin with lowercase with word parts capitalized (@code{errSuccess}).
First word should refer to enumeration type (@code{errFailure},
cancelImmediate). For error enum we use the prefix @code{err}
(everyone should understand the meaning).

@item @strong{Member data types}.
Sometimes a class might use internal member data types or structs.
These should be written using @code{class} rather than struct wherever
possible and treated as inner @code{classes}.  Hence, they would be
capitalized in the same conventions of a class.

@end itemize


@c -----------------------------------------------------------------------
@node Class Encapsulation
@subsection Class Encapsulation
@cindex Class Encapsulation

@itemize

@item @strong{Friend functions}.
To clean up the namespace we are looking to eliminate @emph{friend
functions} that exist in the default or ost namespace and we are
suggesting that in many cases static member functions should be used
in place of friend functions unless the friend function is actually
used in multiple classes.

A typical example of this is found in things like @code{getXXX}, which
might be a friend function for finding a specific named instance of
@code{XXX} thru a self organized link list contained in @code{XXX}.
Rather, it is suggested for this to use a static member something like
@code{XXX::find}.

@item @strong{Scope of view and inheritance}.
In many cases we combine and mix classes directly in GNU Common C++
(multiple inheritence).  Hence, classes have to be well designed for
this possibility.  Ideally things that should not be exposed to
derived classes should be made private so that clashes mixing similar
classes with common named members do not need to occur.

@item  @strong{Access to member properties}.
A well formed GNU Common C++ class need not expose more than is
nessisary for it's practical and effective use in derived classes or
thru proper public methods.  Ideally set and get members should be
used to manipulate internal member variables thru public interfaces
rather than exposing property values directly thru public
declarations.  These set and get methods should use appropriate valid
range and error checking logic.

Member properties can often be made visible protected to optimize the
code of derived classes, and care then needs to be taken when creating
derived classes to make sure they do have reasonable error checking
when needed.

@item @strong{Constructors and destructors}.
It is very common in GNU Common C++ for the constructor to create or
obtain a resource that remains in scope as long as the object does,
and is then releas\ed in the destructor when the object falls out of
scope.  Things like Mutexes, Threads and Semaphores and such very much
behave this way.

@end itemize

@c -----------------------------------------------------------------------
@node Porting
@section Porting
@cindex Porting

Only for no-remake same problem :).

@itemize @bullet

@cindex FreeBSD
@cindex pthread_join
@item FreeBSD: assuming having thread A and B. If A call pthread_join 
on B and B call pthread_detach and then exit thread A hang.

@cindex Solaris
@item Solaris: On multiple inheriting from streambuf and iostream together
streambuf should inherited first (and initialized too).

@cindex Win32
@cindex MSVC
@cindex DLL
@item Win32/MSVC6: if you use CC++ DLL library you MUST use C++ DLL library. 
@code{iostream} use a pointer to object. This object pointer can be
different from library static linked and dinamically linked, so
iostream see distinct object, causing strange exception and crashes.

@cindex GCC
@item @acronym{GCC}: including declaration for polimorphic class cause
link to typeinfo, but typeinfos are defined only in module with
classes constructors Include only needed header (this problem
disappear with optimization).

@end itemize

@c %** end of body


@c -----------------------------------------------------------------------
@node Licenses
@appendix Licenses

@menu
* GNU Free Documentation License::            License for this document.
* GNU General Public License::                License for the library.
* GNU Common C++ Linking Exception::          Library linking exception.
@end menu

@include fdl.texi

@include gpl.texi

@c -----------------------------------------------------------------------
@node GNU Common C++ Linking Exception
@appendixsec GNU Common C++ Linking Exception
@cindex GNU Common C++ Linking Exception

As a special exception to the GNU General Public License, permission
is granted for additional uses of the text contained in its release of
Common C++.

The exception is that, if you link the Common C++ library with other
files to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public License.
Your use of that executable is in no way restricted on account of
linking the Common C++ library code into it.

This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License.

This exception applies only to the code released under the name Common
C++.  If you copy code from other releases into a copy of Common C++,
as the General Public License permits, the exception does not apply to
the code that you add in this way.  To avoid misleading anyone as to
the status of such modified files, you must delete this exception
notice from them.

If you write modifications of your own for Common C++, it is your
choice whether to permit this exception to apply to your
modifications.  If you do not wish that, delete this exception notice.


@c -----------------------------------------------------------------------

@c %** start of end

@node Class and Data Type Index
@unnumbered Class and Data Type Index

@printindex tp

@node Method and Function Index
@unnumbered Method and Function Index

@printindex fn

@node Concept Index
@unnumbered Concept Index

@printindex cp

@bye
@c %** end of end