• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 58,  comments - 75,  trackbacks - 0

            1
            int ACE_WFMO_Reactor::handle_events (ACE_Time_Value &how_long)
            {
            ? return this->event_handling (&how_long, FALSE);
            }

            2
            // Waits for and dispatches all events.? Returns -1 on error, 0 if
            // max_wait_time expired, or the number of events that were dispatched.
            int ACE_WFMO_Reactor::event_handling (ACE_Time_Value *max_wait_time,
            ????????????????????????????????????? int alertable)
            {
            ? ACE_TRACE ("ACE_WFMO_Reactor::event_handling");

            ? // Make sure we are not closed
            ? if (!this->open_for_business_ || this->deactivated_)
            ????? return -1;

            ? // Stash the current time -- the destructor of this object will
            ? // automatically compute how much time elapsed since this method was
            ? // called.
            ? ACE_Countdown_Time countdown (max_wait_time);

            ? int result;
            ?
            ? do
            ? {
            ????? // Check to see if it is ok to enter ::WaitForMultipleObjects
            ????? // This will acquire <this->lock_> on success On failure, the
            ????? // lock will not be acquired
            ?????
            ????? result = this->ok_to_wait (max_wait_time, alertable);
            ????? if (result != 1)
            ??????? return result;

            ????? // Increment the number of active threads
            ????? ++this->active_threads_;

            ????? // Release the <lock_>
            ????? this->lock_.release ();

            ????? // Update the countdown to reflect time waiting to play with the
            ????? // mut and event.
            ?????
            ????? countdown.update ();

            ????? // Calculate timeout
            ????? int timeout = this->calculate_timeout (max_wait_time);

            ????? // Wait for event to happen
            ????? DWORD wait_status = this->wait_for_multiple_events (timeout,
            ????????????????????????????????????????????????????????? alertable);

            ????? // Upcall
            ????? result = this->safe_dispatch (wait_status);
            ????? if (0 == result)
            ????? {
            ????????? // wait_for_multiple_events timed out without dispatching
            ????????? // anything.? Because of rounding and conversion errors and
            ????????? // such, it could be that the wait loop timed out, but
            ????????? // the timer queue said it wasn't quite ready to expire a
            ????????? // timer. In this case, max_wait_time won't have quite been
            ????????? // reduced to 0, and we need to go around again. If max_wait_time
            ????????? // is all the way to 0, just return, as the entire time the
            ????????? // caller wanted to wait has been used up.
            ????????? countdown.update ();???? // Reflect time waiting for events
            ?????????
            ????????? if (0 == max_wait_time || max_wait_time->usec () == 0)
            ??????????? break;
            ????? }
            ? }while (result == 0);

            ? return result;
            }

            3
            int ACE_WFMO_Reactor::safe_dispatch (DWORD wait_status)
            {
            ? int result = -1;
            ? ACE_SEH_TRY
            ? {
            ????? result = this->dispatch (wait_status);
            ? }
            ? ACE_SEH_FINALLY
            ? {
            ????? this->update_state ();
            ? }

            ? return result;
            }

            4
            int ACE_WFMO_Reactor::dispatch (DWORD wait_status)
            {
            ? int handlers_dispatched = 0;

            ? // Expire timers
            ? handlers_dispatched += this->expire_timers ();

            ? switch (wait_status)
            ? {
            ? case WAIT_FAILED: // Failure.
            ????? ACE_OS::set_errno_to_last_error ();
            ????? return -1;

            ? case WAIT_TIMEOUT: // Timeout.
            ????? errno = ETIME;
            ????? return handlers_dispatched;

            ? default:? // Dispatch.
            ????? // We'll let dispatch worry about abandoned mutes.
            ????? handlers_dispatched += this->dispatch_handles (wait_status);
            ????? return handlers_dispatched;
            ? }
            }

            5
            // Dispatches any active handles from <handles_[slot]> to
            // <handles_[max_handlep1_]>, polling through our handle set looking
            // for active handles.

            int ACE_WFMO_Reactor::dispatch_handles (DWORD wait_status)
            {
            ? // dispatch_slot is the absolute slot.? Only += is used to
            ? // increment it.
            ? DWORD dispatch_slot = 0;

            ? // Cache this value, this is the absolute value.
            ? DWORD max_handlep1 = this->handler_rep_.max_handlep1 ();

            ? // nCount starts off at <max_handlep1>, this is a transient count of
            ? // handles last waited on.
            ? DWORD nCount = max_handlep1;

            ? for (int number_of_handlers_dispatched = 1;;++number_of_handlers_dispatched)
            ? {
            ????? const bool ok = (wait_status >= WAIT_OBJECT_0 && wait_status <= (WAIT_OBJECT_0 + nCount));

            ????? if (ok)
            ??????? dispatch_slot += wait_status - WAIT_OBJECT_0;
            ????? else
            ??????? // Otherwise, a handle was abandoned.
            ??????? dispatch_slot += wait_status - WAIT_ABANDONED_0;

            ????? // Dispatch handler
            ????? if (this->dispatch_handler (dispatch_slot, max_handlep1) == -1)
            ??????? return -1;

            ????? // Increment slot
            ????? ++dispatch_slot;

            ????? // We're done.
            ????? if (dispatch_slot >= max_handlep1)
            ??????? return number_of_handlers_dispatched;

            ????? // Readjust nCount
            ????? nCount = max_handlep1 - dispatch_slot;

            ????? // Check the remaining handles
            ????? wait_status = this->poll_remaining_handles (dispatch_slot);
            ????? switch (wait_status)
            ????? {
            ??????? case WAIT_FAILED: // Failure.
            ????????? ACE_OS::set_errno_to_last_error ();
            ????????? /* FALLTHRU */
            ??????? case WAIT_TIMEOUT:
            ????????? // There are no more handles ready, we can return.
            ????????? return number_of_handlers_dispatched;
            ????? }
            ? }
            }

            6
            int ACE_WFMO_Reactor::dispatch_handler (DWORD slot,
            ??????????????????????????????????????? DWORD max_handlep1)
            {
            ? // Check if there are window messages that need to be dispatched
            ? if (slot == max_handlep1)
            ??? return this->dispatch_window_messages ();

            ? // Dispatch the handler if it has not been scheduled for deletion.
            ? // Note that this is a very week test if there are multiple threads
            ? // dispatching this slot as no locks are held here. Generally, you
            ? // do not want to do something like deleting the this pointer in
            ? // handle_close() if you have registered multiple times and there is
            ? // more than one thread in WFMO_Reactor->handle_events().
            ? else if (!this->handler_rep_.scheduled_for_deletion (slot))
            ? {
            ????? ACE_HANDLE event_handle = *(this->handler_rep_.handles () + slot);

            ????? if (this->handler_rep_.current_info ()[slot].io_entry_)
            ??????? return this->complex_dispatch_handler (slot,
            ?????????????????????????????????????????????? event_handle);
            ????? else
            ??????? return this->simple_dispatch_handler (slot,
            ????????????????????????????????????????????? event_handle);
            ? }
            ? else
            ??? // The handle was scheduled for deletion, so we will skip it.
            ??? return 0;
            }

            7
            int ACE_WFMO_Reactor::complex_dispatch_handler (DWORD slot,
            ??????????????????????????????????????????????? ACE_HANDLE event_handle)
            {
            ? // This dispatch is used for I/O entires.

            ? ACE_WFMO_Reactor_Handler_Repository::Current_Info &current_info =
            ??? this->handler_rep_.current_info ()[slot];

            ? WSANETWORKEVENTS events;
            ? ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;
            ? if (::WSAEnumNetworkEvents ((SOCKET) current_info.io_handle_,
            ????????????????????????????? event_handle,
            ????????????????????????????? &events) == SOCKET_ERROR)
            ??? problems = ACE_Event_Handler::ALL_EVENTS_MASK;
            ? else
            ? {
            ????? // Prepare for upcalls. Clear the bits from <events> representing
            ????? // events the handler is not interested in. If there are any left,
            ????? // do the upcall(s). upcall will replace events.lNetworkEvents
            ????? // with bits representing any functions that requested a repeat
            ????? // callback before checking handles again. In this case, continue
            ????? // to call back unless the handler is unregistered as a result of
            ????? // one of the upcalls. The way this is written, the upcalls will
            ????? // keep being done even if one or more upcalls reported problems.
            ????? // In practice this may turn out not so good, but let's see. If any
            ????? // problems, please notify Steve Huston <shuston@riverace.com>
            ????? // before or after you change this code.
            ????? events.lNetworkEvents &= current_info.network_events_;
            ????? while (events.lNetworkEvents != 0)
            ????? {
            ????????? ACE_Event_Handler *event_handler = current_info.event_handler_;

            ????????? int reference_counting_required =
            ??????????? event_handler->reference_counting_policy ().value () ==
            ??????????? ACE_Event_Handler::Reference_Counting_Policy::ENABLED;

            ????????? // Call add_reference() if needed.
            ????????? if (reference_counting_required)
            ????????? {
            ????????????? event_handler->add_reference ();
            ????????? }

            ????????? // Upcall
            ????????? problems |= this->upcall (current_info.event_handler_,
            ??????????????????????????????????? current_info.io_handle_,
            ??????????????????????????????????? events);

            ????????? // Call remove_reference() if needed.
            ????????? if (reference_counting_required)
            ????????? {
            ????????????? event_handler->remove_reference ();
            ????????? }

            ????????? if (this->handler_rep_.scheduled_for_deletion (slot))
            ??????????? break;
            ????? }
            ? }

            ? if (problems != ACE_Event_Handler::NULL_MASK
            ????? && !this->handler_rep_.scheduled_for_deletion (slot)? )
            ??? this->handler_rep_.unbind (event_handle, problems);

            ? return 0;
            }

            8
            ACE_Reactor_Mask ACE_WFMO_Reactor::upcall (ACE_Event_Handler *event_handler,
            ?????????????????????????????????????????? ACE_HANDLE io_handle,
            ?????????????????????????????????????????? WSANETWORKEVENTS &events)
            {
            ? // This method figures out what exactly has happened to the socket
            ? // and then calls appropriate methods.
            ? ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;

            ? // Go through the events and do the indicated upcalls. If the handler
            ? // doesn't want to be called back, clear the bit for that event.
            ? // At the end, set the bits back to <events> to request a repeat call.

            ? long actual_events = events.lNetworkEvents;
            ? int action;

            ? if (ACE_BIT_ENABLED (actual_events, FD_WRITE))
            ? {
            ????? action = event_handler->handle_output (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_WRITE);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::WRITE_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_CONNECT))
            ? {
            ????? if (events.iErrorCode[FD_CONNECT_BIT] == 0)
            ????? {
            ????????? // Successful connect
            ????????? action = event_handler->handle_output (io_handle);
            ????????? if (action <= 0)
            ????????? {
            ????????????? ACE_CLR_BITS (actual_events, FD_CONNECT);
            ????????????? if (action == -1)
            ??????????????? ACE_SET_BITS (problems, ACE_Event_Handler::CONNECT_MASK);
            ????????? }
            ????? }
            ????? // Unsuccessful connect
            ????? else
            ????? {
            ????????? action = event_handler->handle_input (io_handle);
            ????????? if (action <= 0)
            ????????? {
            ????????????? ACE_CLR_BITS (actual_events, FD_CONNECT);
            ????????????? if (action == -1)
            ??????????????? ACE_SET_BITS (problems, ACE_Event_Handler::CONNECT_MASK);
            ????????? }
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_OOB))
            ? {
            ????? action = event_handler->handle_exception (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_OOB);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::EXCEPT_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_READ))
            ? {
            ????? action = event_handler->handle_input (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_READ);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::READ_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_CLOSE)
            ????? && ACE_BIT_DISABLED (problems, ACE_Event_Handler::READ_MASK))
            ? {
            ????? action = event_handler->handle_input (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_CLOSE);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::READ_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_ACCEPT))
            ? {
            ????? action = event_handler->handle_input (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_ACCEPT);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::ACCEPT_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_QOS))
            ? {
            ????? action = event_handler->handle_qos (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_QOS);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::QOS_MASK);
            ????? }
            ? }

            ? if (ACE_BIT_ENABLED (actual_events, FD_GROUP_QOS))
            ? {
            ????? action = event_handler->handle_group_qos (io_handle);
            ????? if (action <= 0)
            ????? {
            ????????? ACE_CLR_BITS (actual_events, FD_GROUP_QOS);
            ????????? if (action == -1)
            ??????????? ACE_SET_BITS (problems, ACE_Event_Handler::GROUP_QOS_MASK);
            ????? }
            ? }

            ? events.lNetworkEvents = actual_events;
            ? return problems;
            }

            posted on 2007-02-22 10:54 walkspeed 閱讀(1594) 評論(0)  編輯 收藏 引用 所屬分類: ACE Farmeworks

            <2007年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(4)

            隨筆分類(64)

            隨筆檔案(58)

            文章分類(3)

            文章檔案(3)

            相冊

            收藏夾(9)

            C++零碎

            好友

            搜索

            •  

            積分與排名

            • 積分 - 160837
            • 排名 - 163

            最新評論

            閱讀排行榜

            評論排行榜

            久久播电影网| 久久超碰97人人做人人爱| 久久九九久精品国产| 久久se精品一区二区影院| 日韩十八禁一区二区久久| 亚洲日韩中文无码久久| 老司机国内精品久久久久| 久久99久久无码毛片一区二区| 久久久高清免费视频| 久久免费国产精品一区二区| 亚洲国产成人久久综合一区77| 久久国产色AV免费看| 麻豆久久久9性大片| 久久青草国产精品一区| 一本色综合网久久| 欧美与黑人午夜性猛交久久久| 色欲久久久天天天综合网精品| 狠狠色伊人久久精品综合网| 国内精品久久人妻互换| 久久人人爽人人爽人人片AV东京热 | 久久综合给合久久国产免费| 久久久久综合中文字幕| 国产成人久久精品激情| 亚洲中文字幕久久精品无码APP| 久久99国产一区二区三区| 国内精品久久久久影院免费| 久久夜色精品国产网站| 久久人人爽人人爽人人片av麻烦| 久久久久人妻一区精品| 精品国产热久久久福利| 国产高清美女一级a毛片久久w| 99国产欧美精品久久久蜜芽 | 久久这里有精品视频| 91麻精品国产91久久久久| 国产精品一久久香蕉国产线看| 久久久无码精品亚洲日韩按摩| 狠狠色狠狠色综合久久| 久久久久久久波多野结衣高潮| 伊人久久综合无码成人网| 国产成人精品久久| 国内精品伊人久久久久av一坑 |