#define TASK_OK 0
#define TASK_ERROR -1
int ms_task_set_name(const char* name);
#define TASK_HANDLE pthread_t
int ms_task_create(TASK_HANDLE *handle, void *(*func)(void *), void *arg);//detached
int ms_task_create_join(TASK_HANDLE *handle, void *(*func)(void *), void *arg);//join
int ms_task_create_join_stack_size(TASK_HANDLE *handle, int size, void *(*func)(void *), void *arg);
int ms_task_join(TASK_HANDLE *handle);
int ms_task_detach(TASK_HANDLE *handle);
int ms_task_cancel(TASK_HANDLE *handle);
#define ms_task_quit(ptr) pthread_exit(ptr)
int ms_task_set_name(const char* name)
{
char thread_name[128] = {0};
if (!name)
return -1;
snprintf(thread_name, sizeof(thread_name), "%s(%ld)", name, syscall(SYS_gettid));
prctl(PR_SET_NAME, thread_name, 0, 0, 0);
return 0;
}
int ms_task_create(TASK_HANDLE *handle, void *(*func)(void *), void *arg)
{
int ret;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(handle, &attr, func, arg);
if (ret) {
printf("%s Failed: %d\n", __FUNCTION__, ret);
pthread_attr_destroy(&attr);
return TASK_ERROR;
}
pthread_detach(*handle);
pthread_attr_destroy(&attr);
return TASK_OK;
}
int ms_task_create_join(TASK_HANDLE *handle, void *(*func)(void *), void *arg)
{
int ret;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
ret = pthread_create(handle, &attr, func, arg);
if (ret) {
printf("%s Failed: %d\n", __FUNCTION__, ret);
pthread_attr_destroy(&attr);
return TASK_ERROR;
}
pthread_attr_destroy(&attr);
return TASK_OK;
}
int ms_task_create_join_stack_size(TASK_HANDLE *handle, int size, void *(*func)(void *), void *arg)
{
int ret;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
if (size >= 16*1024)
pthread_attr_setstacksize(&attr, size);
ret = pthread_create(handle, &attr, func, arg);
if (ret) {
printf("%s Failed: %d\n", __FUNCTION__, ret);
pthread_attr_destroy(&attr);
return TASK_ERROR;
}
pthread_attr_destroy(&attr);
return TASK_OK;
}
int ms_task_join(TASK_HANDLE *handle)
{
int ret;
if(!handle)
return TASK_ERROR;
ret = pthread_join(*handle, NULL);
if (ret) {
printf("%s Failed: %d\n", __FUNCTION__, ret);
return TASK_ERROR;
}
return TASK_OK;
}
int ms_task_detach(TASK_HANDLE *handle)
{
return pthread_detach(*handle);
}
int ms_task_cancel(TASK_HANDLE *handle)
{
return pthread_cancel(*handle);
}
void *thread_playback_export(void *param)
{
struct ms_playback_bkp_remote bkp = *(struct ms_playback_bkp_remote *)param;
remote_backup_msfs_record_file_start(bkp.from, &bkp.combkp, sizeof(struct rep_export_common_backup));
if(param) ms_free(param);
remove("/tmp/pbdownload");
ms_task_quit(NULL);
return 0;
}
static void on_get_remotepb_download(int reqfrom, void *param, int size)
{
struct rep_export_common_backup *tmpBkp = (struct rep_export_common_backup *)param;
if (!tmpBkp) return;
struct ms_playback_bkp_remote *bkp = ms_malloc(sizeof(struct ms_playback_bkp_remote));
if (!bkp) return;
memcpy(&bkp->combkp, tmpBkp, sizeof(struct rep_export_common_backup));
bkp->from = reqfrom;
ms_task_create(&bkp->handle, thread_playback_export, (void *)bkp);
return ;
}