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
|