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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? select.c

?? eCos/RedBoot for勤研ARM AnywhereII(4510) 含全部源代碼
?? 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();
}


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久夜色精品一区| 欧美变态tickle挠乳网站| 日韩伦理电影网| www.亚洲色图.com| 玉足女爽爽91| 欧美在线播放高清精品| 亚洲午夜精品17c| 欧美一区二区三区视频免费播放| 日本不卡视频在线观看| 欧美精品一区二区三| 成人小视频免费观看| 亚洲狼人国产精品| 7878成人国产在线观看| 久久99精品久久久| 国产精品不卡在线| 欧美一级片在线看| 波多野结衣欧美| 亚洲成av人片在线观看| 精品女同一区二区| 91美女片黄在线观看91美女| 日韩av电影天堂| 欧美高清在线视频| 欧美高清视频在线高清观看mv色露露十八 | 欧美手机在线视频| 久久精品国产在热久久| 国产欧美一区二区三区沐欲| 色综合久久综合网欧美综合网 | 蜜臀av一区二区在线免费观看 | 久久麻豆一区二区| 91免费版在线| 国产一区二区三区四区五区入口| 国产精品三级av在线播放| 91网站最新地址| 国模套图日韩精品一区二区| 日韩一区在线看| 久久综合精品国产一区二区三区| 99久久精品免费看| 精品综合久久久久久8888| 亚洲精品乱码久久久久久| 精品久久一区二区| 在线精品观看国产| 国产91精品免费| 日日欢夜夜爽一区| 亚洲黄色尤物视频| 国产精品女人毛片| 精品国产伦一区二区三区观看体验| 成人av免费在线| 国产精品影视在线观看| 日韩成人伦理电影在线观看| 成人免费在线视频观看| 久久一区二区三区四区| 欧美一二三区在线| 欧美优质美女网站| 99精品在线免费| 国产精品香蕉一区二区三区| 人人爽香蕉精品| 丝袜美腿亚洲一区| 亚洲午夜视频在线观看| 国产精品乱码久久久久久| 日韩免费一区二区三区在线播放| 欧美影视一区在线| 在线观看av一区| 在线观看av不卡| 91九色最新地址| 欧美在线制服丝袜| 欧美少妇性性性| 日本高清无吗v一区| 91社区在线播放| heyzo一本久久综合| 精品欧美乱码久久久久久| 3d成人h动漫网站入口| 欧美色老头old∨ideo| 色婷婷久久久久swag精品| 91一区一区三区| 在线影视一区二区三区| 91黄色在线观看| 欧美亚洲一区二区三区四区| 欧美性色综合网| 欧美二区三区91| 一区二区三区 在线观看视频| 亚洲天堂久久久久久久| 一区二区三区国产精华| 亚洲精品成人a在线观看| 亚洲国产精品久久不卡毛片 | 中文字幕二三区不卡| 国产午夜精品久久| 国产精品人成在线观看免费| 国产精品久久久99| 亚洲日本成人在线观看| 亚洲一区二区三区四区在线观看| 亚洲午夜一区二区| 美日韩黄色大片| 国产乱子伦视频一区二区三区| 国产在线麻豆精品观看| 成人影视亚洲图片在线| 97精品久久久久中文字幕| 色播五月激情综合网| 欧美欧美欧美欧美首页| 精品99一区二区| 国产精品久久久久三级| 洋洋成人永久网站入口| 青青草成人在线观看| 国产一区二区三区久久久 | 午夜精品福利一区二区蜜股av| 日韩电影免费一区| 国产99久久久精品| 91国模大尺度私拍在线视频| 在线不卡免费av| 国产视频一区二区在线| 亚洲码国产岛国毛片在线| 首页综合国产亚洲丝袜| 国产精品伊人色| 欧美专区在线观看一区| 日韩欧美久久久| 亚洲激情自拍偷拍| 国产一区二区免费在线| 在线亚洲+欧美+日本专区| 日韩一区二区免费在线电影| 国产精品日韩成人| 青娱乐精品在线视频| 99久久免费国产| 精品国产髙清在线看国产毛片| 国产精品成人免费精品自在线观看 | 欧美日韩免费一区二区三区| 精品少妇一区二区三区日产乱码 | 日韩一区二区精品| 亚洲欧洲www| 精品一区二区精品| 欧美特级限制片免费在线观看| 精品1区2区在线观看| 亚洲午夜视频在线| 成人免费视频一区| 日韩美女视频在线| 亚洲一区在线看| 粉嫩蜜臀av国产精品网站| 欧美一区二区三区免费| 亚洲人成网站在线| 成人app网站| 欧美精品一区二区久久久| 日日骚欧美日韩| 欧美系列在线观看| 中文字幕一区二区三区av| 狠狠网亚洲精品| 欧美一区二区三区日韩| 亚洲与欧洲av电影| www.av亚洲| 国产女主播视频一区二区| 美女脱光内衣内裤视频久久影院| 91麻豆精品在线观看| 国产精品免费观看视频| 国产成人日日夜夜| 欧美成人a视频| 日韩在线一区二区三区| 欧美日韩一区不卡| 一区二区三区欧美在线观看| 成人激情文学综合网| 国产农村妇女毛片精品久久麻豆| 国产一区日韩二区欧美三区| 日韩西西人体444www| 丝袜亚洲另类丝袜在线| 欧美性受极品xxxx喷水| 一区二区在线电影| 91久久精品一区二区二区| 亚洲免费观看高清完整版在线观看| 国产盗摄精品一区二区三区在线| 精品少妇一区二区三区日产乱码| 另类人妖一区二区av| 精品国产网站在线观看| 国产一区二区网址| 亚洲国产高清aⅴ视频| 成人亚洲精品久久久久软件| 国产精品美女视频| 97久久超碰精品国产| 一区二区在线免费观看| 欧美色图在线观看| 无码av免费一区二区三区试看 | 欧美中文字幕一区二区三区| 亚洲国产精品一区二区尤物区| 欧美在线free| 男女视频一区二区| 久久色在线观看| av电影在线观看不卡| 一区二区三区在线视频播放| 在线看日本不卡| 日本伊人色综合网| 欧美成人一区二区三区| 国产·精品毛片| 中文字幕亚洲欧美在线不卡| 一本色道**综合亚洲精品蜜桃冫| 一区二区在线观看视频| 欧美一二三区在线| 国产成人在线电影| 亚洲女女做受ⅹxx高潮| 欧美日韩国产bt| 久久成人免费电影| 成人免费一区二区三区在线观看| 色狠狠桃花综合| 久久精品国产亚洲5555| 国产精品动漫网站| 在线综合视频播放|