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

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

?? io.c

?? 基于minigui的瀏覽器. 這是最新版本.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * File: IO.c * * Copyright (C) 2000, 2001, 2002 Jorge Arellano Cid <jcid@dillo.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *//* * Dillo's signal driven IO engine */#include <pthread.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <sys/stat.h>#include <sys/uio.h>#include <sys/socket.h>#include <gdk/gdk.h>#include "../msg.h"#include "../chain.h"#include "../list.h"#include "../klist.h"#include "IO.h"#define DEBUG_LEVEL 5#include "../debug.h"/* * Symbolic defines for shutdown() function * (Not defined in the same header file, for all distros --Jcid) */#define IO_StopRd   0#define IO_StopWr   1#define IO_StopRdWr 2/* * Local data */static Klist_t *ValidIOs = NULL; /* Active IOs list. It holds pointers to                                  * IOData_t structures. *//* *  Forward declarations */void a_IO_ccc(int Op, int Branch, int Dir, ChainLink *Info,              void *Data1, void *Data2);/* * Debug procedure...static void IO_print_cond_status(gchar  *str,  GIOCondition  cond,                                 GIOChannel *gio, gint key){   MSG("%s FD=%d key=%d [", str, g_io_channel_unix_get_fd(gio), key);   MSG(cond & G_IO_IN ? "G_IO_IN " : "");   MSG(cond & G_IO_OUT ? "G_IO_OUT " : "");   MSG(cond & G_IO_PRI ? "G_IO_PRI " : "");   MSG(cond & G_IO_ERR ? "G_IO_ERR " : "");   MSG(cond & G_IO_HUP ? "G_IO_HUP " : "");   MSG(cond & G_IO_NVAL ? "G_IO_NVAL " : "");   MSG("]\n");} *//* IO API  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *//* * Return a newly created, and initialized, 'io' struct */IOData_t *a_IO_new(gint op, gint fd){   IOData_t *io = g_new0(IOData_t, 1);   io->Op = op;   io->FD = fd;   io->GioCh = g_io_channel_unix_new(fd);   io->Flags = 0;   io->Key = 0;   return io;}/* * Set the transfer buffer. * (if we allocate it, we free it) */void a_IO_set_buf(IOData_t *io, void *Buf, size_t BufSize){   if (io->Flags & IOFlag_FreeIOBuf) {      g_free(io->BufStart);      io->Flags &= ~IOFlag_FreeIOBuf;   }   if (!Buf && BufSize) {      io->BufStart = io->Buf = g_malloc(BufSize);      io->BufSize = BufSize;      io->Flags |= IOFlag_FreeIOBuf;   } else {      io->BufStart = io->Buf = Buf;      io->BufSize = BufSize;   }}/* * Add a new chunk to the transfer buffer. * (we allocate it, so we free it) */void a_IO_add_buf(IOData_t *io, void *Buf, size_t BufSize){   size_t offset;   if (BufSize == 0) {      /* This is the last chunk */      io->Flags |= IOFlag_ForceClose;      return;   }   offset = (io->Buf) ? (gchar*)io->Buf - (gchar*)io->BufStart : 0;   io->BufStart = g_realloc(io->BufStart, offset + io->BufSize + BufSize);   memcpy((gchar*)io->BufStart + offset + io->BufSize, Buf, BufSize);   io->Buf = (gchar*)io->BufStart + offset;   io->BufSize += BufSize;   io->Flags |= IOFlag_FreeIOBuf;}/* * Return transfer buffer. *void a_IO_get_buf(IOData_t *io, void **Buf, size_t *BufSize){   *Buf = io->Buf;   *BufSize = io->BufSize;} */typedef struct {   pthread_t thrID;        /* Thread id */   pthread_mutex_t mut;   pthread_cond_t cond;   gint FD;   void *Key;   void *Buf1Start;   void *Buf1;   size_t Buf1Size;   void *Buf2;   size_t Buf2Size;   gint LastChunk;   gint CloseFD;   gint Done;} thr_data_t;/* Active data for threaded chunk transfers */static thr_data_t **ThrData = NULL;static gint ThrDataSize = 0;static gint ThrDataMax = 8;/* * Create a new ThrData node */static thr_data_t *IO_thrdata_new(gint FD, void *Key){   thr_data_t *data;   data = g_new(thr_data_t, 1);   pthread_mutex_init(&data->mut, NULL);   pthread_cond_init(&data->cond, NULL);   data->FD = FD;   data->Key = Key;   data->Buf1Start = data->Buf1 = data->Buf2 = NULL;   data->Buf1Size = data->Buf2Size = 0;   data->LastChunk = 0;   data->CloseFD = 0;   data->Done = 0;   return data;}/* * Free a ThrData node */static void IO_thrdata_free(thr_data_t *td){   /* EBUSY should not happen: IO_thrdata_free is called after the    * thread is done */   while (pthread_cond_destroy(&td->cond) == EBUSY) {      g_warning("IO_thrdata_free: EBUSY\n");      if (pthread_cancel(td->thrID) == ESRCH)         break;   }   pthread_mutex_destroy(&td->mut);   g_free(td);}/* * Search data node for a FD *  - The FD is searched using a Key because using the FD itself may fail *  due to a race condition between the FD close and its reuse. *  - This function also frees already closed data. */static thr_data_t *IO_thrdata_find(void *Key){   gint i, idx = -1;   _MSG("TL(%p): [", Key);   for (i = 0; i < ThrDataSize; ++i) {      _MSG(" %d%s", ThrData[i]->FD, ThrData[i]->Done ? "D" : "");      if (ThrData[i]->Done) {         IO_thrdata_free(ThrData[i]);         a_List_remove(ThrData, i, ThrDataSize);         --i;      } else if (ThrData[i]->Key == Key) {         idx = i;         _MSG("*");      }   }   _MSG("]\n");   if (idx != -1)      return ThrData[idx];   return NULL;}/* * Write the data buffer through a FD. * [This function runs on its own thread] */static void *IO_write_chunk(void *ptr){   gint lock = 0;   thr_data_t *data = ptr;   ssize_t St;   gint st, done;   _MSG("thr::\n");   _MSG("      [thrID:%lu]\n", (gulong)data->thrID);   while (1) {      _MSG("thr:: trying to lock mutex\n");      if (!lock) {         pthread_mutex_lock(&data->mut);         lock = 1;      }      _MSG("thr:: mutex locked!\n");      _MSG("thr:: Buf1:%p Buf2:%p LastChunk:%d Done:%d\n",           data->Buf1, data->Buf2, data->LastChunk, data->Done);      if (data->Buf2) {         /* Buf1 := Buf2;  Buf2 := NULL */         g_free(data->Buf1Start);         data->Buf1Start = data->Buf1 = data->Buf2;         data->Buf1Size = data->Buf2Size;         data->Buf2 = NULL;         data->Buf2Size = 0;         _MSG("thr:: Buf1:%p Buf2:%p LastChunk:%d Done:%d\n",              data->Buf1, data->Buf2, data->LastChunk, data->Done);         pthread_mutex_unlock(&data->mut);         lock = 0;         _MSG("thr:: mutex unlocked!\n");         /*** write all ***/         done = 0;         while (!done) {            St = write(data->FD, data->Buf1, data->Buf1Size);            _MSG("thr:: St=%d\n", St);            if (St < 0) {               if (errno == EINTR) {                  continue;               } else {                  perror("IO_write_chunk");                  return NULL;               }            } else if ((size_t)St < data->Buf1Size) {               /* Not all data written */               data->Buf1 = (gchar *)data->Buf1 + St;               data->Buf1Size -= St;            } else {               /* All data in buffer written */               done = 1;            }         }      }      /* Buf1 was written, prepare the next step... */      if (!lock) {         pthread_mutex_lock(&data->mut);         lock = 1;      }      if (data->Buf2)         continue;      else if (data->LastChunk) {         /* Only pipes are closed, sockets are left for the server to close */         if (data->CloseFD) {            do               st = close(data->FD);            while (st < 0 && errno == EINTR);         }         g_free(data->Buf1Start);         data->Done = 1;         pthread_mutex_unlock(&data->mut);         _MSG("thr:: LastChunk:%d Done:%d  --Bailing out!\n",              data->LastChunk, data->Done);         return NULL;      } else {         _MSG("thr:: going to cond_wait...\n");         pthread_cond_wait(&data->cond, &data->mut);         lock = 1;      }   }/* while (1) */}/* * Write a data chunk from a pthread * (!Buf && !BufSize -> LastChunk -> close tansfer, don't close FD) * (!Buf && BufSize == 1 -> LastChunk -> close tansfer, close FD) */void a_IO_write_chunk(gint FD, void *Key, void *Buf, size_t BufSize){   thr_data_t *data;   gint new_thread = 0;   static pthread_attr_t thrATTR;   static gint thrATTRInitialized = 0;   /* set the thread attribute to the detached state */   if (!thrATTRInitialized) {      pthread_attr_init(&thrATTR);      pthread_attr_setdetachstate(&thrATTR, PTHREAD_CREATE_DETACHED);      thrATTRInitialized = 1;   }   /* Search data node for this FD */   data = IO_thrdata_find(Key);   _MSG(" a_IO_write_chunk: data=%p Buf=%p, BufSize=%d, FD=%d\n",        data, Buf, BufSize, FD);   if (!data && Buf) {      data = IO_thrdata_new(FD, Key);      a_List_add(ThrData, ThrDataSize, ThrDataMax);      ThrData[ThrDataSize] = data;      ThrDataSize++;      new_thread = 1;   }   pthread_mutex_lock(&data->mut);    if (Buf) {       data->Buf2 = g_realloc(data->Buf2, data->Buf2Size + BufSize);       memcpy((gchar*)data->Buf2 + data->Buf2Size, Buf, BufSize);       data->Buf2Size = data->Buf2Size + BufSize;    } else {       data->LastChunk = 1;       data->CloseFD = (BufSize == 1) ? 1 : 0;    }    pthread_cond_signal(&data->cond);   pthread_mutex_unlock(&data->mut);   if (new_thread)      pthread_create(&data->thrID, &thrATTR, IO_write_chunk, data);}/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *//* * Register an IO in ValidIOs */static void IO_ins(IOData_t *io){   io->Key = a_Klist_insert(&ValidIOs, (gpointer)io);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品一区四区| 欧美日韩亚洲高清一区二区| 日本aⅴ亚洲精品中文乱码| 国产精品国产精品国产专区不片| 精品福利一区二区三区| 欧美一区二区三区视频在线 | 成人av资源站| 国产91精品一区二区麻豆网站| 精品一区二区日韩| 韩国一区二区在线观看| 男女男精品视频网| 国产在线精品一区二区夜色| 国产一区二区三区在线观看免费 | 欧美国产欧美综合| 欧美极品另类videosde| 国产精品欧美一级免费| 综合久久久久久| 亚洲一二三四区不卡| 同产精品九九九| 韩国一区二区视频| eeuss鲁一区二区三区| 欧美中文字幕一区二区三区亚洲| 欧美嫩在线观看| 亚洲精品在线观看网站| 中文字幕精品一区二区三区精品| 最新国产成人在线观看| 同产精品九九九| 国产精品综合在线视频| 91蜜桃网址入口| 日韩欧美色综合| 亚洲视频免费在线| 蜜桃久久久久久| 懂色一区二区三区免费观看| 在线观看日韩av先锋影音电影院| 日韩一区二区电影在线| 中文久久乱码一区二区| 午夜精品影院在线观看| 国产精品一级二级三级| 欧洲一区二区av| 国产欧美一区二区精品性色 | 国产成人欧美日韩在线电影| 91污在线观看| 精品国产三级电影在线观看| 亚洲欧美日韩一区二区三区在线观看| 丝袜亚洲另类欧美| 91美女福利视频| 精品久久久久久久久久久久久久久 | caoporm超碰国产精品| 欧美日本国产一区| 国产精品久久久久久久久快鸭| 亚洲第一久久影院| 91免费视频网| 国产日本欧美一区二区| 蜜臀av在线播放一区二区三区 | 欧美日韩视频第一区| 亚洲国产精品ⅴa在线观看| 美女视频免费一区| 欧美日韩国产免费一区二区| 国产精品美女视频| 国产成人夜色高潮福利影视| 欧美一级在线视频| 偷拍一区二区三区| 欧美色手机在线观看| 1区2区3区精品视频| 成人午夜电影久久影院| 久久综合九色综合欧美98| 日本中文字幕一区二区视频| 91传媒视频在线播放| 亚洲欧美日韩国产一区二区三区 | 中文字幕亚洲一区二区va在线| 国产伦精品一区二区三区视频青涩| 欧美人牲a欧美精品| 亚洲一区二区在线视频| 色香蕉成人二区免费| 国产精品国产三级国产普通话三级 | 一本色道久久加勒比精品| 国产日韩v精品一区二区| 国产福利一区在线| 国产视频亚洲色图| 国产99久久久国产精品免费看| 久久久噜噜噜久噜久久综合| 国产一区欧美日韩| 国产午夜亚洲精品不卡| 国产精品资源网| 国产精品欧美久久久久无广告| av影院午夜一区| 一区二区三区在线高清| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美国产97人人爽人人喊| 国产福利一区二区三区视频| 中文av一区特黄| 91麻豆免费看| 亚洲bt欧美bt精品777| 欧美一区二区三区日韩视频| 国产一区二区三区在线看麻豆| 国产日韩欧美不卡| 色综合天天在线| 亚洲成va人在线观看| 日韩欧美国产午夜精品| 国产成人精品三级| 日韩一区在线播放| 3d成人动漫网站| 国产一区二区导航在线播放| 中文字幕亚洲不卡| 欧美日韩国产高清一区二区三区 | 欧美高清视频www夜色资源网| 日韩国产一二三区| 久久综合九色欧美综合狠狠| 国产不卡在线一区| 亚洲福利一二三区| 精品久久99ma| 在线视频欧美精品| 国产精品影视在线观看| 亚洲成av人影院| 久久久精品免费网站| 日本精品免费观看高清观看| 伦理电影国产精品| 亚洲免费伊人电影| 国产婷婷色一区二区三区四区| 色婷婷香蕉在线一区二区| 精品亚洲国产成人av制服丝袜| 中文字幕中文字幕中文字幕亚洲无线| 欧美日韩激情一区| 不卡免费追剧大全电视剧网站| 日韩精品一区第一页| 亚洲欧洲精品天堂一级| 欧美mv和日韩mv的网站| 欧美午夜不卡视频| 高清免费成人av| 精久久久久久久久久久| 亚瑟在线精品视频| 亚洲三级小视频| 久久久久久久综合色一本| 4438x成人网最大色成网站| 91在线视频网址| 风间由美性色一区二区三区| 麻豆freexxxx性91精品| 天堂成人免费av电影一区| 一区二区三区四区蜜桃| 一区视频在线播放| 日本一区免费视频| 欧美精品一区二区三区蜜桃| 91精品国产综合久久久久| 在线一区二区三区| 色综合中文字幕国产| 国产毛片精品视频| 国精产品一区一区三区mba视频 | 亚洲精品一线二线三线| 666欧美在线视频| 欧美日韩一级二级| 欧美日本在线播放| 在线播放中文一区| 欧美伦理视频网站| 欧美一级高清大全免费观看| 欧美美女喷水视频| 欧美一区二区在线看| 欧美精品在线观看一区二区| 欧美视频在线观看一区| 欧美色老头old∨ideo| 欧美日韩免费电影| 777久久久精品| 欧美一区二区三区啪啪| 精品日韩在线一区| 久久久久久久久久久久电影 | 国产亚洲短视频| 中文字幕精品—区二区四季| 国产免费久久精品| 亚洲精品少妇30p| 亚洲国产中文字幕在线视频综合| 亚洲愉拍自拍另类高清精品| 亚洲一二三四在线| 久久se精品一区精品二区| 国产福利精品导航| 99re6这里只有精品视频在线观看| 91亚洲国产成人精品一区二区三| 欧美性色aⅴ视频一区日韩精品| 欧美日韩亚洲综合一区二区三区| 91精品欧美久久久久久动漫| 精品成人a区在线观看| 国产精品色婷婷| 亚洲成在线观看| 国产久卡久卡久卡久卡视频精品| 国产ts人妖一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美日韩国产综合视频在线观看| 精品91自产拍在线观看一区| 中文字幕日韩精品一区| 日韩影院在线观看| 成人av影视在线观看| 欧美日韩夫妻久久| 日本一区二区不卡视频| 午夜精品一区二区三区免费视频 | 午夜精品久久久久久久| 久久精品国产澳门| 99久久精品免费看国产免费软件| 欧美丰满嫩嫩电影| 亚洲欧美电影院| 国产乱国产乱300精品| 欧美网站大全在线观看| 久久色成人在线|