Skip to content

Commit

Permalink
Convert thpoolman_param to value (s3fs-fuse#2430)
Browse files Browse the repository at this point in the history
This simplifies memory management.
  • Loading branch information
gaul authored Mar 13, 2024
1 parent c97f7a2 commit 31676f6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 37 deletions.
10 changes: 5 additions & 5 deletions src/fdcache_fdinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -449,13 +449,13 @@ bool PseudoFdInfo::ParallelMultipartUpload(const char* path, const mp_part_list_
thargs->petag = petag;

// make parameter for thread pool
std::unique_ptr<thpoolman_param> ppoolparam(new thpoolman_param);
ppoolparam->args = thargs;
ppoolparam->psem = &uploaded_sem;
ppoolparam->pfunc = PseudoFdInfo::MultipartUploadThreadWorker;
thpoolman_param ppoolparam;
ppoolparam.args = thargs;
ppoolparam.psem = &uploaded_sem;
ppoolparam.pfunc = PseudoFdInfo::MultipartUploadThreadWorker;

// setup instruction
if(!ThreadPoolMan::Instruct(std::move(ppoolparam))){
if(!ThreadPoolMan::Instruct(ppoolparam)){
S3FS_PRN_ERR("failed setup instruction for uploading.");
delete thargs;
return false;
Expand Down
45 changes: 17 additions & 28 deletions src/threadpoolman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,14 @@ void ThreadPoolMan::Destroy()
}
}

bool ThreadPoolMan::Instruct(std::unique_ptr<thpoolman_param> pparam)
bool ThreadPoolMan::Instruct(const thpoolman_param& param)
{
if(!ThreadPoolMan::singleton){
S3FS_PRN_WARN("The singleton object is not initialized yet.");
return false;
}
return ThreadPoolMan::singleton->SetInstruction(std::move(pparam));
ThreadPoolMan::singleton->SetInstruction(param);
return true;
}

//
Expand All @@ -84,30 +85,25 @@ void* ThreadPoolMan::Worker(void* arg)
}

// get instruction
std::unique_ptr<thpoolman_param> pparam;
thpoolman_param param;
{
AutoLock auto_lock(&(psingleton->thread_list_lock));

if(!psingleton->instruction_list.empty()){
pparam = std::move(psingleton->instruction_list.front());
psingleton->instruction_list.pop_front();
if(!pparam){
S3FS_PRN_WARN("Got a semaphore, but the instruction is empty.");
}
if(psingleton->instruction_list.empty()){
S3FS_PRN_DBG("Got a semaphore, but the instruction is empty.");
continue;
}else{
S3FS_PRN_WARN("Got a semaphore, but there is no instruction.");
pparam = nullptr;
param = psingleton->instruction_list.front();
psingleton->instruction_list.pop_front();
}
}

if(pparam){
void* retval = pparam->pfunc(pparam->args);
if(nullptr != retval){
S3FS_PRN_WARN("The instruction function returned with somthign error code(%ld).", reinterpret_cast<long>(retval));
}
if(pparam->psem){
pparam->psem->post();
}
void* retval = param.pfunc(param.args);
if(nullptr != retval){
S3FS_PRN_WARN("The instruction function returned with somthign error code(%ld).", reinterpret_cast<long>(retval));
}
if(param.psem){
param.psem->post();
}
}

Expand Down Expand Up @@ -235,23 +231,16 @@ bool ThreadPoolMan::StartThreads(int count)
return true;
}

bool ThreadPoolMan::SetInstruction(std::unique_ptr<thpoolman_param> pparam)
void ThreadPoolMan::SetInstruction(const thpoolman_param& param)
{
if(!pparam){
S3FS_PRN_ERR("The parameter value is nullptr.");
return false;
}

// set parameter to list
{
AutoLock auto_lock(&thread_list_lock);
instruction_list.push_back(std::move(pparam));
instruction_list.push_back(param);
}

// run thread
thpoolman_sem.post();

return true;
}

/*
Expand Down
7 changes: 3 additions & 4 deletions src/threadpoolman.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

#include <atomic>
#include <list>
#include <memory>
#include <vector>

#include "psemaphore.h"
Expand Down Expand Up @@ -53,7 +52,7 @@ struct thpoolman_param
thpoolman_param() : args(nullptr), psem(nullptr), pfunc(nullptr) {}
};

typedef std::list<std::unique_ptr<thpoolman_param>> thpoolman_params_t;
typedef std::list<thpoolman_param> thpoolman_params_t;

typedef std::vector<pthread_t> thread_list_t;

Expand Down Expand Up @@ -89,12 +88,12 @@ class ThreadPoolMan

bool StopThreads();
bool StartThreads(int count);
bool SetInstruction(std::unique_ptr<thpoolman_param> pparam);
void SetInstruction(const thpoolman_param& pparam);

public:
static bool Initialize(int count);
static void Destroy();
static bool Instruct(std::unique_ptr<thpoolman_param> pparam);
static bool Instruct(const thpoolman_param& pparam);
};

#endif // S3FS_THREADPOOLMAN_H_
Expand Down

0 comments on commit 31676f6

Please sign in to comment.