亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
555夜色666亚洲国产免| 99精品欧美一区二区三区综合在线| 国产日韩欧美精品在线| 欧美一区二区国产| 91精品国产色综合久久不卡蜜臀| 欧美色图免费看| 欧美日本不卡视频| 欧美精品三级日韩久久| 欧美一区二区三区四区五区| 欧美精品日韩一区| 精品国产一区二区三区久久影院 | 精品国一区二区三区| 91精品婷婷国产综合久久| 欧美一卡二卡在线观看| 日韩一区二区影院| 日韩欧美国产一区二区三区| 精品91自产拍在线观看一区| 久久综合精品国产一区二区三区| 中文字幕av一区二区三区免费看| 亚洲狠狠丁香婷婷综合久久久| 亚洲一线二线三线久久久| 日韩中文字幕1| 国产成人亚洲综合色影视| 97久久精品人人澡人人爽| 欧美写真视频网站| 日韩精品一区二区三区swag | 日本电影欧美片| 日韩视频在线你懂得| 国产精品二三区| 香蕉av福利精品导航| 国产精品一二三在| 在线精品视频小说1| 日韩欧美亚洲国产精品字幕久久久| 国产日韩欧美综合在线| 亚洲国产一区在线观看| 激情成人午夜视频| 欧美三级电影一区| 久久久久久亚洲综合| 亚洲大片免费看| 成人一区二区三区视频在线观看| 欧美日韩美女一区二区| 国产精品人妖ts系列视频| 天天影视色香欲综合网老头| 成人av电影免费观看| 精品日韩成人av| 亚洲高清免费观看高清完整版在线观看| 国产一区二区三区精品视频| 欧美三级在线播放| 国产精品嫩草99a| 国产在线精品一区在线观看麻豆| 欧美午夜精品一区| 亚洲视频 欧洲视频| 国产成人精品免费网站| 日韩美一区二区三区| 亚洲韩国一区二区三区| 色综合色狠狠天天综合色| 久久品道一品道久久精品| 日韩黄色免费网站| 在线精品国精品国产尤物884a| 国产精品美女久久久久aⅴ国产馆| 视频在线观看一区| 日韩久久一区二区| 久久国产成人午夜av影院| 欧美老女人在线| 亚洲专区一二三| 色综合视频在线观看| 亚洲国产精品久久艾草纯爱| 久久99国产精品免费网站| 91精品国产综合久久久蜜臀粉嫩| 亚洲激情欧美激情| 国产精品国产a| bt7086福利一区国产| 日韩精品免费视频人成| 中文字幕在线一区免费| 欧美一级生活片| 精品国产91洋老外米糕| 成人性生交大片免费看中文| 天天色综合成人网| 国产精品午夜春色av| 日韩欧美一级二级三级久久久| 99精品视频一区二区| 美女任你摸久久| 亚洲乱码国产乱码精品精小说 | 午夜精品一区二区三区免费视频| 精品1区2区在线观看| 在线播放亚洲一区| 99在线热播精品免费| 国产一区二区按摩在线观看| 日韩精品乱码免费| 亚洲一二三四在线观看| 中文字幕一区二区三区在线不卡 | 成人免费视频网站在线观看| 水野朝阳av一区二区三区| 又紧又大又爽精品一区二区| 久久综合色婷婷| 日韩精品资源二区在线| 欧美美女一区二区| 91福利在线看| 91丨porny丨蝌蚪视频| 国产成人亚洲综合a∨婷婷图片| 麻豆精品久久精品色综合| 亚洲福利视频三区| 亚洲图片有声小说| 一区二区三区不卡在线观看| 亚洲男同性恋视频| 综合分类小说区另类春色亚洲小说欧美| 精品国产一区二区三区忘忧草 | 欧美在线免费观看视频| 91麻豆文化传媒在线观看| 成人18精品视频| 91亚洲精品乱码久久久久久蜜桃| 成人精品视频一区二区三区| 国产成人在线影院| 丰满放荡岳乱妇91ww| 国产91精品精华液一区二区三区 | 26uuu亚洲| 精品国产乱码久久久久久夜甘婷婷| 91精品国产综合久久久蜜臀粉嫩 | 美女www一区二区| 欧美a一区二区| 看片网站欧美日韩| 国产美女久久久久| 成人精品免费看| 96av麻豆蜜桃一区二区| 色综合久久久久网| 精品视频在线免费看| 欧美高清视频不卡网| 精品国产91乱码一区二区三区| 精品国产亚洲一区二区三区在线观看 | 欧美日韩在线观看一区二区| 欧美肥大bbwbbw高潮| 精品久久国产字幕高潮| 久久精品视频免费| 亚洲欧美色图小说| 亚洲一区在线视频观看| 日本亚洲最大的色成网站www| 精品中文字幕一区二区| 成人av网站在线观看免费| 一本色道久久综合精品竹菊| 欧美日韩精品久久久| 亚洲丝袜另类动漫二区| 婷婷开心激情综合| 国产精品一线二线三线精华| 成人一区二区三区视频在线观看| 欧美色综合久久| 精品日韩一区二区三区免费视频| 国产精品久久久久一区二区三区共 | 中文一区二区完整视频在线观看| 亚洲三级电影网站| 日本成人在线不卡视频| 成人黄色在线视频| 在线播放91灌醉迷j高跟美女| 久久久av毛片精品| 一区二区久久久久久| 国产资源在线一区| 在线亚洲一区观看| wwww国产精品欧美| 亚洲成av人片在线观看| 成人黄色在线看| 日韩视频免费观看高清在线视频| 成人欧美一区二区三区黑人麻豆| 免费一级片91| 欧洲一区在线电影| 国产精品欧美经典| 美女网站色91| 欧美日韩视频在线一区二区 | 国产成人午夜视频| 欧美日本在线播放| 亚洲欧洲日产国产综合网| 麻豆精品新av中文字幕| 欧美三区在线观看| 亚洲女同一区二区| 国产999精品久久久久久绿帽| 69堂国产成人免费视频| 一区二区三区四区激情| 成av人片一区二区| 久久久九九九九| 久久www免费人成看片高清| 欧美日韩一区二区电影| 亚洲丝袜精品丝袜在线| 成人免费毛片a| 国产午夜精品福利| 韩国av一区二区三区| 日韩免费高清视频| 日本欧美在线观看| 91麻豆精品国产91久久久使用方法| 亚洲精品免费在线| 91在线观看视频| 国产精品乱子久久久久| 国产传媒欧美日韩成人| 久久亚洲精华国产精华液| aaa欧美日韩| 亚洲欧洲av在线| 91麻豆免费视频| 亚洲精品视频免费看| 色丁香久综合在线久综合在线观看| 中文字幕一区二区三区在线不卡 | 69堂精品视频| 日本91福利区| 欧美成人精品高清在线播放|