blob: 8e46bc2b0d6a5f5a0a58bf65b5ecbb8910e775dd [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* Licensed 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 "oscl_dns_tuneables.h"
#include "oscl_dns_param.h"
#include "oscl_scheduler_ao.h"
#include "oscl_dns_request.h"
#include "oscl_assert.h"
#include "oscl_error.h"
#include "oscl_dns_method.h"
#include "oscl_dns_imp.h"
#include "pvlogger.h"
//Remove ref from either thread.
void DNSRequestParam::RemoveRef()
{
uint32 count;
#if(PV_DNS_IS_THREAD)
iLock.Lock();
#endif
count = --iRefCount;
#if(PV_DNS_IS_THREAD)
iLock.Unlock();
#endif
if (count == 0)
Destroy();
}
DNSRequestParam::DNSRequestParam(TPVDNSFxn aFxn)
: iFxn(aFxn)
, iDNSRequest(NULL)
#if (PV_DNS_IS_THREAD)
, iThreadKillFlag(false)
#endif
{
#if (PV_DNS_IS_THREAD)
iLock.Create();
iStartup.Create();
#endif
iRefCount = 1;
}
#if(PV_DNS_SERVER)
void DNSRequestParam::InThread()
//Called under get host by name request thread or under caller's API.
{
//Add a ref to this object
iRefCount++;
#if (PV_DNS_IS_THREAD)
//Signal that thread startup is complete.
//Note: A "kill" could occur at any time after this point so
//it's important not to access any memory outside of
//this class from now on.
iStartup.Signal();
#endif
int32 complete;
int32 dnserr;
OSCL_ASSERT(iFxn == EPVDNSGetHostByName);
//this call blocks
OsclDNSI::ProcessDnsRequest((GetHostByNameParam*)this, complete, dnserr);
#if(PV_DNS_IS_THREAD)
//Check for kill flag. If so, then the request was completed by
//app thread. In that case this thread just exits gracefully
//without reporting completion to the original caller which may no longer
//exist.
iLock.Lock();
bool kill = iThreadKillFlag;
if (!kill)
iDNSRequest->Complete(true, complete, dnserr);
iLock.Unlock();
#else
iDNSRequest->Complete(true, complete, dnserr);
#endif
//Remove the ref to this object.
RemoveRef();
}
#endif
GetHostByNameParam* GetHostByNameParam::Create(const char *name,
OsclNetworkAddress* &addr)
{
Oscl_TAlloc<GetHostByNameParam, TDNSRequestParamAllocator> alloc;
GetHostByNameParam* self = alloc.allocate(1);
if (self)
OSCL_PLACEMENT_NEW(self, GetHostByNameParam(name, addr));
return self;
}
void GetHostByNameParam::Destroy()
{
Oscl_TAlloc<GetHostByNameParam, TDNSRequestParamAllocator> alloc;
alloc.destruct_and_dealloc(this);
}
GetHostByNameParam::~GetHostByNameParam()
{
TDNSRequestParamAllocator alloc;
alloc.deallocate(iName);
iName = NULL;
}
GetHostByNameParam::GetHostByNameParam(const char *name,
OsclNetworkAddress* &addr)
: DNSRequestParam(EPVDNSGetHostByName)
, iName(NULL)
, iAddr(addr)
{
uint32 size = oscl_strlen(name);
TDNSRequestParamAllocator alloc;
iName = (char*)alloc.allocate(size + 8);
OsclError::LeaveIfNull(iName);
oscl_strncpy(iName, name, (size + 1));
iAddr->ipAddr.Set("");
}