コード例 #1
0
static ssize_t monitor_read(struct file *filp, char *buf, 
                    size_t count, loff_t *f_pos) { 
  ssize_t rc= 0;
  m_lock(&mutex); 
  while (curr_pos <= *f_pos) {
    if (c_wait(&wait_queue, &mutex)) {
      printk("<1>read interrupted while waiting for data\n");
      rc= -EINTR;
      goto epilog;
    }
  }

  if (count > curr_size) {
    count= curr_size;
  }

  printk("<1>read %d bytes at %d (%p)\n", (int)count, (int)*f_pos, filp);

  /* Transfering data to user space */ 
  if (copy_to_user(buf, monitor_buffer, count)!=0) {
    rc= -EFAULT;
    goto epilog;
  }
  *f_pos= curr_pos - (curr_size-count);
  rc= count;

epilog:
  m_unlock(&mutex);

  return rc;
}
コード例 #2
0
ファイル: syncread-impl.c プロジェクト: joseogalde/cc4302_t3
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;
}
コード例 #3
0
ファイル: syncread-impl.c プロジェクト: joseogalde/cc4302_t3
ssize_t syncread_read(struct file *filp, char *buf,
                    size_t count, loff_t *f_pos) {
  ssize_t rc;
  m_lock(&mutex);

  while (curr_size <= *f_pos && writing) {
    /* si el lector esta en el final del archivo pero hay un proceso
     * escribiendo todavia en el archivo, el lector espera.
     */
    if (c_wait(&cond, &mutex)) {
      printk("<1>read interrupted\n");
      rc= -EINTR;
      goto epilog;
    }
  }

  if (count > curr_size-*f_pos) {
    count= curr_size-*f_pos;
  }

  printk("<1>read %d bytes at %d\n", (int)count, (int)*f_pos);

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

  *f_pos+= count;
  rc= count;

epilog:
  m_unlock(&mutex);
  return rc;
}
コード例 #4
0
ファイル: pub-impl.c プロジェクト: Javier12/tarea3sistemas
ssize_t bano_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) {
  ssize_t rc;
  int dv;
  m_lock(&mutex);


  dv = iminor(filp->f_inode);
  if (dv == 0) {
    // Dama
    while (curr_size_d <= *f_pos && damas > 0) {
      printk("What? \n");
      /* si el lector esta en el final del archivo pero hay un proceso
       * escribiendo todavia en el archivo, el lector espera.
       */
      if (c_wait(&cond, &mutex)) {
        printk("<1>read interrupted\n");
        rc= -EINTR;
        goto epilog;
      }
    }
    printk("Curresize: %d\n", (int) curr_size_d); 
    printk("Damas: %d\n", damas);

    if (count > curr_size_d-*f_pos) {
      count= curr_size_d-*f_pos;
    }

    printk("<1>read %d bytes at (damas) %d\n", (int)count, (int)*f_pos);

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

  } else {
    // Varon
    while (curr_size_v <= *f_pos && varones > 0) {
      printk("What? \n");
      /* si el lector esta en el final del archivo pero hay un proceso
       * escribiendo todavia en el archivo, el lector espera.
       */
      if (c_wait(&cond, &mutex)) {
        printk("<1>read interrupted\n");
        rc= -EINTR;
        goto epilog;
      }
    }
    printk("Curresize: %d\n", (int) curr_size_v); 
    printk("Varones: %d\n", varones);

    if (count > curr_size_v-*f_pos) {
      count= curr_size_v-*f_pos;
    }

    printk("<1>read %d bytes at (varones) %d\n", (int)count, (int)*f_pos);

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


  *f_pos+= count;
  rc= count;

epilog:
  m_unlock(&mutex);
  return rc;
}
コード例 #5
0
ファイル: pub-impl.c プロジェクト: Javier12/tarea3sistemas
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;
}