Diff for /mqtt/src/daemon.c between versions 1.2.2.23 and 1.2.2.25

version 1.2.2.23, 2012/05/05 12:15:25 version 1.2.2.25, 2012/05/05 14:51:02
Line 5 Line 5
 #include "mqttd_calls.h"  #include "mqttd_calls.h"
   
   
 static void *startSession(sched_task_t *task);  
 static pthread_attr_t attr;  
   
   
 static inline struct tagSession *  static inline struct tagSession *
 initSession(int sock, ait_val_t * __restrict v)  initSession(int sock, ait_val_t * __restrict v)
 {  {
Line 27  initSession(int sock, ait_val_t * __restrict v) Line 23  initSession(int sock, ait_val_t * __restrict v)
         } else          } else
                 memset(sess, 0, sizeof(struct tagSession));                  memset(sess, 0, sizeof(struct tagSession));
   
         pthread_mutex_init(&sess->sess_mtx, NULL);  
   
         SLIST_INIT(&sess->sess_subscr);          SLIST_INIT(&sess->sess_subscr);
   
         str = cfg_getAttribute(&cfg, "mqttd", "retry");          str = cfg_getAttribute(&cfg, "mqttd", "retry");
Line 79  finiSession(struct tagSession *sess) Line 73  finiSession(struct tagSession *sess)
         if (call.FiniSessPUB)          if (call.FiniSessPUB)
                 call.FiniSessPUB(&cfg, pub, sess->sess_cid, sess->sess_user, "%");                  call.FiniSessPUB(&cfg, pub, sess->sess_cid, sess->sess_user, "%");
   
         SESS_ELEM_LOCK(sess);  
         while ((store = SLIST_FIRST(&sess->sess_subscr))) {          while ((store = SLIST_FIRST(&sess->sess_subscr))) {
                 SLIST_REMOVE_HEAD(&sess->sess_subscr, st_node);                  SLIST_REMOVE_HEAD(&sess->sess_subscr, st_node);
   
Line 90  finiSession(struct tagSession *sess) Line 83  finiSession(struct tagSession *sess)
   
                 free(store);                  free(store);
         }          }
         SESS_ELEM_UNLOCK(sess);  
         pthread_mutex_destroy(&sess->sess_mtx);  
   
         if (sess->sess_will.msg)          if (sess->sess_will.msg)
                 free(sess->sess_will.msg);                  free(sess->sess_will.msg);
Line 120  leaveClient(sched_task_t *task) Line 111  leaveClient(sched_task_t *task)
         sess = TASK_ARG(task);          sess = TASK_ARG(task);
         assert(sess);          assert(sess);
   
         SESS_LOCK;  
         TAILQ_REMOVE(&Sessions, sess, sess_node);          TAILQ_REMOVE(&Sessions, sess, sess_node);
         SESS_UNLOCK;  
   
         ret = mqtt_msgDISCONNECT(sess->sess_buf);          ret = mqtt_msgDISCONNECT(sess->sess_buf);
         send(TASK_FD(task), sess->sess_buf->msg_base, ret, MSG_NOSIGNAL);          send(TASK_FD(task), sess->sess_buf->msg_base, ret, MSG_NOSIGNAL);
Line 138  leaveClient(sched_task_t *task) Line 127  leaveClient(sched_task_t *task)
 static void *  static void *
 dispatchSession(sched_task_t *task)  dispatchSession(sched_task_t *task)
 {  {
        int ret;        int ret, len = 0;
        struct mqtthdr *hdr; 
         struct tagSession *sess;          struct tagSession *sess;
   
         ioTRACE(2);          ioTRACE(2);
Line 158  dispatchSession(sched_task_t *task) Line 146  dispatchSession(sched_task_t *task)
                 ioDEBUG(4, "Session %s EOF received.", sess->sess_cid);                  ioDEBUG(4, "Session %s EOF received.", sess->sess_cid);
                 finiSession(sess);                  finiSession(sess);
                 return NULL;                  return NULL;
        } else        }
                hdr = (struct mqtthdr*) sess->sess_buf->msg_base; 
   
        /* dispatch message type */        do {
        if (mqtt_srv_Dispatch(sess->sess_srv, sess))                /* dispatch message type */
                ioLIBERR(mqtt);                if ((len = mqtt_srv_Dispatch(sess->sess_srv, ret, sess)) < 0) {
//                      schedEvent(root, startSession, NULL, (u_long) TASK_FD(task), sess, ret);                        if (len == -1)
                                 ioLIBERR(mqtt);
                         finiSession(sess);
                 } else
                         ret -= len;
         } while (len > 0 && ret > 0);
   
        if (!schedRead(root, dispatchSession, TASK_ARG(task), TASK_FD(task), NULL, 0))        if (len >= 0 && !schedRead(root, dispatchSession, TASK_ARG(task), TASK_FD(task), NULL, 0)) {
                 ioLIBERR(sched);                  ioLIBERR(sched);
                   finiSession(sess);
           }
         return NULL;          return NULL;
 }  }
   
static void *void *
 startSession(sched_task_t *task)  startSession(sched_task_t *task)
 {  {
         u_char basebuf[USHRT_MAX];          u_char basebuf[USHRT_MAX];
Line 256  startSession(sched_task_t *task) Line 250  startSession(sched_task_t *task)
                 ret = MQTT_RETCODE_ACCEPTED;                  ret = MQTT_RETCODE_ACCEPTED;
         }          }
   
        /* Start session thread OK ... */        /* Start session task OK ... */
        SESS_LOCK; 
         TAILQ_INSERT_TAIL(&Sessions, sess, sess_node);          TAILQ_INSERT_TAIL(&Sessions, sess, sess_node);
         SESS_UNLOCK;  
   
        if (!schedRead(root, dispatchSession, sess, TASK_FD(task), NULL, 0))        if (!schedRead(root, dispatchSession, sess, TASK_FD(task), NULL, 0)) {
                 ioLIBERR(sched);                  ioLIBERR(sched);
                   ret = MQTT_RETCODE_DENIED;
           }
   
         call.LOG(logg, "Session %s started from %s for user %s (timeout=%d) OK!\n", sess->sess_cid,           call.LOG(logg, "Session %s started from %s for user %s (timeout=%d) OK!\n", sess->sess_cid, 
                         sess->sess_addr, sess->sess_user, sess->sess_ka);                          sess->sess_addr, sess->sess_user, sess->sess_ka);
Line 328  int Line 322  int
 Run(int sock)  Run(int sock)
 {  {
         struct tagPub *pub;          struct tagPub *pub;
           struct tagSession *sess;
         struct timespec pl = { 0, 100000000 };          struct timespec pl = { 0, 100000000 };
   
         ioTRACE(1);          ioTRACE(1);
Line 344  Run(int sock) Line 339  Run(int sock)
                 return -1;                  return -1;
         }          }
   
         pthread_attr_init(&attr);  
         pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);  
   
         schedPolling(root, &pl, NULL);          schedPolling(root, &pl, NULL);
         schedRun(root, &Kill);          schedRun(root, &Kill);
   
         pthread_attr_destroy(&attr);  
   
         /* free all undeleted elements into lists */          /* free all undeleted elements into lists */
         PUBS_LOCK;  
         TAILQ_FOREACH(pub, &Pubs, pub_node) {          TAILQ_FOREACH(pub, &Pubs, pub_node) {
                 TAILQ_REMOVE(&Pubs, pub, pub_node);                  TAILQ_REMOVE(&Pubs, pub, pub_node);
   
Line 361  Run(int sock) Line 350  Run(int sock)
                 if (pub->pub_packet.msg_base)                  if (pub->pub_packet.msg_base)
                         free(pub->pub_packet.msg_base);                          free(pub->pub_packet.msg_base);
         }          }
        PUBS_UNLOCK;        TAILQ_FOREACH(sess, &Sessions, sess_node) {
                 TAILQ_REMOVE(&Sessions, sess, sess_node);
                 finiSession(sess);
         }
         return 0;          return 0;
 }  }

Removed from v.1.2.2.23  
changed lines
  Added in v.1.2.2.25


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>