亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? select.c

?? 嵌入式操作系統ECOS的網絡開發包
?? C
字號:
//==========================================================================
//
//      lib/select.c
//
//      'select()' system call
//
//==========================================================================
//####BSDCOPYRIGHTBEGIN####
//
// -------------------------------------------
//
// Portions of this software may have been derived from OpenBSD or other sources,
// and are covered by the appropriate copyright disclaimers included herein.
//
// -------------------------------------------
//
//####BSDCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s):    gthomas
// Contributors: gthomas
// Date:         2000-01-10
// Purpose:      
// Description:  eCos implementation of 'select()' system call
//              
//
//####DESCRIPTIONEND####
//
//==========================================================================

#include <sys/param.h>
#include <cyg/io/file.h>
#include <cyg/kernel/kapi.h>
#include <sys/select.h>
#include <sys/bsdselect.h>

static cyg_flag_t select_flag;
static cyg_bool   select_flag_init = false;
#define SELECT_WAKE  0x01
#define SELECT_ABORT 0x02

//
// Private function which does all the work for 'select()'
//
static int
_cyg_select(int nfd, fd_set *in, fd_set *out, fd_set *ex,
            struct timeval *tv, cyg_bool_t abortable)
{
    int fd, mode, num, ticks;
    struct file *fp;
    fd_set in_res, out_res, ex_res;  // Result sets
    fd_set *selection[3], *result[3];
    cyg_tick_count_t now, then;
    int mode_type[] = {FREAD, FWRITE, 0};
    cyg_flag_value_t flag, wait_flag;

    // Note: since this is called by application programs, it needs no protection
    if (!select_flag_init) {
        select_flag_init = true;
        cyg_flag_init(&select_flag);
    }
    wait_flag = SELECT_WAKE;
    if (abortable) wait_flag |= SELECT_ABORT;
    FD_ZERO(&in_res);
    FD_ZERO(&out_res);
    FD_ZERO(&ex_res);
    // Set up sets
    selection[0] = in;   result[0] = &in_res;
    selection[1] = out;  result[1] = &out_res;
    selection[2] = ex;   result[2] = &ex_res;
    // Compute end time
    if (tv) {
        now = cyg_current_time();
        ticks = (tv->tv_sec * 100) + (tv->tv_usec / 10000);
        then = now + ticks;
    } else {
        then = 0;  // Compiler warnings :-(
        ticks = 0;
    }
    // Scan sets for possible I/O until something found, timeout or error.
    while (true) {
        num = 0;  // Total file descriptors "ready"

        cyg_scheduler_lock(); // Scan the list atomically wrt electing to sleep

        for (mode = 0;  mode < 3;  mode++) {
            if (selection[mode]) {
                for (fd = 0;  fd < nfd;  fd++) {
                    if (FD_ISSET(fd, selection[mode])) {
                        if (getfp(fd, &fp)) {
                            cyg_scheduler_unlock(); // return.
                            errno = EBADF;
                            return -1;
                        }
                        if ((*fp->f_ops->fo_select)(fp, mode_type[mode])) {
                            FD_SET(fd, result[mode]);
                            num++;
                        }
                    }
                }
            }
        }
        if (num) {

            cyg_scheduler_unlock(); // Happy, about to return.

            // Found something, update user's sets
            if (in) {
                memcpy(in, &in_res, sizeof(in_res));
            }
            if (out) {
                memcpy(out, &out_res, sizeof(out_res));
            }
            if (ex) {
                memcpy(ex, &ex_res, sizeof(ex_res));
            }
            return num;
        }
        // Nothing found, see if we want to wait
        if (tv) {
            if (ticks == 0) {
                // Special case of "poll"
                cyg_scheduler_unlock(); // About to return.
                return 0;
            }
            flag = cyg_flag_timed_wait(&select_flag, wait_flag,
                                       CYG_FLAG_WAITMODE_OR,
                                       then);
        } else {
            // Wait forever (until something happens)
            flag = cyg_flag_wait(&select_flag, wait_flag,
                                 CYG_FLAG_WAITMODE_OR);
        }

        cyg_scheduler_unlock(); // waited atomically

        if (flag & SELECT_ABORT) {
            errno = EINTR;
            return -1;
        }
        if (!flag) {
            return 0; // meaning no activity, ergo timeout occurred
        }
    }
    errno = ENOSYS;
    return -1;
}

//
// This function is called by the lower layers to record the
// fact that a particular 'select' event is being requested.
//
void        
selrecord(void *selector, struct selinfo *info)
{
    // Unused by this implementation
}

//
// This function is called to indicate that a 'select' event
// may have occurred.
//
void    
selwakeup(struct selinfo *info)
{
    // Need these ops to be atomic to make sure the clear occurs -
    // otherwise a higher prio thread could hog the CPU when its fds are
    // not ready, but the flag is (already) set, or set for someone else.
    cyg_scheduler_lock();
    cyg_flag_setbits(&select_flag, SELECT_WAKE);
    cyg_flag_maskbits(&select_flag,    0      ); // clear all
    cyg_scheduler_unlock();
}

//
// The public function used by 'normal' programs.  This interface does not allow
// the 'select()' to be externally interrupted.
//
int
select(int nfd, fd_set *in, fd_set *out, fd_set *ex,
       struct timeval *tv)
{
    return _cyg_select(nfd, in, out, ex, tv, false);
}

//
// The public function used by programs which wish to allow interruption,
// using the 'cyg_select_abort()' function below.
//
int
cyg_select_with_abort(int nfd, fd_set *in, fd_set *out, fd_set *ex,
                      struct timeval *tv)
{
    return _cyg_select(nfd, in, out, ex, tv, true);
}

//
// This function can be called by the user to forceably abort any
// current selects.
//
void
cyg_select_abort(void)
{
    // See comments in selwakeup()...
    cyg_scheduler_lock();
    cyg_flag_setbits(&select_flag, SELECT_ABORT); 
    cyg_flag_maskbits(&select_flag,    0       );
    cyg_scheduler_unlock();
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
xvideos.蜜桃一区二区| 久久国产精品99精品国产| 精品久久久久久最新网址| 在线观看亚洲精品| 色综合色狠狠天天综合色| 国产传媒久久文化传媒| 另类小说视频一区二区| 日本成人在线一区| 蜜桃视频在线一区| 久久精品国产77777蜜臀| 美女在线观看视频一区二区| 亚洲二区在线视频| 日韩成人一级片| 久久se精品一区精品二区| 久久99精品久久久久久动态图 | 自拍偷自拍亚洲精品播放| 亚洲欧洲精品成人久久奇米网| 国产欧美精品一区二区三区四区 | 久久综合久久久久88| 2017欧美狠狠色| 国产精品免费网站在线观看| 国产精品国产自产拍高清av王其| 国产视频911| 国产精品久久久久久久久快鸭| 亚洲日本丝袜连裤袜办公室| 一区二区三区鲁丝不卡| 日韩av在线播放中文字幕| 激情综合色播激情啊| 成人a免费在线看| 欧美美女直播网站| 欧美国产日韩亚洲一区| 亚洲自拍与偷拍| 国产伦精品一区二区三区免费 | 欧美成人性战久久| 国产精品久久久久久久久果冻传媒 | 国产精品短视频| 亚洲va欧美va人人爽| 国产一区在线观看视频| 在线欧美日韩精品| 国产亲近乱来精品视频| 亚洲午夜视频在线| 国产电影一区在线| 欧美人妇做爰xxxⅹ性高电影| 精品国产精品一区二区夜夜嗨| 最新高清无码专区| 久久精品国产在热久久| 91在线观看高清| 精品88久久久久88久久久 | 欧美三级韩国三级日本一级| 久久综合狠狠综合久久激情 | 一区二区三区四区在线播放| 精品影院一区二区久久久| 91欧美激情一区二区三区成人| 777久久久精品| 一区二区三区四区激情| 国产成人超碰人人澡人人澡| 欧美美女黄视频| 亚洲一区二区三区四区在线 | 欧美成人一区二区三区片免费| 亚洲综合色在线| 成人ar影院免费观看视频| 2014亚洲片线观看视频免费| 亚洲图片欧美综合| 欧美色综合影院| 亚洲黄一区二区三区| 91在线国内视频| 中文av一区特黄| 99久久精品国产导航| 国产欧美精品区一区二区三区| 九色综合国产一区二区三区| 91精品免费观看| 三级一区在线视频先锋| 欧美美女一区二区| 日韩中文字幕区一区有砖一区 | 天天色综合成人网| 91传媒视频在线播放| 亚洲日本护士毛茸茸| 成+人+亚洲+综合天堂| 国产精品丝袜黑色高跟| 国产精品亚洲成人| 久久精品欧美日韩| 成人综合日日夜夜| 亚洲国产精品成人综合色在线婷婷| 精品一区二区三区在线播放| 欧美一级黄色大片| 激情都市一区二区| 久久久久久夜精品精品免费| 国产精品18久久久久久久久久久久| 欧美成人精品高清在线播放| 另类欧美日韩国产在线| 久久久综合视频| 成人一区在线观看| 一区二区三区色| 色哦色哦哦色天天综合| 亚洲福利视频一区| 欧美不卡123| 国产精品乡下勾搭老头1| 国产精品久久久久精k8| 在线视频国产一区| 琪琪久久久久日韩精品| 欧美精品一区二区三区在线播放 | 亚洲欧美在线aaa| 欧美在线观看你懂的| 日本在线观看不卡视频| 久久久午夜精品| 欧美专区亚洲专区| 激情久久五月天| 亚洲免费av高清| 欧美tk—视频vk| 一本色道**综合亚洲精品蜜桃冫 | 精品入口麻豆88视频| 不卡在线视频中文字幕| 亚洲综合激情网| 久久久久国产精品麻豆| 在线观看91精品国产入口| 久久精品噜噜噜成人av农村| 中文久久乱码一区二区| 日韩欧美一级精品久久| 波多野结衣精品在线| 蜜臀精品久久久久久蜜臀| 亚洲欧美激情视频在线观看一区二区三区| 欧美午夜不卡在线观看免费| 国产99久久久精品| 日本亚洲免费观看| 曰韩精品一区二区| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲一二三区不卡| 国产欧美中文在线| 欧美一级在线视频| 在线日韩国产精品| 波波电影院一区二区三区| 久久精品国产999大香线蕉| 亚洲色欲色欲www| 国产日韩精品久久久| 日韩视频免费观看高清完整版在线观看 | 一区二区三国产精华液| 国产亚洲自拍一区| 久久久噜噜噜久久人人看| 欧美日韩综合在线| 色综合天天综合狠狠| 国产乱对白刺激视频不卡| 五月婷婷色综合| 玉足女爽爽91| 一二三区精品福利视频| 国产精品二三区| 国产精品久久久久久久蜜臀| 久久亚洲春色中文字幕久久久| 欧美疯狂做受xxxx富婆| 欧美日韩一区二区在线观看 | 美女mm1313爽爽久久久蜜臀| 亚洲一区二区av在线| 亚洲欧美日韩国产手机在线| 国产免费久久精品| 国产精品乱子久久久久| 久久综合精品国产一区二区三区| 日韩精品一区二区三区视频播放 | 国产美女av一区二区三区| 九九久久精品视频| 麻豆91在线看| 精品一区二区免费在线观看| 午夜电影网一区| 视频一区免费在线观看| 日韩中文字幕亚洲一区二区va在线| 婷婷六月综合亚洲| 麻豆国产欧美一区二区三区| 蜜臀精品一区二区三区在线观看| 麻豆传媒一区二区三区| 经典一区二区三区| 国产精品亚洲综合一区在线观看| 国产麻豆日韩欧美久久| 国产精品一级片在线观看| 91污在线观看| 欧美美女bb生活片| 26uuu亚洲婷婷狠狠天堂| 国产亚洲视频系列| 亚洲欧美区自拍先锋| 亚洲成a人v欧美综合天堂 | 日本一区二区三区dvd视频在线| 日本一区二区三区在线观看| 亚洲欧美国产高清| 日产国产欧美视频一区精品| 国产成人在线观看| 在线观看视频一区| 精品盗摄一区二区三区| 中文字幕一区二区三区在线观看| 一区二区三区四区亚洲| 麻豆成人免费电影| 色综合中文字幕国产| 欧美一区二区三区四区五区 | 美腿丝袜亚洲综合| 99这里只有精品| 欧美精品三级在线观看| 国产欧美日韩一区二区三区在线观看| 中文字幕中文在线不卡住| 亚洲自拍偷拍欧美| 国产91清纯白嫩初高中在线观看| 欧美亚洲国产一区二区三区va| 久久婷婷成人综合色| 亚洲图片欧美一区| 成人精品视频.|