89 lines
3.6 KiB
C
89 lines
3.6 KiB
C
#ifndef _REEDSOLOMON_H_
|
|
#define _REEDSOLOMON_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//#define TIMER // 実験用
|
|
|
|
// Read all source & Keep some parity 方式
|
|
// 部分的なエンコードを行う最低ブロック数
|
|
#define PART_MIN_RATE 5 // ソース・ブロック数の 1/32 = 3.1%
|
|
|
|
// Read some source & Keep all parity 方式
|
|
// 一度に読み込む最少ブロック数
|
|
#define READ_MIN_RATE 1 // 保持するブロック数の 1/2 = 50%
|
|
#define READ_MIN_NUM 16
|
|
|
|
// CPU cache 最適化のため、同時に処理するブロック数を制限する
|
|
#define CACHE_MIN_NUM 8
|
|
#define CACHE_MAX_NUM 128
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
// Cache Blocking を試みる
|
|
int try_cache_blocking(int unit_size);
|
|
|
|
// 空きメモリー量からファイル・アクセスのバッファー・サイズを計算する
|
|
unsigned int get_io_size(
|
|
unsigned int buf_num, // 何ブロック分の領域を確保するのか
|
|
unsigned int *part_num, // 部分的なエンコード用の作業領域
|
|
size_t trial_alloc, // 確保できるか確認するのか
|
|
int alloc_unit); // メモリー単位の境界 (sse_unit か MEM_UNIT)
|
|
|
|
// 何ブロックまとめてファイルから読み込むかを空きメモリー量から計算する
|
|
int read_block_num(
|
|
int keep_num, // 保持するパリティ・ブロック数
|
|
size_t trial_alloc, // 確保できるか確認するのか
|
|
int alloc_unit); // メモリー単位の境界 (sse_unit か MEM_UNIT)
|
|
|
|
// 1st encode, decode を何スレッドで実行するか決める
|
|
int calc_thread_num1(int max_num);
|
|
|
|
// 1st & 2nd encode, decode を何スレッドで実行するか決める
|
|
int calc_thread_num2(int max_num, int *cpu_num2);
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
// リード・ソロモン符号を使ってエンコードする
|
|
int rs_encode(
|
|
wchar_t *file_path,
|
|
unsigned char *header_buf, // Recovery Slice packet のパケット・ヘッダー
|
|
HANDLE *rcv_hFile, // リカバリ・ファイルのハンドル
|
|
file_ctx_c *files, // ソース・ファイルの情報
|
|
source_ctx_c *s_blk, // ソース・ブロックの情報
|
|
parity_ctx_c *p_blk); // パリティ・ブロックの情報
|
|
|
|
// パリティ・ブロックをメモリー上に保持して、一度に読み書きする
|
|
int rs_encode_1pass(
|
|
wchar_t *file_path,
|
|
wchar_t *recovery_path, // 作業用
|
|
int packet_limit, // リカバリ・ファイルのパケット繰り返しの制限
|
|
int block_distri, // パリティ・ブロックの分配方法 (3-bit目は番号の付け方)
|
|
int packet_num, // 共通パケットの数
|
|
unsigned char *common_buf, // 共通パケットのバッファー
|
|
int common_size, // 共通パケットのバッファー・サイズ
|
|
unsigned char *footer_buf, // 末尾パケットのバッファー
|
|
int footer_size, // 末尾パケットのバッファー・サイズ
|
|
HANDLE *rcv_hFile, // リカバリ・ファイルのハンドル
|
|
file_ctx_c *files, // ソース・ファイルの情報
|
|
source_ctx_c *s_blk); // ソース・ブロックの情報
|
|
|
|
// リード・ソロモン符号を使ってデコードする
|
|
int rs_decode(
|
|
wchar_t *file_path,
|
|
int block_lost, // 失われたソース・ブロックの数
|
|
HANDLE *rcv_hFile, // リカバリ・ファイルのハンドル
|
|
file_ctx_r *files, // ソース・ファイルの情報
|
|
source_ctx_r *s_blk, // ソース・ブロックの情報
|
|
parity_ctx_r *p_blk); // パリティ・ブロックの情報
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|