]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/devque.cpp
No se crea más la cola porque la crea el mismo DevQue.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / devque.cpp
index fd5439865d63169e39af185b972bd4683bb3ad01..07913548f9eff59f063c73b9f677def3a5791d42 100644 (file)
@@ -20,7 +20,7 @@ DevQue::DevQue(mac_type mac, key_t key, size_t mtu)
     throw (std::runtime_error, std::logic_error):
         Dev(mac, mtu)
 {
     throw (std::runtime_error, std::logic_error):
         Dev(mac, mtu)
 {
-    que_id = msgget(key, 0666); // Debe estar previamente creada
+    que_id = msgget(key, IPC_CREAT | 0666);
     if (que_id == -1)
         throw std::runtime_error("No se pudo crear la cola");
 }
     if (que_id == -1)
         throw std::runtime_error("No se pudo crear la cola");
 }
@@ -51,7 +51,7 @@ std::string DevQue::receive() throw (std::runtime_error)
     return receive(mac);
 }
 
     return receive(mac);
 }
 
-std::string DevQue::receive(const mac_type& mac) throw (std::runtime_error)
+std::string DevQue::receive(mac_type& mac) throw (std::runtime_error)
 {
     Frame* f = (Frame*) malloc(sizeof(Frame) + mtu);
     if (!f)
 {
     Frame* f = (Frame*) malloc(sizeof(Frame) + mtu);
     if (!f)
@@ -63,6 +63,8 @@ std::string DevQue::receive(const mac_type& mac) throw (std::runtime_error)
         throw std::runtime_error("Error al sacar de la cola");
     }
     std::string s((char*) f->frame, f->size);
         throw std::runtime_error("Error al sacar de la cola");
     }
     std::string s((char*) f->frame, f->size);
+    if (mac == 0)
+        mac = f->mac;
     free(f);
 #ifdef DEBUG2
     std::cout << "DevQue::receive(msgtype/mac = " << mac << ", size = "
     free(f);
 #ifdef DEBUG2
     std::cout << "DevQue::receive(msgtype/mac = " << mac << ", size = "
@@ -71,4 +73,18 @@ std::string DevQue::receive(const mac_type& mac) throw (std::runtime_error)
     return s;
 }
 
     return s;
 }
 
+/// Indica cuantos elementos hay en la cola
+size_t DevQue::size() const
+{
+    struct msqid_ds minfo;
+    msgctl(que_id, IPC_STAT, &minfo);
+    return minfo.msg_qnum;
+}
+
+/// Indica si está vacía la cola
+bool DevQue::empty() const
+{
+    return size() == 0;
+}
+
 // vim: set et sw=4 sts=4 :
 // vim: set et sw=4 sts=4 :