(file) Return to selector.h CVS log (file) (dir) Up to [OMI] / omi / protocol

File: [OMI] / omi / protocol / Attic / selector.h (download)
Revision: 1.1.1.1 (vendor branch), Wed May 30 21:47:49 2012 UTC (12 years, 1 month ago) by mike
Branch: TOG
CVS Tags: OMI_1_0_2_Branch, OMI_1_0_2, OMI_1_0_1_PRE, OMI_1_0_1, OMI_1_0_0
Changes since 1.1: +0 -0 lines
Initial Import

/*
**==============================================================================
**
** Open Management Infrastructure (OMI)
**
** Copyright (c) Microsoft Corporation
** 
** 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 
**
** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
** MERCHANTABLITY OR NON-INFRINGEMENT. 
**
** See the Apache 2 License for the specific language governing permissions 
** and limitations under the License.
**
**==============================================================================
*/

#ifndef _omi_selector_h
#define _omi_selector_h

#include "config.h"
#include <common.h>
#include "sock.h"
#include <base/list.h>
#include <base/messages.h>

BEGIN_EXTERNC

#define SELECTOR_ADD        (1 << 0)
#define SELECTOR_READ       (1 << 1)
#define SELECTOR_WRITE      (1 << 2)
#define SELECTOR_EXCEPTION  (1 << 3)
#define SELECTOR_TIMEOUT    (1 << 4)
#define SELECTOR_REMOVE     (1 << 5)
#define SELECTOR_DESTROY    (1 << 6)
#define SELECTOR_IGNORE_READ_OVERLOAD    (1 << 7)

typedef struct _Selector Selector;
typedef struct _Handler Handler;

struct _Handler
{
    Handler* next;
    Handler* prev;
    Sock sock;
    MI_Uint32 mask;
    /* time when selector gets 'timeout' event - typically Time_Now() + ttl-in-usec;
      '0' means 'ignore me' */
    MI_Uint64 fireTimeoutAt;  
    MI_Boolean (*callback)(Selector*, Handler*, MI_Uint32 mask, MI_Uint64 currentTimeUsec);
    void* data;
};

struct _Selector
{
    struct _SelectorRep* rep;
};

typedef void (*Selector_NotificationCallback)(void* self, Message* message);

MI_Result Selector_Init(
    Selector* self);

void Selector_Destroy(
    Selector* self);

MI_Result Selector_AddHandler(
    Selector* self,
    Handler* handler);

MI_Result Selector_RemoveHandler(
    Selector* self,
    Handler* handler);

/* Used for quick shutdown procedure */
MI_Result Selector_RemoveAllHandlers(
    Selector* self);

MI_Result Selector_ContainsHandler(
    Selector* self,
    Handler* handler);

/* Runs socket processing loop;
    Parameters:
    self - selector
    timeoutUsec - time to run 
    
    Retunrs:
    OK - was stopped by StopRunning call
    FAILED - system call 'select' failed or no more sockets to monitor
    TIMEOUT - timeout reached 
*/
MI_Result Selector_Run(
    Selector* self,
    MI_Uint64 timeoutUsec);

/* Informs selector's Run method that it should exit normaly.
    Funciton is safe for calling from signal hanlder */
MI_Result Selector_StopRunning(
    Selector* self);

/* Wakes up selector's thread 
    Typical usage is to recalculate timeouts on handlers
    when selector's Run is running in different thread */
MI_Result Selector_Wakeup(
    Selector* self);

/* 
    * This function guaranties that callback is called in 'Run'/'IO' thread context,
    * so no locking is required for accessing sokcet objects, updating buffers etc
*/
MI_Result Selector_CallInIOThread(
    Selector* self,
    Selector_NotificationCallback  callback,
    void* callback_self,
    Message* message);

/*
    Informs selector that new Instance was created;
    Selector keeps track of number of Instances
    so it can implement back-pressure (primitive) by
    disabling read from oop and blocking other-thread providers
*/
void Selector_NewInstanceCreated(
    Selector* self,
    Message* msg);


/*
    Verifies if selector is in 'stressed' mode
    and too many instance are alive now
*/
MI_Boolean  Selector_IsStressed(
    Selector* self);


/*
    Sets flag 'allowEmptySelector' to allow 
    'run' call on empty selector
*/
void Selector_SetAllowEmptyFlag(
    Selector* self,
    MI_Boolean allowEmptySelector);

END_EXTERNC

#endif /* _omi_selector_h */

ViewCVS 0.9.2