示例#1
0
文件: udp.cpp 项目: zylthinking/fibio
 asio::ip::udp::endpoint resolve(const asio::ip::udp::resolver::query &q,
                                        std::error_code &ec) {
     asio::ip::udp::endpoint ep;
     fibers::detail::fiber_ptr_t this_fiber(fibers::detail::fiber_object::current_fiber_->shared_from_this());
     asio::ip::udp::resolver resolver(this_fiber->io_service_);
     CHECK_CALLER(this_fiber);
     if (this_fiber->caller_) {
         (*(this_fiber->caller_))([this_fiber, &q, &ep, &resolver](){
             this_fiber->state_=fibers::detail::fiber_object::BLOCKED;
             resolver.async_resolve(q, (this_fiber->fiber_strand_.wrap([this_fiber, &ep](const std::error_code &ec, asio::ip::udp::resolver::iterator iterator){
                 this_fiber->last_error_=ec;
                 if (!ec) {
                     ep=*iterator;
                 }
                 this_fiber->state_=fibers::detail::fiber_object::RUNNING;
                 this_fiber->one_step();
             })));
         });
     } else {
         // TODO: Error
     }
     if (this_fiber->last_error_) {
         ec=this_fiber->last_error_;
         this_fiber->last_error_.clear();
     }
     return ep;
 }
示例#2
0
文件: defs.c 项目: morrisxd/PMC
/* 
 * The most IMPORTANT function !!!
 *
 * added by ikoo for testing -m{-i} optarg  
 * fix me: something to do with cvstmp handling is not perfect.     
 * 
 * int PB_MR_CHECK (void *debug) 
 */
int
pb_mrchk (void *debug)
{
        int err = 0;
        int found_it = 0;
        unsigned long loglen = 0;
        char cvstmp[TMPBUFLEN];

        CHECK_CALLER (getcaller ());
        if (0 == found_it)
                goto skip_check;
        sprintf (cvstmp, "[PB]Error MRID or User Name. Please check" " your MR or User Name in CVS");
        saved_message = cm_get_sm ();
        if (saved_message[0] != '-')
        {
                error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}.");
                return -2;
        }
        if (saved_message[1] != 'i')
        {
                error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}.");
                return -2;
        }
        loglen = strlen (saved_message);
        if (2 > checkquote (saved_message))
        {
                /* error (1, 0, cvstmp); */
                error (1, 0, "[PB]Need mrid. Usage:{-i\"{mrid}\"......]}.");
                return -3;
        }
        getmrid (saved_message, mrid);
        sprintf (cvstmp, "[PB]Error MRID[%s] or User Name. Please check" " your MR or User Name in CVS", mrid);
        err = querymrid (getcaller (), mrid);
        if (1 == err)
        {
                /* sprintf(cvstmp, "MRID[%s] NOT valid!.", mrid); */
                sprintf (cvstmp, "Error MR[%s] Status. Check if the input" " MR is in assigned or deferred status.", mrid);
                error (1, 0, cvstmp);
        }
        else if (0 == err)
        {
                sprintf (cvstmp, "MRID[%s] valid.", mrid);
                error (0, 0, cvstmp);
        }
        else
        {                       /* err < 0 means net error */
                error (1, 0, "!!!Communication error with MR webserver!!!");
        }
      	skip_check:
        return 0;
}                               /* end of added by ikoo */
示例#3
0
文件: udp.cpp 项目: zylthinking/fibio
 std::error_code connect(asio::ip::udp::socket &s, const asio::ip::udp::endpoint &remote_ep, uint64_t timeout) {
     std::error_code ec;
     fibers::detail::fiber_ptr_t this_fiber(fibers::detail::fiber_object::current_fiber_->shared_from_this());
     fibers::detail::timer_t sleep_timer(this_fiber->io_service_);
     if(timeout>0) sleep_timer.expires_from_now(std::chrono::microseconds(timeout));
     CHECK_CALLER(this_fiber);
     if (this_fiber->caller_) {
         bool timer_triggered=false;
         bool async_op_triggered=false;
         (*(this_fiber->caller_))([&, this_fiber](){
             this_fiber->state_=fibers::detail::fiber_object::BLOCKED;
             if(timeout>0) sleep_timer.async_wait(this_fiber->fiber_strand_.wrap([&, this_fiber](std::error_code ec){
                 /*if (ec!=asio::error::operation_aborted)*/ {
                     timer_triggered=true;
                     // Timeout, cancel socket op if it's still pending
                     if(async_op_triggered) {
                         // Both callback are called, resume fiber
                         this_fiber->state_=fibers::detail::fiber_object::RUNNING;
                         this_fiber->one_step();
                     } else {
                         s.cancel();
                     }
                 }
             }));
             s.async_connect(remote_ep, (this_fiber->fiber_strand_.wrap([&, this_fiber](std::error_code ec){
                 async_op_triggered=true;
                 // Operation completed, cancel timer
                 sleep_timer.cancel();
                 if(ec==asio::error::operation_aborted)
                     ec=asio::error::timed_out;
                 this_fiber->last_error_=ec;
                 if(timeout==0 || timer_triggered) {
                     // Both callback are called, resume fiber
                     // this_fiber->schedule();
                     this_fiber->state_=fibers::detail::fiber_object::RUNNING;
                     this_fiber->one_step();
                 }
             })));
         });
     } else {
         // TODO: Error
     }
     if (this_fiber->last_error_) {
         ec=std::make_error_code(static_cast<std::errc>(this_fiber->last_error_.value()));
         this_fiber->last_error_.clear();
     }
     return ec;
 }