libdvr: Perform TimeShift, ffdfb have no effect.Frequency.[1/1]
PD#SWPL-24607
Problem:
Perform TimeShift,fffb and rewind have no effect.Frequency.
Solution:
1.there has NULL case at segment thread.
2. malloc segment at del api and free at thread if thread
creat success.
Verify:
verified on 214.
Signed-off-by: hualing chen <hualing.chen@amlogic.com>
Change-Id: I748e5e8492525c6dc135462177ad45d0e993ca94
diff --git a/src/dvr_segment.c b/src/dvr_segment.c
index 4ee1262..ea797c5 100644
--- a/src/dvr_segment.c
+++ b/src/dvr_segment.c
@@ -10,21 +10,24 @@
typedef struct {
char location[DVR_MAX_LOCATION_SIZE]; /**< DVR record file location*/
uint64_t id; /**< DVR Segment id*/
+ pthread_mutex_t lock; /**< DVR segment lock*/
} DVR_SegmentFile_t;
void *dvr_segment_thread(void *arg)
{
- DVR_SegmentFile_t file;
int ret;
+ DVR_SegmentFile_t *segment_file = (DVR_SegmentFile_t*)arg;
pthread_detach(pthread_self());
-
- memcpy(&file, arg, sizeof(DVR_SegmentFile_t));
- DVR_DEBUG(1, "%s try to delete [%s-%lld]", __func__, file.location, file.id);
- ret = segment_delete(file.location, file.id);
- DVR_DEBUG(1, "%s delete segment [%s-%lld] %s", __func__, file.location, file.id,
+ DVR_DEBUG(1, "%s try to delete [%s-%lld]", __func__, segment_file->location, segment_file->id);
+ ret = segment_delete(segment_file->location, segment_file->id);
+ DVR_DEBUG(1, "%s delete segment [%s-%lld] %s", __func__, segment_file->location, segment_file->id,
ret == DVR_SUCCESS ? "success" : "failed");
-
+ if (segment_file != NULL) {
+ //malloc at delete api.free at this
+ free(segment_file);
+ segment_file = NULL;
+ }
return NULL;
}
@@ -32,18 +35,27 @@
{
pthread_t thread;
- DVR_SegmentFile_t segment;
+ DVR_SegmentFile_t *segment;
+ //this segment will be free at del thread when used end.if thread
+ //creat error.will be free now.
+ segment = (DVR_SegmentFile_t *)malloc(sizeof(DVR_SegmentFile_t));
DVR_DEBUG(1, "%s in, %s,id:%lld", __func__, location, segment_id);
+ DVR_RETURN_IF_FALSE(segment);
DVR_RETURN_IF_FALSE(location);
DVR_RETURN_IF_FALSE(strlen(location) < DVR_MAX_LOCATION_SIZE);
- memset(segment.location, 0, sizeof(segment.location));
- memcpy(segment.location, location, strlen(location));
- segment.id = segment_id;
- pthread_create(&thread, NULL, dvr_segment_thread, &segment);
- /*make sure the thread running and args taken*/
- usleep(10*1000);
+ memset(segment->location, 0, sizeof(segment->location));
+ memcpy(segment->location, location, strlen(location));
+ segment->id = segment_id;
+ int ret = pthread_create(&thread, NULL, dvr_segment_thread, segment);
+ if (ret != 0) {
+ //creat thread error,need free segment
+ if (segment != NULL) {
+ free(segment);
+ segment = NULL;
+ }
+ }
return DVR_SUCCESS;
}