⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gateway.c

📁 chord 源码 http://pdos.csail.mit.edu/chord/
💻 C
字号:
/* * * Copyright (C) 2001  Frank Dabek (fdabek@lcs.mit.edu),  *                     Frans Kaashoek (kaashoek@lcs.mit.edu), *   		       Massachusetts Institute of Technology *  * *  Permission is hereby granted, free of charge, to any person obtaining *  a copy of this software and associated documentation files (the *  "Software"), to deal in the Software without restriction, including *  without limitation the rights to use, copy, modify, merge, publish, *  distribute, sublicense, and/or sell copies of the Software, and to *  permit persons to whom the Software is furnished to do so, subject to *  the following conditions: * *  The above copyright notice and this permission notice shall be *  included in all copies or substantial portions of the Software. * *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */#include <chord.h>#include <chord_types.h>#include <dhashgateway_prot.h>#include <location.h>#include "dhash_common.h"#include "dhash.h"#include "dhashcli.h"#include "dhashgateway.h"#include "arpc.h"#ifdef DMALLOC#include "dmalloc.h"#endif// ------------------------------------------------------------------------// DHASHGATEWAYdhashgateway::dhashgateway (ptr<axprt_stream> x, 			    ptr<chord> node,			    ref<dhash> dh){  clntsrv = asrv::alloc (x, dhashgateway_program_1,	                 wrap (mkref (this), &dhashgateway::dispatch));  dhcli = New refcounted<dhashcli> (node->get_vnode (0), dh);}dhashgateway::~dhashgateway (){}voiddhashgateway::dispatch (svccb *sbp){  if (!sbp) {    // setting clntsrv to 0 removes the last reference to this gateway    // object, stored in the asrv object's callback.    clntsrv = 0;    return;  }  switch (sbp->proc ()) {  case DHASHPROC_NULL:    sbp->reply (NULL);    return;  case DHASHPROC_INSERT:    {      dhash_insert_arg *arg = sbp->Xtmpl getarg<dhash_insert_arg> ();      ref<dhash_block> block =	New refcounted<dhash_block> (arg->block.base (), arg->len, arg->ctype);      block->ID = arg->blockID;      ptr<chordID> guess = NULL;      if (arg->options & DHASHCLIENT_GUESS_SUPPLIED)	guess = New refcounted<chordID> (arg->guess);      dhcli->insert (block,	             wrap (mkref (this), &dhashgateway::insert_cb, sbp),		     arg->options, guess);    }    break;      case DHASHPROC_RETRIEVE:    {      dhash_retrieve_arg *arg = sbp->Xtmpl getarg<dhash_retrieve_arg> ();              ptr<chordID> guess = NULL;      if (arg->options & DHASHCLIENT_GUESS_SUPPLIED)	guess = New refcounted<chordID> (arg->guess);      dhcli->retrieve	(blockID (arg->blockID, arg->ctype),	 wrap (mkref (this), &dhashgateway::retrieve_cb, sbp),	 arg->options, guess);    }    break;        //XXX DHASHPROC_ACTIVE messes up the back-call scheme. Disabled. --FED  default:    sbp->reject (PROC_UNAVAIL);    break;  }}voiddhashgateway::insert_cb (svccb *sbp, dhash_stat status, vec<chordID> path){  dhash_insert_res res (status);  //warn << "dhashgateway::insert_cb dhash_stat = " << status << "\n";  if (status == DHASH_OK) {    //warn << "dhashgateway::insert_cb Insert succeeded\n";    res.resok->path.setsize (path.size ());    for (unsigned int i = 0; i < path.size (); i++)      res.resok->path[i] = path[i];  }  sbp->reply (&res);}voiddhashgateway::retrieve_cb (svccb *sbp, dhash_stat stat,                           ptr<dhash_block> block, route path){  dhash_retrieve_res res (DHASH_OK);  if (!block)    res.set_status (stat);  else {    res.resok->block.setsize (block->data.len ());    res.resok->ctype = block->ctype;    res.resok->len = block->data.len ();    res.resok->hops = block->hops;    res.resok->errors = block->errors;    res.resok->retries = block->retries;    res.resok->path.setsize (path.size ());    for (u_int i = 0; i < path.size (); i++)      res.resok->path[i] = path[i]->id ();    res.resok->times.setsize (block->times.size ());    for (u_int i = 0; i < block->times.size (); i++)      res.resok->times[i] = block->times[i];    memcpy (res.resok->block.base (), block->data.cstr (), block->data.len ());  }  sbp->reply (&res);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -