blob: 2e09de2419a611784fd6b619aaa1304525e4e01c [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 <ignite/impl/ignite_environment.h>
#include <ignite/impl/ignite_binding_impl.h>
using namespace ignite::common::concurrent;
namespace ignite
{
namespace impl
{
IgniteBindingImpl::IgniteBindingImpl(IgniteEnvironment &env) :
env(env),
callbacks()
{
// No-op.
}
int64_t IgniteBindingImpl::InvokeCallback(bool& found, int32_t type, int32_t id,
binary::BinaryReaderImpl& reader, binary::BinaryWriterImpl& writer)
{
int64_t key = makeKey(type, id);
CsLockGuard guard(lock);
std::map<int64_t, Callback*>::iterator it = callbacks.find(key);
found = it != callbacks.end();
if (found)
{
Callback* callback = it->second;
// We have found callback and does not need lock here anymore.
guard.Reset();
return callback(reader, writer, env);
}
return 0;
}
void IgniteBindingImpl::RegisterCallback(int32_t type, int32_t id, Callback* proc, IgniteError& err)
{
int64_t key = makeKey(type, id);
CsLockGuard guard(lock);
bool inserted = callbacks.insert(std::make_pair(key, proc)).second;
guard.Reset();
if (!inserted)
{
std::stringstream builder;
builder << "Trying to register multiple PRC callbacks with the same ID. [type="
<< type << ", id=" << id << ']';
err = IgniteError(IgniteError::IGNITE_ERR_ENTRY_PROCESSOR, builder.str().c_str());
}
}
void IgniteBindingImpl::RegisterCallback(int32_t type, int32_t id, Callback* callback)
{
IgniteError err;
RegisterCallback(type, id, callback, err);
IgniteError::ThrowIfNeeded(err);
}
}
}