forked from jfriesne/muscle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
HISTORY.txt
6764 lines (6541 loc) · 374 KB
/
HISTORY.txt
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
This file contains the version history/change log for this software.
key: - new feature
* bug fixed
o other
7.54 Released 3/20/2020
- Added a B_ERRNUM(e) macro that works similarly to B_ERRNO, except
it calls strerror() with the passed-in integer value rather than
calling strerror(errno).
- Added a TryLock() method to the Mutex class.
- Added a WithReplacements() method to the String class that takes
a (const Hashtable<String,String> &) argument, for doing multiple
simultaneous search-and-replace operations at one time.
* Fixed the handling of RTM_NEWADDR and RTM_DELADDR messages in the
Linux implementation of DetectNetworkConfigChangesSession.
* Tweaked the Windows #ifdef's in ChildProcessDataIO.cpp per Mika
* Return values of pthreads functions weren't being used correctly
to set status_t results on error. Fixed.
7.53 Released 2/13/2020
- Added a new FlushOutput() virtual method to the
AbstractMessageIOGateway class, in case a subclass
needs to hook into the gateway's flush-output functionality.
- Added a ParseArgs(const Queue<String> &, Message &, bool)
convenience-method to MiscUtilityFunctions.{cpp,h}.
- hexterm now reports more details about certain network errors.
- Updated the MacOSX/iOS implementation of GetNetworkInterfaceInfos()
to call ioctl(SIOCGIFFUNCTIONALTYPE) to disambiguate the device-type
of a network-interface device.
o Added the MUSCLE_CONSTEXPR tag to the TimeUnitConversionFunctions
so that they can be evaluated at compile time when possible.
o Modified SharedFilterSessionFactory.cpp to treat an all-zeros
shared memory region the same as a non-existent one (so that
we no longer have to delete the memory region just to return the
filter's behavior to its default state)
o Moved the FlushOutput() calls for the gateway classes up into
AbstractMessageIOGateway::DoOutput() so that it only needs to
be implemented in one place rather than separately in each subclass.
o Modified the gateway classes to fail gracefully if GetDataIO()
returns a NULL reference, instead of dereferencing a NULL pointer.
o Updated the friend-template workaround in Hashtable.h to apply
to all versions of GCC, to avoid having to update the code
every time a new version of GCC comes out with the bug still unfixed.
7.52 Released 11/28/2019
- Enabled bitcode-generation for iOS in the CMakeLists.txt file.
- Added SetSocketCorkAlgorithmEnabled() and GetSocketCorkAlgorithmEnabled()
functions to the NetworkUtilityFunctions API (currently implemented
for Linux, BSD, and MacOS/X)
- TCPSocketDataIO::FlushOutput() now also calls also the new
SetSocketCorkAlgorithmEnabled() function for better efficiency.
o Moved inline code out of TCPSocketDataIO.h, UDPSocketDataIO.h,
ByteBufferDataIO.h, and FileDataIO.h and into corresponding .cpp files.
o Split hexterm's "file=blah" argument into "rfile=blah" and "wfile=blah"
to allow hexterm to also write hex bytes into a file.
o Replaced explicit type-comparisons in message.py with calls to isinstance().
o message.py now tests sys.byteorder to determine the native CPU's endianness
* PlainTextMessageIOGateway wasn't calling FlushOutput() on its DataIO
object at the appropriate times. Fixed.
* Removed some obsolete backwards-compatibility-with-early-Python-2.x
code from the python3/message.py class.
* Refined the exception-handling in message_transceiver_thread.py
7.51 Released 10/22/2019
- Added a MUSCLE_ENABLE_AUTHORIZATION_EXECUTE_WITH_PRIVILEGES
compile-time flag and a SetRequestRootAccessForChildProcessEnabled()
method to the ChildProcessDataIO class that will be available
only on MacOS/X and only if the compile-time flag was specified
when compiling MUSCLE. The new method tells the ChildProcessDataIO
class to launch the child process as a privileged/root-level process
(and causes the OS to prompt for the user's password before allowing that)
- Moved the time-unit-conversion helper-functions into their own
separate header file (util/TimeUnitConversions.h), and implemented
the full matrix of possible unit-conversions within the set of
supported time-units.
7.50 Released 9/25/2019
- Merged in some iOS-compatibility patches supplied
by Arno Gramatke. The CMakeLists.txt now does the
right thing for iOS, and several non-iOS-supported
classes (i.e. DetectNetworkConfigChangesSession
and RS232DataIO) now compile under iOS as dummy/no-op
classes, rather than breaking the build.
- Added a B_ERRNO macro which is similar to B_ERROR,
except it automatically references the current
errno-string, as returned by strerror(errno).
- Added various status_t error-constants for "common"
error types, such as B_BAD_ARGUMENT, B_DATA_NOT_FOUND,
B_OUT_OF_MEMORY, B_FILE_NOT_FOUND, etc. See
support/MuscleSupport.h for the full list.
- Added IsOK(status_t &) and IsError(status_t &) methods
to the status_t class, to support short-circuit logic
chains that return an error-description string
(see test/teststatus.cpp for examples)
- Added a RETURN_OUT_OF_MEMORY macro to formalize the
common "WARN_OUT_OF_MEMORY; return B_OUT_OF_MEMORY;" couplet.
- Merged in Mika Lindqvist's patch for VS2019 and ARM64.
o Instead of an enum/int, the status_t class now holds a
(const char *) containing a human-readable description
of the error that occurred (or a NULL pointer to indicate
that the operation succeeded).
o B_ERROR now optionally takes a (const char *) argument
specifying a human-readable error-string describing
the error that occurred.
o Updated the codebase to return more specific status_t
error strings when possible (instead of only B_ERROR).
o Updates the codebase so that LogTime() calls reporting
an error now include the state-string of the relevant
status_t variable, when applicable.
o The Mutex, SharedMemory, TarFileWriter, and ZLibCodec
classes all now now inherit from NotCopyable.
* Updated the friend-template work-around in Hashtable.h
to include g++ 8.3.x
* Fixed an output-formatting bug in test/readmessages.cpp
* Fixed a bug in test/readmessage.cpp that could cause
readmessage to crash when reading an invalid file.
7.41 Released 8/8/2019
- Added a SwapContents() method to the StringMatcher class,
and also a move-constructor and a move-assignment-operator.
- The CMakeLists.txt file can now take an optional
-DBUILD_MUSCLED=OFF argument, for use-cases where
the user wants only muscle.lib to be built and not muscled.
- The Cloneable interface class now includes logic to verify
that the object returned by Clone() is of the correct
subclass, and will trigger an assertion-failure if it isn't.
- Added a test/testclone unit-test program to test Cloneable.
o Moved AbstractReflectSession::GetTypeName() up into the
ServerComponent superclass, and gave it a default implementation
(based on RTTI) so that it no longer needs to be implemented
manually by every subclass.
7.40 Released 7/23/2019
- Added an AndQueryFilter class, for better ease-of-use.
- Added an OrQueryFilter class, for better ease-of-use.
- Added a NandQueryFilter class, for better ease-of-use.
- Added a NorQueryFilter class, for better ease-of-use.
- Added IsKeyLocatedInThisContainer() and
IsValueLocatedInThisContainer() methods to the
Hashtable class (to match the IsItemLocatedInThisContainer()
method already present in the Queue class)
o Renamed the existing AndOrQueryFilter class to
MinimumThresholdQueryFilter. This class now serves as the
superclass of the AndQueryFilter and OrQueryFilter classes.
o Renamed the NandNotQueryFilter class to
MaximumThresholdQueryFilter. This class now serves as the
superclass of the NandQueryFilter and NorQueryFilter classes.
o Tweaked some #ifdefs so that MUSCLE code can be compiled
to WebAssembly using Emscripten.
o Added support for a -DMUSCLE_USE_DUMMY_DETECT_NETWORK_CONFIG_CHANGES_SESSION
build-flag, for easier test-building on systems that aren't
currently supported by the DetectNetworkConfigChangesSession
* Rewrote testqueryfilter.cpp to unit-test the new classes.
* Fixed some compiler-warnings in the included Qt-examples.
* Various style tweakages in response to suggestions generated
by GitHub CodeFactor
* Added the 'class' keyword to a couple of friend-declarations
in SSLSocketDataIO.h, since pre-C++11 compilers require it.
* Fixed a use-after-free bug that could occur when the
Hashtable class's Put() methods needed to allocate a
larger internal array to hold the new item, AND the
passed-in value-argument was a reference to an object
that was located within the Hashtable's old data-array.
* Fixed a bug similar to the above in the Queue class's
AddHead*() and AddTail*() methods.
7.31 Released 7/11/2019
- Updated muscled.cpp and portablereflectclient.cpp so that
either one can specify public or private keys to load.
- Added tests/testhashcodes.cpp, to check the consistency
of CalculateHashCode() and CalculateHashCode64() across
CPU architectures.
o ChildProcessDataIO::ChildProcessReadyToRun() now returns
B_NO_ERROR if the child process should run, or B_ERROR
if the child process should be aborted.
o Modified the Hashtable-templatized-friend workaround to
be active on g++ up to v8.2.0.
* Fixed a bug that could cause the Message class's equality
operator to incorrectly return true in the case where both
Message objects are semantically the same, but are pointing
to different (yet identical) binary data-buffers.
* Fixed some errors and omissions in the README.html file.
7.30 Released 6/7/2019
- Added a GetErrno() function to MuscleSupport.h, as a portable
front-end to either errno or WSAGetLastError(), depending on OS.
- The tests/readmessage.cpp program now inflates zlib-compressed
files, and takes a new optional "sizes" keyword, which, if
specified, will cause the program to print a report of how
many bytes each sub-Message in the file takes up, sorted by
increasing size.
- Added a SetPreSharedKeyLoginInfo() method to the SSLSocketDataIO
class so that it can now support PSK-based authentication.
- Added GetPreSharedKeyUserName() and GetPreSharedKeyPassword()
methods to the SSLSocketDataIO class.
- Added a SetSSLPreSharedKeyLoginInfo() method (and corresponding
GetSSLPreSharedUserName() and GetSSLPreSharedPassword() methods)
to the ReflectServer class.
- Added a SetSSLPreSharedKeyLoginInfo() method to the
MessageTransceiverThread class.
- Added a SetPrivateKey(const ConstMessageRef &) convenience
method to the SSLSocketDataIO class.
- Modified the ReflectServer class so that any combination
of public, private, and pre-shared keys can be applied to
newly created sessions.
o Hashtable.h was using some C++11-specific syntax that would
cause a warning to be generated when compiling in C++03 mode. Fixed.
o Added an "if(TARGET muscle) return()" idempotency test to
the CMakeLists.txt file, to avoid potential cmake errors.
o Dropped support for old (pre-1.1.x) versions of OpenSSL
from the SSLSocketDataIO class.
* The CMakeLists.txt now links in the IOKit framework under MacOS/X.
7.21 Released 5/7/2019
- ChildProcessDataIO::LaunchChildProcess() and friends now
take an optional Hashtable<String,String> that, if specified,
will be passed to the child process as environment-variables.
o Reduced sizeof(Hashtable) by 8 bytes, from 64 to 56.
o Queues of very small Item-types (e.g. 1 or 2 bytes per
Item) now automatically get larger ACTUAL_SMALL_QUEUE_SIZE
values, to take advantage of space that would otherwise be
wasted as padding anyway.
o Added some indentation-style fixes for member-initializers
7.20 Released 4/23/2019
- Added new convenience methods to the Hashtable class:
PutAtFront(), PutAtBack(), PutBefore(), PutBehind(), and
PutAtPosition(). (These are variations of Put() that
allow the caller to simultaneously specify the desired
position of the object in the table's iteration-sequence)
- Added a ParseNumericSuffix() method to the String class.
- The StringTokenizer class no longer performs a heap
allocation when tokenizing short strings.
- Added ReadFlat(), WriteFlat(), and AppendFlat() methods
to the ByteBuffer class.
- Added a Reposition(const KeyType &) method to the
OrderedKeysHashtable class.
o Added const-qualifiers to more local variables where appropriate.
o Refactored the Hashtable class's internal sorting
implementation to reduce the amount of redundant code.
o Moved all of the auto-sort functionality out of the
HashtableBase class and into an OrderedHashtable subclass that
OrderedKeysHashtable and OrderedValuesHashtable now derive from.
o Hashtable::SwapContents() no longer swaps the values of the
auto-sort-enabled flag or the auto-sort-cookie value.
o Added some private typedefs to make the Hashtable methods'
implementation code less verbose.
* Some private members of the HashtableBase class had been
declared protected by mistake. Fixed.
* Fixed a bug in the Hashtable class that could cause a
HashtableIterator to be updated improperly, if the
Hashtable was resized during the iteration.
* testhashtable's interactive test manually changed the
ordering of its OrderedKeysHashtable on startup, breaking
the table's automatic-sort functionality. Fixed.
7.13 Released 4/6/2019
- Added <, <=, >=, and > operators to the Queue class, to
allow for easy lexicographical comparison of Queues.
o Modified SharedFilterSessionFactory::IsAccessAllowedForIP()
to be non-static, to avoid having to re-open the shared
memory region on every call to the method.
o Added const-qualifiers to local variables where appropriate.
* Added a missing #include directive to DebugTimer.h
7.12 Released 2/5/2019
- Added a AddConstToRef() convenience-function to RefCount.h,
as a counterpart to the existing CastAwayConstFromRef().
- NetworkInterfaceInfo::IsCopperDetected() now returns
meaningful values under Windows.
o Tweaked the code to avoid a few false-positive warnings
from Clang Static Analyzer.
o Removed SSLSocketDataIO.{cpp,h} from the include XCode
project since it is typically not necessary and breaks
the build if OpenSSL isn't installed on the host Mac.
7.11 Released 1/7/2019
o Queue:GetWithDefault() methods that
take a default-value argument (by-reference)
now return their return-value by-value rather
than by-reference, to avoid any possibility
of returning a dangling reference if they
are called with a temporary-object argument.
o Hashtable:Get*WithDefault() methods that
take a default-value argument (by-reference)
now return their return-value by-value rather
than by-reference, to avoid any possibility
of returning a dangling reference if they
are called with a temporary-object argument.
* _MSC_VER was misspelled as MSC_VER in
PseudoFlattenable.h, causing the code to
fail to compile under MSVC2013. Fixed.
* Fixed a bug in Mutex.h that would prevent
MUSCLE_QT_HAS_THREADS from being correctly
#defined if MUSCLE_AVOID_CPLUSPLUS11 wasn't set.
* Fixed FileDescriptorDataIO.h to compile
correctly under Windows in the case where it
is the first muscle-include file to be parsed.
* MuscleSupport.h now checks for the presence of
_WIN32 (in addition to __WIN32__, etc)
* Fixed an assertion failure that could be
triggered inside DeadlockFinder_ProcessEnding()
if MUSCLE_ENABLE_DEADLOCK_FINDER was defined.
* Fixed some warnings generated by clang++ when
-Wshadow is specified on the compile line.
7.10 Released 12/3/2018
- Under C++11 and later, the status_t type is now a
class rather than a simple typedef for int32. It
is used pretty much the same way as before, except
now it provides better compile-time error-checking.
- Under C++11 and later, the status_t type (and its
values B_OK, B_ERROR, and B_NO_ERROR) are now part
of the muscle namespace.
- Added a WithoutNumericSuffix() convenience method to
the String class.
- The CMakeLists.txt file has been modified so that it
is now usable by CMake 2.8.x and higher.
o Functions in the C APIs have been modified to return
type c_status_t (CB_ERROR or CB_NO_ERROR) rather than
status_t, to avoid ambiguities with the new C++11
version of status_t in mixed C/C++11 programs.
o BitChord::GetNumBitsInBitChord() and friends are now
declared as static/constexpr rather than const methods,
so that they can be called at compile-time now.
o Replaced the MUSCLE_ENABLE_KEEPALIVE_API compile-flag
with a new MUSCLE_DISABLE_KEEPALIVE_API flag (i.e.
so that the socket-keepalive API is now enabled by
default if neither flag is specified)
o DOxygen documentation is now generated with C++11
enabled (before it was documenting the pre-C++11 API)
* In the BitChord class, GetNumBytesInBitChord() and
GetNumWordsInBitChord() were mis-named. Fixed.
* Fixed a bug that affected MUSCLE subscriptions that
included a QueryFilter: If a DataNode matched a
subscription's node-path string, but its Message-payload
didn't match the QueryFilter's criteria (at the time the
subscription was created), then future modifications to the
DataNode would not cause the subscriber to be notified
even if the updated Message-payload did change to match
the QueryFilter's criteria.
* Modified StorageReflectSession::DoSubscribeRefCallback() to
take its argument via an object-pointer rather than
smuggling an integer delta-value to it inside a (void *).
7.03 Released 9/28/2018
- WarnOutOfMemory() now calls PrintStackTrace() (but not more
often than once every 5 seconds, to avoid spamming)
- BitChord::ClearUnusedBits() is now O(1) when compiled with C++11.
o support/BitChord.h will now fall back to its legacy implementation
if MUSCLE_AVOID_CPLUSPLUS11_BITCHORD is defined. (This define
will automatically be set if MUSCLE_AVOID_CPLUSPLUS11 is defined)
o Removed unnecessary call to ERR_print_errors_fp() from the
SSLSocketDataIO constructor.
* IPAddress's string-argument-constructor left its fields
uninitialized in the case where SetFromString() failed. Fixed.
* Fixed a bug in StorageRectSession::DoTraversalAux() that would
cause the node-traversal to skip first node-name specified in
the second (and later) path-strings in a Message.
7.02 Released 9/7/2018
- Added a function OptimizeMessageForTransmissionToMultipleGateways()
that can be used to greatly reduce a server's RAM usage when it is
going to send a large Message to multiple clients simultaneously.
- Added a function IsMessageOptimizedForTransmissionToMultipleGateways()
that will return true iff the specified Message has been tagged already.
- Added a GetDistanceTo() method to the String class that
returns the Levenshtein distance between two Strings.
- Added a GetInitialMemoryUsage() method to the CompleteSystemSystem class.
- Added a GetProcessMemoryUsage() function to MiscUtilityFunctions that
returns the current process's approximate resident heap-size, in bytes.
- Added a CreateConnectedSocketPair() convenience function
to message_transceiver_thread.py.
- Added AdoptRawDataArray() and ReleaseRawDataArray() methods to
the Queue class, so that a Queue can operate using an
externally-provided data-array if necessary.
o Replaced some #defines in GlobalMemoryAllocator.h with inline
functions instead, for more robust parsing.
7.01 Released 8/22/2018
- Added a EuclideanModulo() convenience function
to MuscleSupport.h
* Fixed some typos in the C++03 implementation of
BitChord::FromWords() and BitChord::FromBytes()
* Fixed a bug in Hashtable::MoveToPosition() that
would cause it not to correctly position the target
item when the specified position was in the latter
half of the table's iteration-sequence.
7.00 Released 8/10/2018
- Rewrote the BitChord class to be much more powerful and
easy to use (especially in conjunction with an enum
of flag-names). The implementation now includes variadic
methods (which are emulated via macros if C++11 isn't
available), a PseudoFlattenable interface, and a number
of new convenience methods.
- BitChord now implements HashCode() and can therefore be
used as a key-type in a Hashtable.
- BitChord now implements CalculateChecksum().
- BitChord::ToHexString() now returns a constant-length hex
string, instead of returning a string that starts only at
the first non-zero byte.
- Added a testbitchord.cpp test program to the tests folder.
- CleanupDNSLabel() and CleanupDNSPath() now accept an optional
second argument specifying additional characters that the
filter should allow to remain in the returned String.
- Under MacOS/X and BSD, MUSCLE sockets now have the SO_NOSIGPIPE
socket-option automatically set on them, to avoid spurious
SIGPIPE signals while running inside a debugger.
- Updated PythonUtilityFunctions.cpp to be compatible with Python3.
o Rewrote the CHILD_PROCESS_LAUNCH_BITS in the ChildProcessDataIO
class to use a BitChord typedef (ChildProcessLaunchFlags)
instead. Renamed them to CHILD_PROCESS_LAUNCH_FLAG_*.
o Removed the "inherit file descriptors" member variable and
arguments from the ChildProcessDataIO class and added a
CHILD_PROCESS_LAUNCH_FLAG_INHERIT_FDS flag to replace it.
o Added a (launchFlags) arg to the LaunchIndependentChildProcess()
convenience methods in the ChildProcessDataIO class.
o Changed the DATA_FLAG_* bits of the ByteBuffer class to
an enum, managed by the EndianFlags BitChord typedef.
Renamed them to ENDIAN_FLAG_* for clarity.
o Renamed ByteBuffer::SetDataFlags() to ByteBuffer::SetEndianFlags()
o BitChord is now implemented using uint32 words rather than
unsigned-int words.
o Modified the GetNetworkInterfaceInfos() function to take
a GNIIBits argument instead of a uint32 (and renamed the
GNII_* enums to GNII_FLAG_*)
o Renamed BitChord::GetBit() to BitChord::IsBitSet()
o Removed the inclusion of CoreFoundation/CFRunLoop.h
from DetectNetworkConfigChangesSession.h since having
it there could cause a namespace collision with Apple's
Point class.
o The ARRAYITEMS() templated method (in MuscleSupport.h)
is now declared constexpr under C++11 and higher.
o Moved the declaration of the Void class out of
util/Hashtable.h and into support/Void.h
o Modified the StringMatcher class to use BitChord
instead of a uint8 to hold its internal flags.
o Modified the FilePathInfo class to use BitChord
instead of a uint32 to hold its internal flags.
o Replaced the signal(SIGPIPE, SIG_IGN) call inside
NetworkSetupSystem with a less problematic call to
sigaction(SIGPIPE).
o Added some documentation for the BitChord class to
the MUSCLE-by-Example mkdocs pages.
* Updated the Python3 code in the python3 folder to
fix a couple of bugs (caused by code that was correct for
Python2 but needed to be written differently for Python3)
6.91 Released 7/26/2018
- Added Pete Goodeve's Python3 port of MUSCLE's existing Python2
files (into the new python3 sub-directory)
- Added a striphextermoutput utility program to the tests folder,
since I'm tired of doing stripping hexterm output by hand.
- hexterm now pays attention when you enter a blank line on stdin,
and takes that as a hint to break up its output into separate
Write() calls (useful when piping striphextermoutput's results
back into hexterm, since otherwise the data for separate UDP
packets could get combined into a single giant UDP packet, which
isn't helpful)
- hexterm now takes an optional "delay" argument; if the argument
is specified (e.g. "delay=100 milliseconds"), then hexterm will
insert a delay of that duration after each call to Write().
- MuscleSupport.h now uses stdint.h and inttypes.h by default as
the basis for its int8/int16/int32/int64/etc typedefs, rather
than trying to hand-roll them from the built-in C/C++ int/long
types. If for some reason you can't use that, you can add the
compiler flag -DMUSCLE_AVOID_STDINT to your command line and
the old approach will be used instead.
- Added SFINAE logic to the CloneObject() function (in Cloneable.h)
so that (on C++11 and later) it now works correctly for objects
that inherit Cloneable and also concrete objects that do not.
- MuscleSupport.h now uses static_assert() to verify type sizes,
if possible.
- MicroMessage.c and MiniMessage.c now have pseudo-static-asserts
so that they will generate compile-time errors if any of of the
intN typedefs have the wrong size.
- Added PutAndGetKey() convenience methods to the Hashtable class.
(They work the same as PutAndGet(), except they return a pointer
to the key object in the table, rather than the value object)
* Fixed a bug that would cause Ref::Clone() to return a
default-initialized item (rather than a clone of the existing item)
if it was called on an object being managed by an ObjectPool.
* Fixed a bug that would cause MuscleSupport.h to implicitly
defined MUSCLE_AVOID_CPLUSPLUS11 under MSVC2014/2017. (I made
the mistake of thinking that Microsoft would set the value of
the __cplusplus macro correctly, but they do not)
* The 32-bit/non-stdint typedefs for int32 and uint32 are now
based on int (and unsigned int, respectively) rather than
long/unsigned long.
6.90 Released 7/14/2018
- Updated SSLSocketDataIO.cpp to compile against newer
versions of OpenSSL.
- Added GetFirstKeyWithValue() and GetLastKeyWithValue()
convenience methods to the Hashtable class.
- CopyFile() now takes an optional third argument. The
third argument, if set to true, allows CopyFile() to also
recursively copy a directory, if the first argument is
the path of a directory.
o The MicroMessage API was designed in such a way that it was
easy to accidentally dereference a misaligned pointer and
invoke undefined behavior. I redesigned the API so that
misaligned pointers are no longer used or exposed to the
calling code, so that the MicroMessage API can now be used
e.g. on ARM CPUs.
* Fixed MSVC2017 compiler warning in PseudoFlattenable.h.
* Fixed a buffer overflow in test/printsourcelocations.cpp
* The C-based test programs in the test folder (microchatclient,
minichatclient, microreflectclient, and minireflectclient)
weren't handling socket-closed/EOF events correctly. Fixed.
* Added some code to MiniMessage.c so that data fields will
be longword-aligned even if ((sizeof(MMessageField)%8)!=0)
* MFree() in the MiniMessage API was defined to return (void *)
rather than (void), due to a copy/paste error. Fixed.
* Updated the MUSCLE_ENABLE_MEMORY_TRACKING implementations of
MAlloc(), MRealloc(), and MFree() to follow strict-aliasing rules.
* IPAddressAndPort::WithInterfaceIndex() and
IPAddress::WithInterfaceIndex() can now be called even
when MUSCLE_AVOID_IPV6 is defined.
6.85 Released 5/29/2018
- Added logic to CMakeLists.txt so that if libz isn't
installed on the build-system, it will automatically
fall back to using the captive implementation in zlib/zlib.
* Fixed a number of minor warnings that appeared when
compiling with clang++ and all warnings enabled.
* Fixed various typos and grammar problems in the MkDocs files.
* Added a sanity-check to Message::Unflatten() so that a
serialized Message with an impossibly-large entries-count
field will error out cleanly, rather than attempt to allocate
an impossibly-large Hashtable and exhaust the host's RAM.
6.84 Released 5/22/2018
- Added support for a -DMUSCLE_LOG_VERBOSE_SOURCE_LOCATIONS
command-line switch so that the log output can contain
full filename/line-number info, if desired.
- ReflectServer::ServerProcessLoop() will now print warnings
if it sees a session with no writeable socket and an
outgoing Message queue that keeps getting longer and longer.
o Added proper settings to the other build permutations in
the .vcxproj files in the muscle-by-example/examples/vc++14
folder.
* Win32AllocateStdioConsole() no longer attempts to redirect
both stdout and stderr to the same file when a filename is
supplied as its argument (because Windows apparently doesn't
support that). Instead, a separate xxx_stderr.txt file is
created to hold the stderr output.
6.83 Released 5/3/2018
- Rewrote the String::*IgnoreCase() methods to be more efficient
(they no longer call ToLowerCase()).
- Added Strcasestr() and StrcasestrEx() helper-functions to
String.{cpp,h}.
- Added a vc++14 sub-directory to the muscle-by-example\examples
folder. It contains a .sln, .vcxproj files, and a BUILD_ALL.bat
file, so that the "MUSCLE by Example" programs can be built
using Visual Studio 2015 (or higher).
* Added some missing .c and .cpp files to the the Visual
Studio projects in the vc++14 folder so that the
muscle-by-example example programs can all link.
o Improved the DOxygen-documentation and code-formatting in
String.{cpp,h} a bit.
o Modified several of the muscle-by-example example programs so
that they will compile and run even when C++11 support isn't
enabled.
o The Windows implementation of GetSystemPath() no longer calls
PathRemoveFileSpecA(), which means programs including
GetSystemPath() will no longer need to link to Shlwapi.lib.
o Added a TimeSetupSystem class (part of CompleteSetupSystem)
so that GetRunTime64() doesn't have to demand-calculate
clock-frequencies on its first call.
6.82 Released 4/25/2018
o test/Makefile-mt no longer tries to compile testreflectsession
except when executing on an OS that testreflectsession supports.
o Did some minor editing and re-arranging of the "MUSCLE by Example" pages.
o Replaced a number of `tags` in the MkDocs with [URLs](...)
o Removed private-inheritance of CountedObject from all the classes
that had it -- now they include a CountedObject private member
variable instead. This was done only because all that private
inheritance was cluttering up the DOxygen inheritance graphs.
o Added a DECLARE_COUNTED_OBJECT macro to CountedObject.h so that
any potential memory-overhead of CountedObjects can be eliminated
in cases where object-counting is not desired.
o Removed support for the -DMUSCLE_AVOID_OBJECT_COUNTING and added
a -DMUSCLE_ENABLE_OBJECT_COUNTING macro in its place. (That is,
the CountedObject class is now disabled-by-default and must be
explicitly enabled in order to use it)
o Added "MUSCLE by Example" documentation for MiscUtilityFunctions.{cpp,h}
* Changed a number of `tags` in the MUSCLE-by-Example MkDocs source
into [urls] so that the methods they mention can be quickly reviewed.
* server/Makefile now specifies libmuscle.a after the main() .o file.
* Fixed some gcc warnings in the tests folder (per Mika's suggestions)
* UnparseFile() wasn't quoting keywords with spaces properly. Fixed.
* Fixed the dependencies in the "MUSCLE by Example" examples' Makefiles.
6.81 Released 4/11/2018
- Added a "StorageReflectSession Message Types" section
to the "MUSCLE by Example" mkdocs pages
- Added a graphviz diagram to reflectserver.md
- Added an "xcode" sub-directory that contains a muscle.xcodeproj
project that compiles MUSCLE (contributed by Ruurd Adema)
o Added an if-test to TarFileWriter::WriteOctalASCII() to
avoid a spurious warning from gcc under Windows (reported by Mika)
o muscled and admin now link to libmuscle.a instead of directly
to the .o files.
o Changed the first parameter of ConvertReturnValueToMuscleSemantics()
from (int) to (long) in order to avoid compiler warnings.
* Merged in a number of patches from Ruurd Adema that fix compiler
warnings and errors in DOxygen comments. (Thanks Ruurd!)
* muscle/server/Makefile was inappropriately including muscled.o
in the libmuscle.a library. Fixed.
* muscle/server/Makefile was specifying certain build-flags twice. Fixed.
* Fixed a bug where the new item added by the zero-arguments
versions of Queue::AddTail() and Queue::AddHead()
was not being reliably default-initialized.
o Added a note to the zero-argument Queue::AddTailAndGet()
and Queue::AddHeadAndGet() methods' documentation that for
POD ItemTypes, the value they return a pointer to may not
be in an initialized state.
6.80 Released 4/2/2018
- Added the html/muscle-by-example tour MkDocs-source sub-directory.
- Added ReadFrom() and WriteTo() methods to the PacketDataIO API
(as convenient alternatives to calling SetPacketDestination()
and/or GetSourceOfLastReadPacket())
- PlainTextMessageIOGateway now properly supports packet-based I/O.
- MessageIOGateway, PlainTextMessageIOGateway, and
RawDataMessageIOGateway all now support a
PR_NAME_PACKET_REMOTE_LOCATION field which can be used to
determine a UDP packet's source and/or destination when the
gateway is being used in conjunction with a PacketDataIO.
- Added a GetFieldTypeForName(const String &) convenience method to
the Message class.
- Added an IPAddress(const String &) constructor.
- Added a GetPrettyTypeCodeString() function to Message.h, that returns
a String object (instead of writing into a char[] buf), because really.
- Added the IHostNameResolver interface, and the PutHostNameResolver(),
RemoveHostNameResolver(), and ClearHostNameResolvers() functions,
so that programs can add their own custom back-end functionality
to the GetHostByName() function if they want to.
- Added a GetHostByNameNative() function that does hostname lookup
without any IHostNameResolver callbacks.
- Added a Set() method to the IPAddressAndPort class.
o Changed UDPSocketDataIO::Write()'s multi-target behavior to
try to send to all targets even if some of the sends fail.
o Moved SeekableDataIO and PacketDataIO subclasses into their
own separate header files.
o Updated test/testudp.cpp to support PlainTextMessageIOGateway also.
* Fixed hexterm.vcproj to include some .cpp files that were missing.
* muscled and libmuscle.a are now compiled without the
-DMUSCLE_SINGLE_THREAD_ONLY and -DMUSCLE_ENABLE_MEMORY_TRACKING
flags, so that libmuscle.a can be used as-is in more projects.
* The PRINT_CALLS_PER_SECOND macro in TimeUtilityFunctions.h was
broken, and printed more often than it was supposed to. Fixed.
* Fixed a bug in SysLog.cpp's log-rotator code that could cause
it to delete log-files prematurely under certain circumstances.
* Fixed a bug that could cause Message::FindData(fn, B_ANY_TYPE, ...)
to crash.
* Added a number of additional .cpp files to the libmuscle.a
file generated in the server folder.
* Fixed an out-of-date comment in StdinDataIO.h
* Half-specified numeric-range clauses in StringMatcher strings
weren't being matched correctly. Fixed.
* The default value of the (launchBits) argument in some of the
ChildProcessDataIO::System() methods was set incorrectly. Fixed.
6.72 Released 1/5/2018
- MUSCLE_AVOID_CPLUSPLUS11 will now be #defined automatically
inside MuscleSupport.h if it wasn't explicitly specified AND
the __cplusplus preprocessor token is defined to a value
smaller than 201100.
- Added a muscleClearArray() templated convenience functions to
MuscleSupport.h
o Fixed a deprecation warning for kSCNetworkInterfaceTypePPTP in
NetworkUtilityFunctions.cpp (MacOS/X only)
o AtomicCounter.h and Mutex.h will now use the corresponding
C++11 APIs in their internal implementation unless
MUSCLE_AVOID_CPLUSPLUS11 is defined.
o Added logic to detect XCode versions before 8.0 and auto-enable
MUSCLE_AVOID_CPLUSPLUS11_THREAD_LOCAL_KEYWORD when they are
detected, since XCode's clang++ didn't support the thread_local
keyword before XCode 8.0.
* Fixed compile error in AtomicCounter.h if C++11 was enabled
and also MUSCLE_SINGLE_THREAD_ONLY was defined.
6.71 Released 11/3/2017
- Added a GetFieldType() method to the MessageFieldNameIterator
class, for convenience.
- Added a 'writeToStdout' argument to StdinDataIO's constructor so
that StdinDataIO can optionally Write() data to stdout as well.
(The argument defaults to false, for backwards compatibility)
- SanitySetupSystem now verifies that sizeof(void*)'s value
corresponds correctly to the presence/absence of the
MUSCLE_64_BIT_PLATFORM macro, and panics if it doesn't.
- Added constructors to MultiQueryFilter (and its subclasses)
that take a std::initializer_list of child ConstQueryFilterRef's,
for convenience. (requires C++11 or later to use)
o CMakeLists.txt now includes the files in the dataio subdirectory
as part of muscle.lib (except for SSLSocketDataIO.cpp, to avoid
creating a hard-coded OpenSSL dependency)
o Removed the 32-bit-specific implementation of CalculateHashCode64();
now the 64-bit is used on both 32-bit and 64-bit CPUs so that
the function will give the same results regardless of platform.
6.70 Released 10/17/2017
- The ReflectServer class, if a DetectNetworkConfigChanges session
is attached to it, will now automatically disconnect any non-local
TCP connections just before the local computer goes to sleep, in
order to avoid saddling any communicating peers with a moribund
TCP connection. It will reconnect them, if possible, after the
computer re-awakes.
- The DetectNetworkConfigChangesSession constructor now takes
an optional argument indicating whether or not its presence
should enable the behavior described in the previous bullet-point.
Defaults to true, but can be explicitly set false if you don't want
the new behavior for some reason.
- Added a back-end for the Thread class that uses C++11's std::thread
- Added a back-end for the Mutex class that uses C++11's std::recursive_mutex
- Added a back-end for the ThreadLocalStorage class that uses
C++11's thread_local keyword.
- Added a CMakeLists.txt file to the root directory, for those who
prefer to compile a basic MUSCLE library and muscled using cmake
(e.g. "cd muscle; mkdir _build; cd _build; cmake ..; make")
- Added a IsSelfAssigned() convenience method to the IPAddress class.
- Added FindFirstSessionOfType() and FindSessionsOfType() convenience
methods to the ReflectServer class.
o Moved the INetworkConfigChangesTarget interface out of
DetectNetworkConfigChanges.h and into its own separate header file.
o MUSCLE now requires a C++11 compiler by default. If you want to
compile MUSCLE using an older (pre-C++11) compiler, you'll need to
explicitly add -DMUSCLE_AVOID_CPLUSPLUS11 to your compile-flags.
o MuscleSupport.h now automatically defines -DMUSCLE_USE_CPLUSPLUS11_THREADS
if neither MUSCLE_AVOID_CPLUSPLUS11 nor MUSCLE_AVOID_CPLUSPLUS11_THREADS
has been defined.
o Checks for -DMUSCLE_USE_CPLUSPLUS11 have been removed, because
C++11 is now the default compiler level. C++11-specific code is
now guarded by #ifndef MUSCLE_AVOID_CPLUSPLUS11 instead.
o Removed the "borland" subdirectory since it's obsolete.
o Removed the deprecated SetReflectToSelf() and GetReflectToSelf()
methods from the DumbReflectSession class.
6.62 Released 9/14/2017
o Moved constructor-arguments in the .cpp files to separate lines,
for better diff-ability when they are modified.
o Removed the overrides of String::StartsWith() that took an
offset parameter, since it doesn't really make sense to check
for a prefix with an offset.
o Fixed some warnings flagged by clang++'s -Weverything option
o Lots of miscellaneous Doxygen header-comment fixes and cleanup
o Added a DoxyTemplates.h header file to serve as a repository
of common class-member definitions, to avoid repetitive boilerplate.
o Modified String::operator==() to call memcmp() rather than strcmp()
* Improved portablereflectclient's string parsing a little.
* Added "const" tag to several operators in the IPAddress class
that were supposed to have it, but didn't.
6.61 Released 7/21/2017
- Added a WithInterfaceIndex() convenience method to the IPAddress
class (for consistency with the IPAddressAndPort class's API)
* Fixed a sign-casting error in ParseHumanReadableSignedTimeIntervalString()
under Windows. Thanks to Mika Lindqvist for reporting this error.
* Fixed potential crash in GetSystemPath() under MacOS/X.
* Fixed the MCRASH macro to explicitly specify muscle::Crash()
rather than just Crash(), so that it will work when called from
other namespaces.
6.60 Released 6/22/2017
- Added SetPriority() and GetPriority() methods to the Thread
class, to allow specification of the CPU-priority a Thread
should run at.
- SimulatedMulticastDataIO's unicast-ping-packets now contain
location information about other members of the group, so that
even if some packets get dropped, there is a good chance that
all members will end up knowing about of all other members anyway.
- Added define MUSCLE_CONSTEXPR that expands to constexpr iff
MUSCLE_ENABLE_CPLUSPLUS11 is defined, or expands to nothing otherwise.
- Some static methods in IPAddress and IPAddressAndPort are now
tagged with MUSCLE_CONSTEXPR so that they can be evaluated
at compile-time, if necessary.
- Added an optional (roundUp) argument to the
GetHumanReadableTimeIntervalString() functions.
- Added SetPacketSendDestination() and GetPacketSendDestination()
virtual methods to the DataIO class.
- Added a ProxyDataIO class that passes through all calls
verbatim to its held child DataIO object
o Renamed XorDataIO to XorProxyDataIO, and made it a subclass
of ProxyDataIO.
o Renamed PacketizedDataIO to PacketizedProxyDataIO, and made it
a subclass of ProxyDataIO.
o Modified the UDPSocketDataIO class to contain the above two
virtual methods instead of SetSendDestination() and
GetSendDestination()
o Renamed the GetSendDestinations() and SetSendDestinations()
methods in UDPSocketDataIO to SetPacketSentDestinations() and
GetPacketSendDestinations(), respectively.
o Added a GetPacketSendDestination() method implementation to the
SimulatedMulticastDataIO class.
o Removed the GetInternalQThread() virtual method from the
Thread class, since there is now a more general (non-Qt-specific)
mechanism in the Thread class that can be used instead.
o Rewrote SimulatedMulticastDataIO to be simpler and more robust;
in particular it now only creates two UDP sockets instead of four.
o Removed the FailoverDataIO class, since it didn't seem useful.
o Renamed DataIO::GetPacketMaximumSize() to GetMaximuPacketSize()
o Split the DataIO class into separate classes: DataIO for
basic Read()/Write()-only I/O, SeekableDataIO for file-style
I/O where the current-seek-position can be Seek()'d, and
PacketDataIO for UDP-style packet-based I/O with explicit
source and destination IP addresses.
o Modified the various DataIO subclasses as necessary so that
they now subclass from the appropriate interface.
6.50 Released 6/6/2017
- Added SimulatedMulticastDataIO, which simulates multicast
communication via directed unicast. Useful for communicating
multicast-style across a WiFi network, where real multicast
communication doesn't work very well.
- hexterm now supports a "wifi" keyword, which if specified along
with the "udp=address:port" argument will replace the basic
UDPSocketDataIO functionality with SimulatedMulticastDataIO,
for testing purposes.
- Added some additional Inflate() and Deflate() methods
to the ZLibCodec class so that it can now write its
output into an existing ByteBuffer object rather than
allocating a new one from the byte-buffer-pool, if desired.
- hexterm now accepts a "verifyspam" argument; if specified,
hexterm will check incoming packets to see if they match
the dummy-data format sent out by hexterm's "spamspersecond"
feature, and if they do not, it will log an error message.
- Added a GetHardwareType() method to the
NetworkInterfaceInfo class. This method returns a
NETWORK_INTERFACE_HARDWARE_TYPE_* value indicating what
kind of network interface it is (e.g. Ethernet, WiFi, etc)
- Added a GetNetworkHardwareTypeString() static method to
the NetworkInterfaceInfo class. This returns a human-readable
string describing the given NETWORK_INTERFACE_HARDWARE_TYPE_*
- Added some MacOS/X-specific utility methods to the String class:
SetFromCFStringRef(), ToCFStringRef(), and a String constructor
method that takes a (const CFStringRef &)
- The ip_address and IPAddressAndPort classes now implement
the PseudoFlattenable interface to allow for easier handling.
o Renamed the ip_address type to IPAddress, and made it a real
class (and not a typedef'd alias for uint32) even when
MUSCLE_AVOID_IPV6 is defined. ip_address is now a typedef'd
alias to IPAddress, for backwards compatibility with old code.
o The various convenience methods that could be called on an
ip_address object (e.g. IsAddressIPv4(), IsAddressValid(),
IsAddressMulticast(), etc) are now methods in IPAddress instead.
o AtomicCounter now uses std::atomic<int32> internally,
if MUSCLE_USE_CPLUSPLUS11 is defined.
o PODSwapper and SwapContentsSwapper now check for the
corner-case where the two objects passed in are actually
the same object (and if so, they don't attempt a swap)
o Added a GetSourceOfLastReadPacket() method to the DataIO interface.
o UDPSocketDataIO::GetSourceOfLastReadPacket() is now virtual.
o Moved the ip_address/IPAddress and IPAddressAndPort classes'
declarations out of NetworkUtilityFunctions.h and into IPAddress.h
o Moved the NetworkInterfaceInfo class (and its associated
functions) out of NetworkUtilityFunctions.h and into
NetworkInterfaceInfo.h
* Fixed several places in the codebase that were inappropriately
relying on CFStringGetCStringPtr() to return a non-NULL value,
when in fact it is documented to return NULL sometimes.
* hexterm now exits gracefully when stdin is closed.
6.42 Released 5/12/2017
- Added SetPerProcessRunTime64Offset() and
GetPerProcessRunTime64Offset() calls, to support
adding an artificial constant to the values returned
by GetRunTime64(), for testing purposes
- Added ParseHumanReadableSignedTimeIntervalString()
and GetHumanReadableSignedTimeIntervalString() functions
to TimeUtilityFunctions.h for better parsing of
time-intervals that might be negative.
- Added some new convenience methods to the Hashtable
class: GetKeyAtWithDefault(), GetValueAt(), and
GetValueAtWithDefault()
o Modified the signatures of a few API calls (including
MessageIOGateway::UnflattenHeaderAndMessage(),
DeflateByteBuffer(), InflateByteBuffer, and the
RawDataQueryFilter class) to take a
(const ConstByteBufferRef &) rather than a
(const ByteBufferRef &), as they don't ever need to
modify the referenced ByteBuffer object anyway.
6.41 Released 3/23/2017
- Added ReadAndDeflateAndWrite() and ReadAndInflateAndWrite()
functions to the ZLibUtilityFunctions.{cpp,h} API, and
to the ZLibCodec class, to more easily support inflation/
deflation of large files without having to load all their
data into RAM at once.
- Added Visual Studio 2017 RTM project files, as provided by
Mika Lindqvist.
- FileDataIO::GetReadSelectSocket() and GetWriteSelectSocket()
now return valid ConstSocketRef objects on OS's that do
support select-ing on a file's file descriptor (read:
under POSIX-y OS's, but not under Windows)
- hexterm now supports a file=filename argument, in case
you want hexterm to read its input bytes from a file.
* Fixed a number of Doxygen-commenting oversights detected by
Alvaro Lopez Ortega's "doxy-coverage" comment-checking tool.
* Tweaked some of the serialization/deserialization code to be
more careful about avoiding non-aligned word accesses.
o Changed the "OUT OF MEMORY" error message produced by
WARN_OUT_OF_MEMORY macro to read "MEMORY ALLOCATION FAILURE"
instead (since these errors can be caused by a corrupted
heap as well as by actual memory exhaustion)
6.40 Released 2/10/2017
- Added templates constructors to the Ref<> and ConstRef<>
classes so that it is now possible to do implicit
upcasting when creating or assigning a Ref or ConstRef
object (e.g. DataIORef x = TCPSocketDataIORef(y))
- Added DECLARE_REFTYPES macros to the declarations of all
classes that are subclasses of RefCountable, for convenience.
- Integrated Mika Lindqvist's patch to qt_muscled.pro so
that qt_muscled now includes the necessary zlib files
under Windows.
o Removed explicit Ref-type-casting code from a number of
locations where it is no longer necessary.
6.38 Released 1/11/2017
- Added an Atoxll() function; it is the same as Atoull()
except that it parses hexadecimal strings into uint64s
rather than decimal strings.
- hexterm now allows you to optionally specify a local port
number to bind an otherwise transmit-only udp session to
(e.g. "./hexterm udp=127.0.0.1:5555_6666" would send to
port 5555 but listen for incoming packets on port 6666)
* Fixed a bug in MessageField::IsEqualTo() that could cause
two Message objects to be considered equivalent to each
other when in fact they are different.
6.37 Released 10/12/2016
o Added an AUTOCHOOSE_LEGACY_PRIMITIVE_KEY_TYPE_HACK for
(DataNode *) so that the code will again compile on old
(3.x) versions of g++ that don't support SFINAE properly.
- HandleStandardDaemonArgs() now prints out a list of network
interface information if the command line argument
"printnetworkinterfaces" is supplied by the user.
- ParseHexBytes() (and therefore any programs that depend on it,
such as hexterm) now understands C-style escaped-control-char
conventions, e.g. \r means carriage-return, \n means newline.
* Added a work-around for Windows' GetAdaptersAddresses() info
returning 255.255.255.255 as the broadcast address for an
IPv4 interface. GetNetworkInterfaceInfos() will now detect
when this happens and replace that address with the direct
broadcast address for the subnet (e.g. 192.168.0.255) instead.
6.36 Released 6/24/2016
- The NetworkInterfaceInfo class now has a GetMACAddress()
method that will return the 48-bit MAC address associated
with the interface.
- udpproxy will now join a UDP socket to its multicast group
if the provided IP address is a multicast IP address.
- Added a new function Crash() which does just what it says.
The MCRASH macro now calls Crash() after it prints a
stack trace.
o The POSIX implementation of PrintStackTrace() now calls
backtrace_symbols_fd() rather than backtrace_symbols(), to
avoid having to allocate memory when the heap might be corrupted.
6.35 Released 5/25/2016
o Revised MessageIOGateway::DoInputImplementation() so that if
a subclass's override of UnflattenHeaderAndMessage() has retained
a reference to its scratch-input-buffer, DoInputImplementation()
will recognize that and refrain from trying to reuse that buffer
as a place to store subsequent incoming Message data.
- Added Visual Studio 15 project files (Intel and ARM versions),
as provided by Mika Lindqvist.
* Fixed the MuscleQThreadSocketNotifier constructor so that it
will compile in conjunction with Qt 4.x.
* Merged in some ARM compatibility tweaks from Mika Lindqvist.
* Suppressed some MSVC type-conversion warnings in SetupSystem.cpp
6.34 Released 3/14/2016
- Added GetQThread() accessor methods to the Thread class. These
methods are only available when MUSCLE_USE_QT_THREADS is defined.
- Added support for a new preprocessor flag,
MUSCLE_ENABLE_QTHREAD_EVENT_LOOP_INTEGRATION. When this flag
is defined, the Thread::InternalThreadEntry() will use
QThread::exec() as its event loop rather than a simple
while(WaitForNextMessageFromOwner()) loop. This allows for
better integration with QObjects living inside the thread.
- Modified the ThreadedInternalSession class in the
qt_advanced_example to use a QTimer for its periodic messages
when MUSCLE_ENABLE_QTHREAD_EVENT_LOOP_INTEGRATION is defined,
rather than calling WaitForNextMessageFromOwner(), just as an
example of what can be done with better Qt integration.
o Replaced the Thread class's writable GetInternalSocketSet()
method with a more user-friendly API, including new methods
RegisterInternalThreadSocket(), UnregisterInternalThreadSocket(),
UnregisterAllInternalThreadSockets(), and IsInternalThreadSocketReady().
o Replaced the Thread class's writable GetOwnerSocketSet()
method with a more user-friendly API, including new methods
RegisterOwnerThreadSocket(), UnregisterOwnerThreadSocket(),