Exemplo n.º 1
0
static ssize_t monitor_write( struct file *filp, const char *buf,
                      size_t count, loff_t *f_pos) {
  ssize_t rc;
  m_lock(&mutex);
 
  if (count>MAX_SIZE) {
    count = MAX_SIZE;
  }
  printk("<1>write %d bytes at %d (%p)\n", (int)count, curr_pos, filp);

  /* Transfering data from user space */ 
  if (copy_from_user(monitor_buffer, buf, count)!=0) {
    rc= -EFAULT;
    goto epilog;
  }
  curr_size = count;
  curr_pos += count;
  *f_pos= curr_pos;
  c_broadcast(&wait_queue);
  rc= count;

epilog:
  m_unlock(&mutex);

  return rc;
}
Exemplo n.º 2
0
ssize_t syncread_write( struct file *filp, const char *buf,
                      size_t count, loff_t *f_pos) {
  int rc;
  loff_t last;

  m_lock(&mutex);

  last= *f_pos + count;
  if (last>MAX_SIZE) {
    count -= last-MAX_SIZE;
  }
  printk("<1>write %d bytes at %d\n", (int)count, (int)*f_pos);

  /* Transfiriendo datos desde el espacio del usuario */
  if (copy_from_user(syncread_buffer+*f_pos, buf, count)!=0) {
    /* el valor de buf es una direccion invalida */
    rc= -EFAULT;
    goto epilog;
  }

  *f_pos += count;
  curr_size= *f_pos;
  rc= count;
  c_broadcast(&cond);

epilog:
  m_unlock(&mutex);
  return rc;
}
Exemplo n.º 3
0
int syncread_release(struct inode *inode, struct file *filp) {
  m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    writing= FALSE;
    c_broadcast(&cond);
    printk("<1>close for write successful\n");
  }
  else if (filp->f_mode & FMODE_READ) {
    readers--;
    if (readers==0)
      c_broadcast(&cond);
    printk("<1>close for read (readers remaining=%d)\n", readers);
  }

  m_unlock(&mutex);
  return 0;
}
Exemplo n.º 4
0
int syncread_open(struct inode *inode, struct file *filp) {
  int rc= 0;
  m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int rc;
    printk("<1>open request for write\n");
    /* Se debe esperar hasta que no hayan otros lectores o escritores */
    pend_open_write++;
    while (writing || readers>0) {
      if (c_wait(&cond, &mutex)) {
        pend_open_write--;
        c_broadcast(&cond);
        rc= -EINTR;
        goto epilog;
      }
    }
    writing= TRUE;
    pend_open_write--;
    curr_size= 0;
    c_broadcast(&cond);
    printk("<1>open for write successful\n");
  }
  else if (filp->f_mode & FMODE_READ) {
    /* Para evitar la hambruna de los escritores, si nadie esta escribiendo
     * pero hay escritores pendientes (esperan porque readers>0), los
     * nuevos lectores deben esperar hasta que todos los lectores cierren
     * el dispositivo e ingrese un nuevo escritor.
     */
    while (!writing && pend_open_write>0) {
      if (c_wait(&cond, &mutex)) {
        rc= -EINTR;
        goto epilog;
      }
    }
    readers++;
    printk("<1>open for read\n");
  }

epilog:
  m_unlock(&mutex);
  return rc;
}
Exemplo n.º 5
0
ssize_t bano_write( struct file *filp, const char *buf, size_t count, loff_t *f_pos) {
  int rc;
  int copyFromUserResult;
  int dv;

  loff_t last;

  m_lock(&mutex);
  dv = iminor(filp->f_inode);
  if (dv == 0) {
    last = damas_pos + count;
    if (last > MAX_SIZE) {
      count -= last-MAX_SIZE;
    }


    printk("<1>write %d bytes at (damas) %d\n", (int)count, (int)*f_pos);
    copyFromUserResult = copy_from_user(buffer_d+damas_pos, buf, count);
    /* Transfiriendo datos desde el espacio del usuario */
    if (copyFromUserResult!=0) {
      /* el valor de buf es una direccion invalida */
      rc= -EFAULT;
      goto epilog;
    }

    damas_pos += count;
    curr_size_d= damas_pos;
  } else {
    last = varones_pos + count;
    if (last > MAX_SIZE) {
      count -= last-MAX_SIZE;
    }
    printk("<1>write %d bytes at (varones) %d\n", (int)count, (int)*f_pos);
    copyFromUserResult = copy_from_user(buffer_v+varones_pos, buf, count);
    /* Transfiriendo datos desde el espacio del usuario */
    if (copyFromUserResult!=0) {
      /* el valor de buf es una direccion invalida */
      rc= -EFAULT;
      goto epilog;
    }

    varones_pos += count;
    curr_size_v = varones_pos;
  }

  rc= count;
  c_broadcast(&cond);

epilog:
  m_unlock(&mutex);
  return rc;
}
Exemplo n.º 6
0
int bano_release(struct inode *inode, struct file *filp) {
	 m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int dv = iminor(filp->f_inode);
    if (dv == 0) {
      // Esta saliendo una dama
      printk("<1>close for write successful dama\n");
      damas--;
    } else {
      // Esta saliendo un varon
      printk("<1>close for write successful varon\n");
      varones--;
    }
    c_broadcast(&cond);
  }
  else if (filp->f_mode & FMODE_READ) {
    printk("<1>close for read \n");
  }

  m_unlock(&mutex);
  return 0;
}
Exemplo n.º 7
0
int bano_open(struct inode *inode, struct file *filp) {
	int rc= 0;
  m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int dv = iminor(filp->f_inode);
    int rc;
    if (dv == 0) {
      // Esta entrando una dama
      printk("<1>open request for write dama\n");
      while (varones > 0) {
        printk("no cacho 1");
        if (c_wait(&cond, &mutex)) {
          c_broadcast(&cond);
          rc= -EINTR;
          if (damas == 0) {
            damas_pos = 0;
          }
          damas++;
          goto epilog;
        }
      }
      if (damas == 0) {
        damas_pos = 0;
      }
      damas++;
      curr_size_d = 0;
      printk("no cacho 2");
      c_broadcast(&cond);
      printk("<1>open for write successful damas: %d \n", damas);
    } else {
      // Esta entrando un varon
      printk("<1>open request for write varon\n");
      while (damas > 0) {
        if (c_wait(&cond, &mutex)) {
          c_broadcast(&cond);
          rc= -EINTR;
          if (varones == 0) {
            varones_pos = 0;
          }
          varones++;
          goto epilog;
        }
      }
      if (varones == 0) {
        varones_pos = 0;
      }
      varones++;
      curr_size_v= 0;
      c_broadcast(&cond);
      printk("<1>open for write successful varones: %d\n", varones);
    }

  }
  else if (filp->f_mode & FMODE_READ) {
    printk("<1>open for read\n");
  }

epilog:
  m_unlock(&mutex);
  return rc;
}