OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [tools/] [src/] [librlink/] [RlinkPortFifo.cpp] - Blame information for rev 10

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 wfjm
// $Id: RlinkPortFifo.cpp 375 2011-04-02 07:56:47Z mueller $
2
//
3
// Copyright 2011- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
//
5
// This program is free software; you may redistribute and/or modify it under
6
// the terms of the GNU General Public License as published by the Free
7
// Software Foundation, either version 2, or at your option any later version.
8
//
9
// This program is distributed in the hope that it will be useful, but
10
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
// for complete details.
13
// 
14
// Revision History: 
15
// Date         Rev Version  Comment
16
// 2011-03-27   374   1.0    Initial version
17
// 2011-01-15   356   0.1    First draft
18
// ---------------------------------------------------------------------------
19
 
20
/*!
21
  \file
22
  \version $Id: RlinkPortFifo.cpp 375 2011-04-02 07:56:47Z mueller $
23
  \brief   Implemenation of RlinkPortFifo.
24
*/
25
 
26
#include <sys/types.h>
27
#include <sys/stat.h>
28
#include <fcntl.h>
29
#include <errno.h>
30
 
31
#include "RlinkPortFifo.hpp"
32
 
33
using namespace std;
34
using namespace Retro;
35
 
36
/*!
37
  \class Retro::RlinkPortFifo
38
  \brief FIXME_text
39
*/
40
 
41
//------------------------------------------+-----------------------------------
42
//! Default constructor
43
 
44
RlinkPortFifo::RlinkPortFifo()
45
  : RlinkPort()
46
{}
47
 
48
//------------------------------------------+-----------------------------------
49
//! Destructor
50
 
51
RlinkPortFifo::~RlinkPortFifo()
52
{}
53
 
54
//------------------------------------------+-----------------------------------
55
//! FIXME_text
56
 
57
bool RlinkPortFifo::Open(const std::string& url, RerrMsg& emsg)
58
{
59
  if (IsOpen()) Close();
60
 
61
  if (!ParseUrl(url, "|keep|", emsg)) return false;
62
 
63
  // Note: _rx fifo must be opened before the _tx fifo, otherwise the test
64
  //       bench might close with EOF on read prematurely (is a race condition).
65
 
66
  fFdWrite = OpenFifo(UrlPath() + "_rx", true, emsg);
67
  if (fFdWrite < 0) return false;
68
 
69
  fFdRead = OpenFifo(UrlPath() + "_tx", false, emsg);
70
  if (fFdRead < 0) {
71
    close(fFdWrite);
72
    fFdWrite = -1;
73
    return false;
74
  }
75
 
76
  fIsOpen  = true;
77
 
78
  return true;
79
}
80
 
81
//------------------------------------------+-----------------------------------
82
//! FIXME_text
83
 
84
int RlinkPortFifo::OpenFifo(const std::string& name, bool snd, RerrMsg& emsg)
85
{
86
  struct stat stat_fifo;
87
 
88
  int irc;
89
 
90
  irc = stat(name.c_str(), &stat_fifo);
91
  if (irc == 0) {
92
    if ((stat_fifo.st_mode & S_IFIFO) == 0) {
93
      emsg.Init("RlinkPortFifo::OpenFiFo()",
94
                string("\"") + name + string("\" exists but is not a pipe"));
95
      return -1;
96
    }
97
  } else {
98
    mode_t mode = S_IRUSR | S_IWUSR;        // user read and write allowed
99
    irc = mkfifo(name.c_str(), mode);
100
    if (irc != 0) {
101
      emsg.InitErrno("RlinkPortFifo::OpenFifo()",
102
                     string("mkfifo() for \"") + name + string("\" failed: "),
103
                     errno);
104
      return -1;
105
    }
106
  }
107
 
108
  irc = open(name.c_str(), snd ? O_WRONLY : O_RDONLY);
109
  if (irc < 0) {
110
    emsg.InitErrno("RlinkPortFifo::OpenFifo()",
111
                   string("open() for \"") + name + string("\" failed: "),
112
                   errno);
113
    return -1;
114
  }
115
 
116
  return irc;
117
}
118
 
119
//------------------------------------------+-----------------------------------
120
#if (defined(Retro_NoInline) || defined(Retro_RlinkPortFifo_NoInline))
121
#define inline
122
//#include "RlinkPortFifo.ipp"
123
#undef  inline
124
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.