blob: eead93199ec32d427d27322c75313c5eabf007f4 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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.
* -------------------------------------------------------------------
*/
#ifndef OSCL_SOCKET_SERV_IMP_PV_H_INCLUDED
#define OSCL_SOCKET_SERV_IMP_PV_H_INCLUDED
#include "oscl_socket_serv_imp_base.h"
#include "oscl_socket_serv_imp_reqlist.h"
#include "oscl_socket_tuneables.h"
/** PV socket server implementation
*/
#if PV_SOCKET_SERVER_IS_THREAD
#include "oscl_semaphore.h"
#include "oscl_mutex.h"
#else
#include "oscl_scheduler_ao.h"
#endif
class PVServiStats;
/** PV socket server implementation
*/
#if (PV_SOCKET_SERVER_IS_THREAD)
class OsclSocketServI: public HeapBase, public OsclSocketServIBase
#else
class OsclSocketServI: public OsclTimerObject, public OsclSocketServIBase
#endif
{
public:
static OsclSocketServI* NewL(Oscl_DefAlloc &a);
int32 Connect(uint32 aMessageSlots);
void Close(bool);
//check if calling context is server thread.
//in non-threaded implementation, will always return "true".
bool IsServerThread();
private:
OsclSocketServI(Oscl_DefAlloc &a);
~OsclSocketServI();
void ConstructL();
//socket request list.
OsclSocketServRequestList iSockServRequestList;
#if PV_SOCKET_SERVER_SELECT_LOOPBACK_SOCKET
//blocking select wakeup feature
class LoopbackSocket
{
public:
LoopbackSocket()
{
iEnable = false;
iContainer = NULL;
}
bool iEnable;
void Read();
void ProcessSelect(TOsclSocket&);
void Init(OsclSocketServI* aContainer);
void Cleanup();
void Write();
#if PV_OSCL_SOCKET_STATS_LOGGING
OsclSocketStats iStats;
#endif
private:
TOsclSockAddr iAddr;
TOsclSocket iSocket;
OsclSocketServI* iContainer;
};
LoopbackSocket iLoopbackSocket;
#endif
uint32 iSelectPollIntervalMsec;
void WakeupBlockingSelect()
{
#if PV_SOCKET_SERVER_SELECT_LOOPBACK_SOCKET
if (iLoopbackSocket.iEnable)
iLoopbackSocket.Write();
#endif
}
int32 StartServImp();
void ConstructServImp();
void CleanupServImp();
void StopServImp();
void ServerEntry();
void ServerExit();
#if PV_SOCKET_SERVER_IS_THREAD
TOsclThreadId iThreadId;
//start & exit semaphores.
OsclSemaphore iStart, iExit;
//thread exit flag
bool iClose;
public:
//this needs to be public for use by the thread routine.
void InThread();
private:
#else
//for AO implemenation.
void Run();
void WakeupAO();
#if PV_SOCKET_SERVER_SELECT
int iNhandles;
int iNfds;
#endif
#endif
#if PV_SOCKET_SERVER_SELECT
//select flags.
fd_set iReadset, iWriteset, iExceptset;
void ProcessSocketRequests(int &, int &n);
#else
void ProcessSocketRequests();
#endif
friend class OsclSocketServRequestList;
friend class LoopbackSocket;
friend class OsclTCPSocketI;
friend class OsclUDPSocketI;
friend class OsclSocketI;
friend class OsclDNSI;
friend class OsclSocketRequest;
friend class OsclSocketServ;
PVServiStats* iServiStats;
};
/** A bitmask for socket select operations
*/
#define OSCL_READSET_FLAG 0x04
#define OSCL_WRITESET_FLAG 0x02
#define OSCL_EXCEPTSET_FLAG 0x01
#endif