@bravemobile/react-native-code-push 12.4.1 → 13.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CodePush.podspec +47 -2
  2. package/README.md +118 -3
  3. package/THIRD-PARTY-NOTICES +96 -0
  4. package/android/app/build.gradle +26 -0
  5. package/android/app/proguard-rules.pro +5 -0
  6. package/android/app/src/main/cpp/CMakeLists.txt +38 -0
  7. package/android/app/src/main/cpp/binarypatch_jni.c +181 -0
  8. package/android/app/src/main/java/com/microsoft/codepush/react/BinaryPatchAttempt.java +92 -0
  9. package/android/app/src/main/java/com/microsoft/codepush/react/BinaryPatchResult.java +64 -0
  10. package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +46 -11
  11. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBinaryPatch.java +293 -0
  12. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +25 -0
  13. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +79 -88
  14. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +159 -4
  15. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +13 -0
  16. package/android/app/src/main/java/com/microsoft/codepush/react/HDiffPatchNative.java +52 -0
  17. package/android/app/src/test/java/com/microsoft/codepush/react/CodePushBinaryPatchTest.java +393 -0
  18. package/android/app/src/test/java/com/microsoft/codepush/react/CodePushUpdateManagerBinaryPatchTest.java +207 -0
  19. package/android/app/src/test/java/com/microsoft/codepush/react/CodePushUpdateManagerDownloadTest.java +449 -0
  20. package/android/codepush-export.gradle +115 -0
  21. package/cli/commands/bundleCommand/bundleCodePush.ts +39 -7
  22. package/cli/commands/bundleCommand/index.ts +9 -1
  23. package/cli/commands/releaseCommand/addToReleaseHistory.ts +7 -0
  24. package/cli/commands/releaseCommand/index.test.ts +118 -0
  25. package/cli/commands/releaseCommand/index.ts +20 -2
  26. package/cli/commands/releaseCommand/release.test.ts +582 -0
  27. package/cli/commands/releaseCommand/release.ts +232 -15
  28. package/cli/dist/commands/bundleCommand/bundleCodePush.js +26 -7
  29. package/cli/dist/commands/bundleCommand/index.js +5 -1
  30. package/cli/dist/commands/releaseCommand/addToReleaseHistory.js +6 -1
  31. package/cli/dist/commands/releaseCommand/index.js +8 -1
  32. package/cli/dist/commands/releaseCommand/index.test.js +96 -0
  33. package/cli/dist/commands/releaseCommand/release.js +165 -17
  34. package/cli/dist/commands/releaseCommand/release.test.js +367 -0
  35. package/cli/dist/functions/makeBinaryPatchBundle.js +248 -0
  36. package/cli/dist/functions/makeBinaryPatchBundle.test.js +321 -0
  37. package/cli/dist/functions/makeCodePushBundle.js +4 -2
  38. package/cli/dist/functions/runHermesEmitBinaryCommand.js +98 -27
  39. package/cli/dist/functions/runHermesEmitBinaryCommand.test.js +100 -0
  40. package/cli/dist/jest.globalSetup.js +38 -0
  41. package/cli/dist/utils/binaryPatch.js +86 -0
  42. package/cli/dist/utils/binaryPatch.test.js +190 -0
  43. package/cli/functions/makeBinaryPatchBundle.test.ts +410 -0
  44. package/cli/functions/makeBinaryPatchBundle.ts +367 -0
  45. package/cli/functions/makeCodePushBundle.ts +4 -2
  46. package/cli/functions/runHermesEmitBinaryCommand.test.ts +124 -0
  47. package/cli/functions/runHermesEmitBinaryCommand.ts +112 -26
  48. package/cli/jest.globalSetup.ts +43 -0
  49. package/cli/utils/binaryPatch.test.ts +234 -0
  50. package/cli/utils/binaryPatch.ts +103 -0
  51. package/cpp/binarypatch/binarypatch_zstd_decompressor.c +187 -0
  52. package/cpp/binarypatch/binarypatch_zstd_decompressor.h +47 -0
  53. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/checksum_plugin.h +52 -0
  54. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/hpatch_mt/hpatch_mt.h +147 -0
  55. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch.c +3315 -0
  56. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch.h +268 -0
  57. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch_private.h +297 -0
  58. package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch_types.h +434 -0
  59. package/cpp/binarypatch/vendor/zstd/common/allocations.h +55 -0
  60. package/cpp/binarypatch/vendor/zstd/common/bits.h +205 -0
  61. package/cpp/binarypatch/vendor/zstd/common/bitstream.h +454 -0
  62. package/cpp/binarypatch/vendor/zstd/common/compiler.h +464 -0
  63. package/cpp/binarypatch/vendor/zstd/common/cpu.h +249 -0
  64. package/cpp/binarypatch/vendor/zstd/common/debug.c +30 -0
  65. package/cpp/binarypatch/vendor/zstd/common/debug.h +107 -0
  66. package/cpp/binarypatch/vendor/zstd/common/entropy_common.c +340 -0
  67. package/cpp/binarypatch/vendor/zstd/common/error_private.c +64 -0
  68. package/cpp/binarypatch/vendor/zstd/common/error_private.h +158 -0
  69. package/cpp/binarypatch/vendor/zstd/common/fse.h +625 -0
  70. package/cpp/binarypatch/vendor/zstd/common/fse_decompress.c +315 -0
  71. package/cpp/binarypatch/vendor/zstd/common/huf.h +277 -0
  72. package/cpp/binarypatch/vendor/zstd/common/mem.h +422 -0
  73. package/cpp/binarypatch/vendor/zstd/common/pool.c +371 -0
  74. package/cpp/binarypatch/vendor/zstd/common/pool.h +81 -0
  75. package/cpp/binarypatch/vendor/zstd/common/portability_macros.h +171 -0
  76. package/cpp/binarypatch/vendor/zstd/common/threading.c +182 -0
  77. package/cpp/binarypatch/vendor/zstd/common/threading.h +142 -0
  78. package/cpp/binarypatch/vendor/zstd/common/xxhash.c +18 -0
  79. package/cpp/binarypatch/vendor/zstd/common/xxhash.h +7094 -0
  80. package/cpp/binarypatch/vendor/zstd/common/zstd_common.c +48 -0
  81. package/cpp/binarypatch/vendor/zstd/common/zstd_deps.h +123 -0
  82. package/cpp/binarypatch/vendor/zstd/common/zstd_internal.h +324 -0
  83. package/cpp/binarypatch/vendor/zstd/common/zstd_trace.h +156 -0
  84. package/cpp/binarypatch/vendor/zstd/decompress/huf_decompress.c +1944 -0
  85. package/cpp/binarypatch/vendor/zstd/decompress/zstd_ddict.c +244 -0
  86. package/cpp/binarypatch/vendor/zstd/decompress/zstd_ddict.h +44 -0
  87. package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress.c +2410 -0
  88. package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_block.c +2209 -0
  89. package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_block.h +73 -0
  90. package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_internal.h +240 -0
  91. package/cpp/binarypatch/vendor/zstd/zstd.h +3206 -0
  92. package/cpp/binarypatch/vendor/zstd/zstd_errors.h +107 -0
  93. package/ios/CodePush/CodePush.h +58 -9
  94. package/ios/CodePush/{CodePush.m → CodePush.mm} +77 -63
  95. package/ios/CodePush/CodePushBinaryPatch.h +80 -0
  96. package/ios/CodePush/CodePushBinaryPatch.m +473 -0
  97. package/ios/CodePush/CodePushPackage.m +183 -2
  98. package/ios/CodePush/CodePushUpdateUtils.m +49 -1
  99. package/ios/CodePush.xcodeproj/project.pbxproj +6 -6
  100. package/package.json +28 -4
  101. package/react-native.config.js +3 -1
  102. package/scripts/binary-patch/build-hdiffpatch.sh +86 -0
  103. package/scripts/export-embedded-bundle.sh +76 -0
  104. package/src/CodePush.js +190 -96
  105. package/src/CodePush.test.js +382 -0
  106. package/src/native/NativeCodePush.ts +162 -0
  107. package/src/package-mixins.js +24 -11
  108. package/src/specs/NativeCodePush.ts +43 -0
  109. package/typings/react-native-code-push.d.ts +77 -0
  110. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +0 -102
  111. package/src/AlertAdapter.js +0 -24
@@ -0,0 +1,187 @@
1
+ #include "binarypatch_zstd_decompressor.h"
2
+
3
+ #include <stdlib.h>
4
+ #include <string.h>
5
+
6
+ #include "zstd.h"
7
+
8
+ /*
9
+ * Largest window a decompression session will accept, pinned to the window that the
10
+ * `-c-zstd-21-24` generation options use: no patch this project produces declares a
11
+ * window above 2^24. Keeping the bound at the generation limit means a corrupted
12
+ * frame header that asks for a wider window is rejected before anything is
13
+ * allocated, instead of being answered with an allocation that large - and applying
14
+ * a patch keeps several decompression sessions open at once, so the bound applies
15
+ * several times over. Changing the generation options is a patch format version
16
+ * change, and this bound moves with them.
17
+ */
18
+ #define BINARYPATCH_ZSTD_WINDOW_LOG_MAX 24
19
+
20
+ /*
21
+ * One decompression session. The input and output buffers are allocated in the
22
+ * same block as the struct (`buffers` is their start) to keep the number of
23
+ * allocations per patch session down.
24
+ */
25
+ typedef struct {
26
+ const hpatch_TStreamInput* codeStream;
27
+ hpatch_StreamPos_t codeReadPos;
28
+ hpatch_StreamPos_t codeEnd;
29
+
30
+ ZSTD_DStream* dstream;
31
+ ZSTD_inBuffer in;
32
+ size_t inCapacity;
33
+ ZSTD_outBuffer out;
34
+ size_t outReadPos; /* bytes of `out` already handed to the caller */
35
+
36
+ hpatch_dec_error_t decError;
37
+ unsigned char buffers[1]; /* [inCapacity bytes][out.size bytes] */
38
+ } binarypatch_zstd_session;
39
+
40
+ static hpatch_BOOL _zstd_fail(binarypatch_zstd_session* self) {
41
+ if (self->decError == hpatch_dec_ok) {
42
+ self->decError = hpatch_dec_error;
43
+ }
44
+ return hpatch_FALSE;
45
+ }
46
+
47
+ static hpatch_BOOL _zstd_is_can_open(const char* compressType) {
48
+ return (0 == strcmp(compressType, BINARYPATCH_ZSTD_COMPRESS_TYPE)) ? hpatch_TRUE : hpatch_FALSE;
49
+ }
50
+
51
+ static hpatch_decompressHandle _zstd_open(struct hpatch_TDecompress* decompressPlugin,
52
+ hpatch_StreamPos_t dataSize,
53
+ const struct hpatch_TStreamInput* codeStream,
54
+ hpatch_StreamPos_t code_begin,
55
+ hpatch_StreamPos_t code_end) {
56
+ const size_t inCapacity = ZSTD_DStreamInSize();
57
+ const size_t outCapacity = ZSTD_DStreamOutSize();
58
+ binarypatch_zstd_session* self;
59
+
60
+ /* The uncompressed size is tracked by the caller's patch stream, not here. */
61
+ (void)dataSize;
62
+
63
+ self = (binarypatch_zstd_session*)malloc(sizeof(binarypatch_zstd_session) + inCapacity + outCapacity);
64
+ if (!self) {
65
+ _hpatch_update_decError(decompressPlugin, hpatch_dec_mem_error);
66
+ return 0;
67
+ }
68
+ memset(self, 0, sizeof(binarypatch_zstd_session));
69
+ self->codeStream = codeStream;
70
+ self->codeReadPos = code_begin;
71
+ self->codeEnd = code_end;
72
+ self->in.src = self->buffers;
73
+ self->in.size = 0;
74
+ self->in.pos = 0; /* pos == size: the input buffer starts empty and is refilled on demand */
75
+ self->inCapacity = inCapacity;
76
+ self->out.dst = self->buffers + inCapacity;
77
+ self->out.size = outCapacity;
78
+ self->out.pos = 0;
79
+ self->outReadPos = 0;
80
+
81
+ self->dstream = ZSTD_createDStream();
82
+ if (!self->dstream) {
83
+ free(self);
84
+ _hpatch_update_decError(decompressPlugin, hpatch_dec_open_error);
85
+ return 0;
86
+ }
87
+ /*
88
+ * The window bound is applied here rather than left at zstd's default, and a
89
+ * session that cannot take it is refused: without the bound a corrupted frame
90
+ * header could ask for a much larger window than any patch legitimately needs.
91
+ */
92
+ if (ZSTD_isError(ZSTD_initDStream(self->dstream)) ||
93
+ ZSTD_isError(ZSTD_DCtx_setParameter(self->dstream, ZSTD_d_windowLogMax,
94
+ BINARYPATCH_ZSTD_WINDOW_LOG_MAX))) {
95
+ ZSTD_freeDStream(self->dstream);
96
+ free(self);
97
+ _hpatch_update_decError(decompressPlugin, hpatch_dec_open_error);
98
+ return 0;
99
+ }
100
+ return self;
101
+ }
102
+
103
+ static hpatch_BOOL _zstd_close(struct hpatch_TDecompress* decompressPlugin,
104
+ hpatch_decompressHandle decompressHandle) {
105
+ binarypatch_zstd_session* self = (binarypatch_zstd_session*)decompressHandle;
106
+ hpatch_BOOL result = hpatch_TRUE;
107
+ if (!self) {
108
+ return hpatch_TRUE;
109
+ }
110
+ /* Report the session's failure through the plugin so the caller can read it. */
111
+ if (self->decError != hpatch_dec_ok) {
112
+ _hpatch_update_decError(decompressPlugin, self->decError);
113
+ }
114
+ if (0 != ZSTD_freeDStream(self->dstream)) {
115
+ result = hpatch_FALSE;
116
+ _hpatch_update_decError(decompressPlugin, hpatch_dec_close_error);
117
+ }
118
+ free(self);
119
+ return result;
120
+ }
121
+
122
+ /*
123
+ * Must fill the whole `[out_part_data, out_part_data_end)` range; anything less is
124
+ * an error by the `hpatch_TDecompress` contract.
125
+ */
126
+ static hpatch_BOOL _zstd_decompress_part(hpatch_decompressHandle decompressHandle,
127
+ unsigned char* out_part_data,
128
+ unsigned char* out_part_data_end) {
129
+ binarypatch_zstd_session* self = (binarypatch_zstd_session*)decompressHandle;
130
+
131
+ while (out_part_data < out_part_data_end) {
132
+ size_t ready = self->out.pos - self->outReadPos;
133
+ size_t ret;
134
+
135
+ if (ready > 0) {
136
+ const size_t wanted = (size_t)(out_part_data_end - out_part_data);
137
+ if (ready > wanted) {
138
+ ready = wanted;
139
+ }
140
+ memcpy(out_part_data, (const unsigned char*)self->out.dst + self->outReadPos, ready);
141
+ out_part_data += ready;
142
+ self->outReadPos += ready;
143
+ continue;
144
+ }
145
+
146
+ if (self->in.pos == self->in.size) {
147
+ const hpatch_StreamPos_t remaining = self->codeEnd - self->codeReadPos;
148
+ unsigned char* inBuf = (unsigned char*)self->in.src;
149
+ size_t toRead = self->inCapacity;
150
+ if (remaining < (hpatch_StreamPos_t)toRead) {
151
+ toRead = (size_t)remaining;
152
+ }
153
+ self->in.pos = 0;
154
+ self->in.size = toRead;
155
+ if (toRead > 0) {
156
+ if (!self->codeStream->read(self->codeStream, self->codeReadPos, inBuf, inBuf + toRead)) {
157
+ return _zstd_fail(self);
158
+ }
159
+ self->codeReadPos += toRead;
160
+ }
161
+ }
162
+
163
+ self->out.pos = 0;
164
+ self->outReadPos = 0;
165
+ ret = ZSTD_decompressStream(self->dstream, &self->out, &self->in);
166
+ if (ZSTD_isError(ret)) {
167
+ return _zstd_fail(self);
168
+ }
169
+ /*
170
+ * No progress with no input left means the compressed stream ended before
171
+ * the patch asked for its last byte - a truncated or corrupt patch.
172
+ */
173
+ if (self->out.pos == 0) {
174
+ return _zstd_fail(self);
175
+ }
176
+ }
177
+ return hpatch_TRUE;
178
+ }
179
+
180
+ void binarypatch_zstd_decompressor_init(hpatch_TDecompress* out_decompressor) {
181
+ memset(out_decompressor, 0, sizeof(hpatch_TDecompress));
182
+ out_decompressor->is_can_open = _zstd_is_can_open;
183
+ out_decompressor->open = _zstd_open;
184
+ out_decompressor->close = _zstd_close;
185
+ out_decompressor->decompress_part = _zstd_decompress_part;
186
+ /* reset_code stays NULL: it is only needed for vcdiff style patches. */
187
+ }
@@ -0,0 +1,47 @@
1
+ /*
2
+ * zstd decompressor for HDiffPatch.
3
+ *
4
+ * HDiffPatch's patch functions take the decompressor as a plugin, so every codec
5
+ * the appliers must understand has to be supplied through `hpatch_TDecompress`.
6
+ * CodePush patches are always produced with `hdiffz -f -m-6 -c-zstd-21-24`, so
7
+ * zstd is the only codec implemented here; upstream ships a demo header covering
8
+ * a dozen codecs, but pulling that in would drag along headers for codecs the
9
+ * appliers never see.
10
+ *
11
+ * `hpatch_TDecompress` carries a mutable `decError` field, so each patch session
12
+ * must own its instance. Callers therefore declare the struct themselves and
13
+ * initialize it through `binarypatch_zstd_decompressor_init()`.
14
+ *
15
+ * This file and the vendored sources next to it sit outside the platform
16
+ * directories because both platforms compile them: iOS through the podspec at the
17
+ * repository root, Android through externalNativeBuild. One shared copy is what
18
+ * keeps the two appliers from drifting apart.
19
+ */
20
+
21
+ #ifndef BINARYPATCH_ZSTD_DECOMPRESSOR_H
22
+ #define BINARYPATCH_ZSTD_DECOMPRESSOR_H
23
+
24
+ #include "libHDiffPatch/HPatch/patch_types.h"
25
+
26
+ #ifdef __cplusplus
27
+ extern "C" {
28
+ #endif
29
+
30
+ /*
31
+ * The `compressType` string that `hdiffz -c-zstd-...` writes into the patch
32
+ * header, and the only value this decompressor accepts.
33
+ */
34
+ #define BINARYPATCH_ZSTD_COMPRESS_TYPE "zstd"
35
+
36
+ /*
37
+ * Fills `out_decompressor` with the zstd plugin implementation. The struct is
38
+ * fully overwritten, so it needs no prior initialization, and it holds no state
39
+ * that must be released.
40
+ */
41
+ void binarypatch_zstd_decompressor_init(hpatch_TDecompress* out_decompressor);
42
+
43
+ #ifdef __cplusplus
44
+ }
45
+ #endif
46
+
47
+ #endif /* BINARYPATCH_ZSTD_DECOMPRESSOR_H */
@@ -0,0 +1,52 @@
1
+ //checksum_plugin.h
2
+ // checksum plugin type
3
+ /*
4
+ The MIT License (MIT)
5
+ Copyright (c) 2018-2019 HouSisong
6
+
7
+ Permission is hereby granted, free of charge, to any person
8
+ obtaining a copy of this software and associated documentation
9
+ files (the "Software"), to deal in the Software without
10
+ restriction, including without limitation the rights to use,
11
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the
13
+ Software is furnished to do so, subject to the following
14
+ conditions:
15
+
16
+ The above copyright notice and this permission notice shall be
17
+ included in all copies of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
21
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26
+ OTHER DEALINGS IN THE SOFTWARE.
27
+ */
28
+ #ifndef HPatch_checksum_plugin_h
29
+ #define HPatch_checksum_plugin_h
30
+ #include "patch_types.h"
31
+ #ifdef __cplusplus
32
+ extern "C" {
33
+ #endif
34
+
35
+ typedef void* hpatch_checksumHandle;
36
+ typedef struct hpatch_TChecksum{
37
+ //return type tag; strlen(result)<=hpatch_kMaxPluginTypeLength; (Note:result lifetime)
38
+ const char* (*checksumType)(void); //ascii cstring,cannot contain '&'
39
+ hpatch_size_t (*checksumByteSize)(void); //0<result<=hpatch_kStreamCacheSize
40
+ hpatch_checksumHandle (*open)(struct hpatch_TChecksum* plugin);
41
+ void (*close)(struct hpatch_TChecksum* plugin,hpatch_checksumHandle handle);
42
+ void (*begin)(hpatch_checksumHandle handle); //must support reset
43
+ void (*append)(hpatch_checksumHandle handle,
44
+ const unsigned char* part_data,const unsigned char* part_data_end);
45
+ void (*end)(hpatch_checksumHandle handle,
46
+ unsigned char* checksum,unsigned char* checksum_end);
47
+ } hpatch_TChecksum;
48
+
49
+ #ifdef __cplusplus
50
+ }
51
+ #endif
52
+ #endif
@@ -0,0 +1,147 @@
1
+ // hpatch_mt.h
2
+ // hpatch
3
+ /*
4
+ The MIT License (MIT)
5
+ Copyright (c) 2025 HouSisong
6
+
7
+ Permission is hereby granted, free of charge, to any person
8
+ obtaining a copy of this software and associated documentation
9
+ files (the "Software"), to deal in the Software without
10
+ restriction, including without limitation the rights to use,
11
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the
13
+ Software is furnished to do so, subject to the following
14
+ conditions:
15
+
16
+ The above copyright notice and this permission notice shall be
17
+ included in all copies of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
21
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26
+ OTHER DEALINGS IN THE SOFTWARE.
27
+ */
28
+ #ifndef hpatch_mt_h
29
+ #define hpatch_mt_h
30
+ #include "../patch_types.h"
31
+ #ifdef __cplusplus
32
+ extern "C" {
33
+ #endif
34
+
35
+ typedef struct{
36
+ hpatch_byte writeNew_isMT; //0 or 1; if 1, start a thread for write to newData
37
+ hpatch_byte readOld_isMT; //0 or 1; if 1, start a thread for read from oldData
38
+ hpatch_byte readDiff_isMT; //0 or 1; if 1, start a thread for read from diffData
39
+ hpatch_byte decompressDiff_isMT; //0 or 1; if 1, start a thread for decompress diffData
40
+ //patch func run in main thread
41
+ } hpatchMTSets_t;
42
+
43
+ static const hpatchMTSets_t hpatchMTSets_no ={0,0,0,0};
44
+ static const hpatchMTSets_t hpatchMTSets_full={1,1,1,1};
45
+ static hpatch_force_inline
46
+ size_t _hpatchMTSets_threadNum(const hpatchMTSets_t mtsets){
47
+ return mtsets.writeNew_isMT+mtsets.readOld_isMT+mtsets.readDiff_isMT+mtsets.decompressDiff_isMT+1; }
48
+
49
+ static hpatch_force_inline
50
+ hpatchMTSets_t hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
51
+ const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,size_t stepMemSize,
52
+ size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets){
53
+ #if (_IS_USED_MULTITHREAD)
54
+ hpatchMTSets_t _hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
55
+ const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
56
+ hpatch_size_t windowOldBufSize,size_t stepMemSize,
57
+ size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets,hpatch_BOOL isWindow);
58
+ if (maxThreadNum<=1) return hpatchMTSets_no;
59
+ return _hpatch_getMTSets(newSize,oldSize,diffSize,decompressPlugin,kCacheCount,0,stepMemSize,
60
+ temp_cacheSumSize,maxThreadNum,mtsets,hpatch_FALSE);
61
+ #else
62
+ return hpatchMTSets_no;
63
+ #endif
64
+ }
65
+
66
+
67
+ #define _kCacheSgCount 3 //patch for singleCompressedDiff need cache count
68
+ hpatch_BOOL _patch_single_stream_mt(sspatch_listener_t* listener,
69
+ const hpatch_TStreamOutput* __out_newData,
70
+ const hpatch_TStreamInput* oldData,
71
+ const hpatch_TStreamInput* singleCompressedDiff,
72
+ hpatch_StreamPos_t diffInfo_pos,
73
+ sspatch_coversListener_t* coversListener,
74
+ size_t maxThreadNum,hpatchMTSets_t hpatchMTSets);
75
+ hpatch_BOOL _patch_single_compressed_diff_mt(const hpatch_TStreamOutput* out_newData,
76
+ const hpatch_TStreamInput* oldData,
77
+ const hpatch_TStreamInput* singleCompressedDiff,
78
+ hpatch_StreamPos_t diffData_pos,
79
+ hpatch_StreamPos_t uncompressedSize,
80
+ hpatch_StreamPos_t compressedSize,
81
+ hpatch_TDecompress* decompressPlugin,
82
+ hpatch_StreamPos_t coverCount,hpatch_size_t stepMemSize,
83
+ unsigned char* temp_cache,unsigned char* temp_cache_end,
84
+ sspatch_coversListener_t* coversListener,
85
+ size_t maxThreadNum,hpatchMTSets_t mtsets);
86
+
87
+ #if (_IS_USED_MULTITHREAD)
88
+
89
+ struct hpatch_mt_manager_t;
90
+
91
+ struct hpatch_mt_manager_t* hpatch_mt_manager_open(const hpatch_TStreamOutput** pout_newData,
92
+ const hpatch_TStreamInput** poldData,
93
+ const hpatch_TStreamInput** psingleCompressedDiff,
94
+ hpatch_StreamPos_t* pdiffData_pos,
95
+ hpatch_StreamPos_t* pdiffData_posEnd,
96
+ hpatch_StreamPos_t uncompressedSize,
97
+ hpatch_TDecompress** pdecompressPlugin,
98
+ size_t stepMemSize,
99
+ unsigned char** ptemp_cache,unsigned char** ptemp_cache_end,
100
+ sspatch_coversListener_t** pcoversListener,
101
+ hpatch_BOOL isOnStepCoversInThread,
102
+ size_t kCacheCount,
103
+ hpatchMTSets_t mtsets);
104
+
105
+ hpatch_BOOL hpatch_mt_manager_close(struct hpatch_mt_manager_t* self,hpatch_BOOL isOnError);
106
+
107
+
108
+
109
+ struct hpatch_mt_manager_win_t;
110
+ struct hcache_window_old_mt_t;
111
+
112
+ static hpatch_force_inline
113
+ hpatchMTSets_t hpatch_getMTSets_win(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
114
+ const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
115
+ hpatch_size_t windowOldBufSize, hpatch_size_t stepMemSize,
116
+ size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets){
117
+ #if (_IS_USED_MULTITHREAD)
118
+ if (maxThreadNum<=1) return hpatchMTSets_no;
119
+ hpatchMTSets_t _hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
120
+ const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
121
+ hpatch_size_t windowOldBufSize,size_t stepMemSize,
122
+ size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets,hpatch_BOOL isWindow);
123
+ return _hpatch_getMTSets(newSize,oldSize,diffSize,decompressPlugin,kCacheCount,windowOldBufSize,stepMemSize,
124
+ temp_cacheSumSize,maxThreadNum,mtsets,hpatch_TRUE);
125
+ #else
126
+ return hpatchMTSets_no;
127
+ #endif
128
+ }
129
+
130
+ struct hpatch_mt_manager_win_t* hpatch_mt_manager_win_open(const hpatch_TStreamOutput** pout_newData,
131
+ const hpatch_TStreamInput** poldData,const hpatch_TStreamInput** pwindowDiffStream,
132
+ hpatch_StreamPos_t* pdiffData_pos, hpatch_StreamPos_t* pdiffData_posEnd,
133
+ hpatch_StreamPos_t uncompressedSize, hpatch_TDecompress** pdecompressPlugin,
134
+ hpatch_StreamPos_t windowCount,hpatch_size_t windowOldBufSize, hpatch_size_t stepMemSize,
135
+ unsigned char** ptemp_cache, unsigned char** ptemp_cache_end,
136
+ size_t kCacheCount, hpatchMTSets_t mtsets);
137
+
138
+ struct hcache_window_old_mt_t* hpatch_mt_manager_win_oldCache(struct hpatch_mt_manager_win_t* self);
139
+
140
+ hpatch_BOOL hpatch_mt_manager_win_close(struct hpatch_mt_manager_win_t* self,hpatch_BOOL isOnError);
141
+
142
+ #endif // _IS_USED_MULTITHREAD
143
+
144
+ #ifdef __cplusplus
145
+ }
146
+ #endif
147
+ #endif //hpatch_mt_h