blob: 5c2fdf8b90517b9c50829b53404c26bb71053f70 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/mman.h>
#include <memory>
#include <string>
#include "core/ClassLoader.h"
namespace org {
namespace apache {
namespace nifi {
namespace minifi {
namespace core {
ClassLoader::ClassLoader() {
}
ClassLoader &ClassLoader::getDefaultClassLoader() {
static ClassLoader ret;
// populate ret
return ret;
}
uint16_t ClassLoader::registerResource(const std::string &resource, const std::string &resourceFunction) {
void *resource_ptr = nullptr;
if (resource.empty()) {
dlclose(dlopen(0, RTLD_LAZY | RTLD_GLOBAL));
resource_ptr = dlopen(0, RTLD_NOW | RTLD_GLOBAL);
} else {
dlclose(dlopen(resource.c_str(), RTLD_LAZY | RTLD_GLOBAL));
resource_ptr = dlopen(resource.c_str(), RTLD_NOW | RTLD_GLOBAL);
}
if (!resource_ptr) {
return RESOURCE_FAILURE;
} else {
std::lock_guard<std::mutex> lock(internal_mutex_);
dl_handles_.push_back(resource_ptr);
}
// reset errors
dlerror();
// load the symbols
createFactory* create_factory_func = reinterpret_cast<createFactory*>(dlsym(resource_ptr, resourceFunction.c_str()));
const char* dlsym_error = dlerror();
if (dlsym_error) {
return RESOURCE_FAILURE;
}
ObjectFactory *factory = create_factory_func();
std::lock_guard<std::mutex> lock(internal_mutex_);
for (auto class_name : factory->getClassNames()) {
loaded_factories_[class_name] = std::unique_ptr<ObjectFactory>(factory->assign(class_name));
}
delete factory;
return RESOURCE_SUCCESS;
}
} /* namespace core */
} /* namespace minifi */
} /* namespace nifi */
} /* namespace apache */
} /* namespace org */