Пример #1
0
void cholesky_dmModel(double **m, double D_d, double d, double ref_freq,double *resx,double *resy,double *rese,int np, int nc){
   double secperyear=365.25*86400.0;
   double tobs=ceil((resx[np-1])-(resx[0]))/365.25;
   double alpha=8.0/3.0;
   D_d *=1e-12; // convert us to seconds
   d*=86400.0;  // convert days to seconds.

   logdbg("D_d(%f)  = %f (us^2)\n",d,D_d    );
   logdbg("ref_freq = %f (MHz)\n",ref_freq    );
   logmsg("Warning: cholesky DM model currently ignores ref_freq");


   //power at 1 year
   //Equation 12 from Keith et al. (2012)
   // 0.0112 scales a structure function into a power spectrum
   double pism = 0.0112 * D_d * pow(d,(-5.0/3.0)) * pow(secperyear,-1.0/3.0);
   logdbg("pism(1yr^-1)  = %g (yr^3)",pism);

   double fc=1/tobs;


   // power at fc
   pism*=pow(fc,-alpha);

   logdbg("pism(%lfyr^-1)  = %g (yr^3)",fc,pism);

   cholesky_powerlawModel(m,alpha,fc,pism,resx,resy,rese,np,nc);

}
Пример #2
0
/**
 * An accelerated cholesky decomposion to form uinv in plac.
 * uinv is a lower triangular, row-major, matrix.
 */
int accel_uinv(double* _m, int n){
   int i,j;

   double* _u=_m;
   double* _uinv=_m;
   double* _t=(double*)malloc(sizeof(double)*(n*(n+1))/2);


   // LAPACK Cholesky factorisation.
   // _u is a symetric matrix.
   F77_dpotf2("L",&n,_u,&n,&i);
   if(i!=0){
	  logerr("Error in Cholesky Decomp i=%d",i);
      return i;
   }

   // This code taken from the LAPACK documentation
   // to pack a triangular matrix.
   int jc=0;
   for (j=0;j<n;j++){ // cols
	  for (i=j;i<n;i++){ //rows
		 // note that at this point _u is ordered column major
		 // because the LAPACK routine is a FORTRAN code.
		 _t[jc+i-j] = _u[j*n+i];
	  }
	  jc=jc+n-j;
   }

   logdbg("Done CholDecomp... Inverting...",i);
   F77_dtptri("L","N",&n,_t,&i);
   if(i!=0){
	  logerr("Error in Invert i=%d",i);
      return i;
   }

   // Unpack the triangular matrix using reverse
   // of code above, but unpacking into a row-major matrix
   // for C compatibility.
   jc=0;
   for (j=0;j<n;j++){ // cols
	  for (i=0; i < j; i++){
		 // when unpacking we need to zero out the strict upper triangle.
		 _u[i*n+j]=0;
	  }
	  for (i=j;i<n;i++){ //rows
		 // here we arange _u in row-major order
		 // to be C compatible on return.
		 _u[i*n+j]=_t[jc+i-j];
	  }
	  jc=jc+n-j;
   }
   free(_t);

   logdbg("Done Invert.",i);
   return 0;
}
Пример #3
0
 void _ensure_line(std::string file, std::string line)
 {
    if (_file_has_line(file, line))
    {
       logdbg(file + " is configured.");
       return;
    }
    logdbg("Appending to " + file + " :\n " + line);
    std::ofstream f(file, std::ios_base::app | std::ios_base::out);
    f << line << "\n";
 }
Пример #4
0
void formBats(pulsar *psr,int npsr)
{
  int i,p;
  //  double etatdm;
  double shapiroDelay;
  const char *CVS_verNum = "$Revision: 1.8 $";

  if (displayCVSversion == 1) CVSdisplayVersion("formBats.C","formBats()",CVS_verNum);

  logdbg("In formBats");

  for (p=0;p<npsr;p++)
    {
      for (i=0;i<psr[p].nobs;i++)
	{
	  //	  if (psr[p].obsn[i].clockCorr==0 || psr[p].obsn[i].delayCorr==0)
	  if (psr[p].obsn[i].delayCorr==0)
	    psr[p].obsn[i].bat = psr[p].obsn[i].sat;
	  else
	    {
	      /* ORIGINAL TEMPO calculation */
	      if (psr[p].calcShapiro==-1)
		shapiroDelay = 0.0;
	      else
		shapiroDelay = psr[p].obsn[i].shapiroDelaySun + psr[p].planetShapiro*
		  (psr[p].obsn[i].shapiroDelayVenus+
		   psr[p].obsn[i].shapiroDelayJupiter+psr[p].obsn[i].shapiroDelaySaturn
		   +psr[p].obsn[i].shapiroDelayUranus + psr[p].obsn[i].shapiroDelayNeptune);
	     	   //if(i==0){printf("Forming bat with sat = %.15g TT = %.15g TT_TB = %.15g trop = %.15g roemer = %.15g shap = %.15g tdis1 = %.15g tdis2 = %.15g\n",(double)psr[p].obsn[i].sat,(double)getCorrectionTT(psr[p].obsn+i),(double)psr[p].obsn[i].correctionTT_TB,(double)psr[p].obsn[i].troposphericDelay,(double)psr[p].obsn[i].roemer,(double)shapiroDelay,(double)psr[p].obsn[i].tdis1,(double)psr[p].obsn[i].tdis2);}
		     

		long double batcorr=getCorrectionTT(psr[p].obsn+i)/SECDAY
                + (psr[p].obsn[i].correctionTT_TB
                   -psr[p].obsn[i].troposphericDelay
                   +psr[p].obsn[i].roemer -
                   shapiroDelay - psr[p].obsn[i].tdis1 - psr[p].obsn[i].tdis2)/SECDAY;

                psr[p].obsn[i].batCorr = batcorr;

	      psr[p].obsn[i].bat = psr[p].obsn[i].sat + 
		getCorrectionTT(psr[p].obsn+i)/SECDAY 
		+ (psr[p].obsn[i].correctionTT_TB
		   -psr[p].obsn[i].troposphericDelay
		   +psr[p].obsn[i].roemer - 
		   shapiroDelay - psr[p].obsn[i].tdis1 - psr[p].obsn[i].tdis2)/SECDAY;

	      /* Now calculate binary barycentric arrival time (bbat) */
	      psr[p].obsn[i].bbat = psr[p].obsn[i].bat - (psr[p].obsn[i].shklovskii)/SECDAY;
	    }
	}
    }
  logdbg("Leaving formBats");
}
Пример #5
0
int log_enqueue (int prio, const char * fmt, va_list ap)
{
	int len, fwd;
	char buff[MAX_MSG_SIZE];
	struct logmsg * msg;
	struct logmsg * lastmsg;

	lastmsg = (struct logmsg *)la->tail;

	if (!la->empty) {
		fwd = sizeof(struct logmsg) +
		      strlen((char *)&lastmsg->str) * sizeof(char) + 1;
		la->tail += fwd;
	}
	vsnprintf(buff, MAX_MSG_SIZE, fmt, ap);
	len = strlen(buff) * sizeof(char) + 1;

	/* not enough space on tail : rewind */
	if (la->head <= la->tail &&
	    (len + sizeof(struct logmsg)) > (la->end - la->tail)) {
		logdbg(stderr, "enqueue: rewind tail to %p\n", la->tail);
			la->tail = la->start;
	}

	/* not enough space on head : drop msg */
	if (la->head > la->tail &&
	    (len + sizeof(struct logmsg)) > (la->head - la->tail)) {
		logdbg(stderr, "enqueue: log area overrun, drop msg\n");

		if (!la->empty)
			la->tail = lastmsg;

		return 1;
	}

	/* ok, we can stage the msg in the area */
	la->empty = 0;
	msg = (struct logmsg *)la->tail;
	msg->prio = prio;
	memcpy((void *)&msg->str, buff, len);
	lastmsg->next = la->tail;
	msg->next = la->head;

	logdbg(stderr, "enqueue: %p, %p, %i, %s\n", (void *)msg, msg->next,
		msg->prio, (char *)&msg->str);

#if LOGDBG
	dump_logarea();
#endif
	return 0;
}
Пример #6
0
void IoEvent::set() {

#ifdef WINDOWS

	SetEvent(m_handle);

#else // !WINDOWS

#if IO_EVENT_USE_POLL
    if (m_ownsFDs)
        write(m_pipe[1], "x", 1);

#elif IO_EVENT_USE_KQUEUE
    MutexLock lock(m_mutex);

    if (m_type == IoEventTypeUser && m_kqueue >= 0) {
        logdbg("%p", this);

        struct kevent kev[1];
        EV_SET(&kev[0], m_ident, EVFILT_USER, 0, NOTE_TRIGGER, 0, 0);
        int rv = kevent(m_kqueue, kev, 1, 0, 0, 0);

        if (rv == -1)
            logerr("Failed to set event: %s (%d)", strerror(errno), errno);
    }
#endif // IO_EVENT_USE_xxx
#endif // WINDOWS
}
Пример #7
0
int Session::read_head()
{
    struct msg_header tmp;
    int n_read = readn(m_sockfd, (u_char*)&tmp, sizeof(struct msg_header));
    if (n_read == 0)
    {
        return SESSION_RET_NO_DATA;
    }

    if (n_read < (int)sizeof(struct msg_header))
    {
        return -1;
    }

    if (tmp.version != 0x02 || tmp.msg_type > MSG_MAX || tmp.length > 16 * 1024)
    {
        logerr("invalid header, version:%u, msg_type:%u, length:%d\n",
               tmp.version, tmp.msg_type, tmp.length);
        return -1;
    }

    logdbg("ip:%s msg type:%d, len:%d, pid:%d\n",
           get_string_ip().c_str(), tmp.msg_type, tmp.length, g_pid);
    m_msg_type = (msg_type_t)tmp.msg_type;
    m_msg_len = tmp.length;
    return 0;
}
Пример #8
0
void IoEvent::reset() {

#ifdef WINDOWS

	ResetEvent(m_handle);

#else // !WINDOWS

#if IO_EVENT_USE_POLL
    if (m_ownsFDs) {
        uint8_t buf;

        while (read(m_pipe[0], &buf, 1) == 1)
            ;
    }

#elif IO_EVENT_USE_KQUEUE
    MutexLock lock(m_mutex);

    if (m_type == IoEventTypeUser && m_kqueue >= 0) {
        logdbg("%p", this);

        struct kevent kev[1];
        EV_SET(&kev[0], m_ident, EVFILT_USER, EV_CLEAR, 0, 0, 0);
        int rv = kevent(m_kqueue, kev, 1, 0, 0, 0);

        if (rv == -1)
            logerr("Failed to reset event: %s (%d)", strerror(errno), errno);
    }
#endif // IO_EVENT_USE_xxx
#endif // WINDOWS
}
Пример #9
0
int log_dequeue (void * buff)
{
	struct logmsg * src = (struct logmsg *)la->head;
	struct logmsg * dst = (struct logmsg *)buff;
	struct logmsg * lst = (struct logmsg *)la->tail;
	int len;

	if (la->empty)
		return 0;

	len = strlen((char *)&src->str) * sizeof(char) +
	      sizeof(struct logmsg) + 1;

	dst->prio = src->prio;
	memcpy(dst, src,  len);

	if (la->tail == la->head)
		la->empty = 1; /* purge the last log msg */
	else {
		la->head = src->next;
		lst->next = la->head;
	}
	logdbg(stderr, "dequeue: %p, %p, %i, %s\n",
	       (void *)src, src->next, src->prio, (char *)&src->str);

	memset((void *)src, 0, len);

	return len;
}
Пример #10
0
HRESULT CDebugInfoWalker::_AddFuncToList(
    _In_ CFunctionSizes & funcList, 
    _In_ IDiaSymbol *pSymbol, 
    _In_ wstring const & funcNameToMatch)
{
    BSTR symName;

    HRESULT hr = pSymbol->get_name(&symName);
    if(hr == S_OK)
    {
        if(!funcNameToMatch.empty() && (wcsstr(symName, funcNameToMatch.c_str()) == nullptr))
        {
            // Requested for substring match but no match found
            logdbg(L"Skipping: %s", symName);

            SysFreeString(symName);
            return S_FALSE;
        }

        ULONGLONG ullSize;
        hr = pSymbol->get_length(&ullSize);
        if(hr == S_OK)
        {
            funcList.addData(symName, ullSize);
        }
        SysFreeString(symName);
    }
    return hr;
}
Пример #11
0
void cholesky_readFromCovarianceFunction(double **m, char* fname,double *resx,double *resy,double *rese,int np, int nc){
   int ndays = ceil((resx[np-1-nc]-resx[0])+1e-10);
   double covarFunc[ndays+1];
   double escaleFactor = 1.0;
   int i;
   FILE* fin;
   logmsg("Parsing '%s' as covariance function",fname);

   logtchk("reading covariance function from disk, ndays = %d",ndays);
   if (!(fin = fopen(fname,"r")))
   {
	  logerr("Unable to open covariance function file: %s",fname);
	  exit(1);
   }
   logdbg("ndays = %d",ndays);
   fscanf(fin,"%lf",&escaleFactor);
   for (i=0;i<=ndays;i++)
   {
	  if (fscanf(fin,"%lf",&covarFunc[i])!=1)
	  {
		 logerr("Incorrect number of days in the Cholesky matrix: %s, trying to read %d days",fname,ndays);
		 exit(1);
	  }
   }
   fclose(fin);
   if(escaleFactor!=1.0){
	  logerr("Ignoring 'error scale factor': %g",escaleFactor);
   }
   logtchk("complete reading covariance function from disk");

   cholesky_covarFunc2matrix(m,covarFunc,ndays,resx,resy,rese,np,nc);

}
Пример #12
0
HRESULT CDebugInfoWalker::_AddFuncToList(
    _In_ CFunctionSizes & funcList, 
    _In_ IDiaSymbol *pSymbol, 
    _In_ set<wstring> const & aszFuncNamesToMatch)
{
    BSTR symName;

    HRESULT hr = pSymbol->get_name(&symName);
    if(hr == S_OK)
    {
        // Is this a function requested by the user?
        if(aszFuncNamesToMatch.find(symName) != aszFuncNamesToMatch.end())
        {
            ULONGLONG ullSize;
            if(pSymbol->get_length(&ullSize) == S_OK)
            {
                funcList.addData(symName, ullSize);
            }
        }
#ifdef _DEBUG
        else
        {
            logdbg(L"Skipping: %s", symName);
        }
#endif
        SysFreeString(symName);
    }
    return hr;
}
Пример #13
0
IoEvent::~IoEvent() {

#ifdef WINDOWS
	if (m_handle != INVALID_HANDLE_VALUE) {
		CloseHandle(m_handle);
		m_handle = NULL;
	}
#else // !WINDOWS

#if IO_EVENT_USE_POLL
    if (m_pipe[0] >= 0) {
        if (m_ownsFDs)
            close(m_pipe[0]);

        m_pipe[0] = -1;
    }

    if (m_pipe[1] >= 0) {
        if (m_ownsFDs)
            close(m_pipe[1]);

        m_pipe[1] = -1;
    }

#elif IO_EVENT_USE_KQUEUE
    logdbg("%p", this);

    deleteEvent();
    m_type = IoEventTypeNone;
    m_ident = -1;
#endif // IO_EVENT_USE_xxx
#endif // WINDOWS
}
Пример #14
0
int Session::on_connect()
{
    logdbg("session connect:%s, pid:%d\n",
           get_string_ip().c_str(), g_pid);
    m_start_time = get_cur_time_ms();
    m_active_time = m_start_time;
    return 0;
}
Пример #15
0
static void dump_logarea (void)
{
	struct logmsg * msg;

	logdbg(stderr, "\n==== area: start addr = %p, end addr = %p ====\n",
		la->start, la->end);
	logdbg(stderr, "|addr     |next     |prio|msg\n");

	for (msg = (struct logmsg *)la->head; (void *)msg != la->tail;
	     msg = msg->next)
		logdbg(stderr, "|%p |%p |%i   |%s\n", (void *)msg, msg->next,
				msg->prio, (char *)&msg->str);

	logdbg(stderr, "|%p |%p |%i   |%s\n", (void *)msg, msg->next,
			msg->prio, (char *)&msg->str);

	logdbg(stderr, "\n\n");
}
Пример #16
0
void signal_cb(evutil_socket_t sig, short events, void *user_data)
{
	struct event_base *base = (struct event_base*)user_data;
	struct timeval delay = { 2, 0 };

	logdbg("Caught an interrupt signal; exiting cleanly in two seconds.\n");
	//cleanup task
	SingletonHolder<SessionMgr>::Instance()->Clear();
	event_base_loopexit(base, &delay);
}
Пример #17
0
int SessionMgr::Del( Session *pSession )
{
	if (!pSession)
	{
		logerr("pSession NULL\n");
	}
	logdbg("session delete[%s:%d]\n",pSession->OnGetIPAddr().c_str(), pSession->OnGetPort());
	Del((pSession->GetKey()));
	return 0;
}
Пример #18
0
int Session::on_close()
{
    logdbg("session close:%s, pid:%d\n",
           get_string_ip().c_str(), g_pid);
    reset_buffer();
    close(m_sockfd);
    m_sockfd = -1;

    return 0;
}
Пример #19
0
int Session::notify_master(struct commu_msg &msg)
{
    int n = writen(g_fifo_fd, (u_char *)&msg, sizeof(msg));
    if (n != sizeof(msg))
    {
        logerr("write fifo failed!");
        return -1;
    }
    logdbg("slave notify master\n");
    return 0;
}
Пример #20
0
int NetworkWrapper::Tick()
{
	logdbg("Used blocks %d, usag %d%%\n",
		SingletonHolder<ShmqWrapper>::Instance()->GetUsedBlocks()
		,SingletonHolder<ShmqWrapper>::Instance()->GetUsage());

	struct timeval tv;  
	tv.tv_sec = 1;  
	tv.tv_usec = 0;   
	event_add(m_stTimeEvt, &tv);  

	return 0;
}
Пример #21
0
int log_init(char *program_name, int size)
{
	logdbg(stderr,"enter log_init\n");
	log_name = program_name;

	if (log_daemon) {
		struct sigaction sa_old;
		struct sigaction sa_new;
		pid_t pid;

		openlog(log_name, 0, LOG_DAEMON);
		setlogmask (LOG_UPTO (LOG_DEBUG));

		if (logarea_init(size)) {
			syslog(LOG_ERR, "logarea init failed");
			return -1;
		}

		pid = fork();
		if (pid < 0) {
			syslog(LOG_ERR, "starting logger failed");
			exit(1);
		} else if (pid) {
			syslog(LOG_WARNING,
			       "iSCSI logger with pid=%d started!", pid);
			return pid;
		}

		daemon_init();

		/* flush on daemon's crash */
		sa_new.sa_handler = (void*)catch_signal;
		sigemptyset(&sa_new.sa_mask);
		sa_new.sa_flags = 0;
		sigaction(SIGSEGV, &sa_new, &sa_old );
		sigaction(SIGTERM, &sa_new, &sa_old );

		while(1) {
			log_flush();
			sleep(1);

			if (log_stop_daemon)
				break;
		}

		__log_close();
		exit(0);
	}

	return 0;
}
Пример #22
0
void IoEvent::initEvent(int kqueue, struct kevent *kevent) {
    m_kqueue = kqueue;

    if (kevent) {
        logdbg("%p", this);

        if (m_type == IoEventTypeFile)
            // File descriptor event
            EV_SET(kevent, m_ident, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
        else if (m_type == IoEventTypeUser)
            // User event
            EV_SET(kevent, m_ident, EVFILT_USER, EV_ADD | EV_ENABLE, NOTE_TRIGGER, 0, 0);
    }
}
Пример #23
0
int SessionMgr::Clear()
{
	logdbg("Clear All Session\n");
	SMAP::iterator it;
	for (it = m_stSessionMap.begin(); it != m_stSessionMap.end(); ++it)
	{
		if (it->second)
		{
			delete it->second;
		}
	}
	m_stSessionMap.clear();
	return 0;
}
Пример #24
0
static ssize_t auth_bypass_attr_show(struct module_attribute *mattr,
                                     struct module *mod,	char *buf)
{
    mutex_lock(&s_auth_cfg.auth_cfg_mutex);
    auth_cfg_lock(&s_auth_cfg);

    *(int *)buf = auth_cfg_bypass(&s_auth_cfg);

    auth_cfg_unlock(&s_auth_cfg);
    mutex_unlock(&s_auth_cfg.auth_cfg_mutex);
    buf[4] = 0;
    logdbg("bypass : %d\n", *(int *)buf);
    return 4;
}
Пример #25
0
void initialise(pulsar *psr,int noWarnings)
{
    int p;
    const char *CVS_verNum = "$Id: 56cb3396b0d85a3876be0530d60f6aadde41d468 $";

    if (displayCVSversion == 1) CVSdisplayVersion("initialise.C","initialise()",CVS_verNum);

    // allocate space for covar arrays
    int fullSetup = 1;
    logdbg("Initialise");

    for (p=0;p<MAX_PSR;p++)
        //    if (psr[p].obsn == NULL)
        initialiseOne (psr+p, noWarnings, fullSetup);
}
Пример #26
0
 void _check_prereqs_xplatform()
 {
    CommandLine cl("docker", { "version","--format","{{.Server.Version}}" });
    std::string op;
    if (utils::runcommand(cl, op) != 0)
       fatal("Running \"docker --version\" failed!\nIs docker correctly installed on this machine?\n" + op);
    std::string major, minor;
    unsigned int i;
    for (i = 0; i < op.length() && op[i] != '.'; ++i)
       major += op[i];
    for (++i; i < op.length() && op[i] != '.'; ++i)
       minor += op[i];
    logdbg("Docker major version = " + major + " and minor = " + minor);
    if (std::strtol(major.c_str(), 0, 10) == 1 && std::stoi(minor.c_str(), 0, 10) < 12)
       fatal("dRunner requires docker version 1.12 or newer. Please update!");
 }
Пример #27
0
   void _copyexe()
   {
      Poco::Path currentexe = drunnerPaths::getPath_Exe();

      try
      {
         if (currentexe.parent().toString().compare(drunnerPaths::getPath_Bin().toString()) != 0)
            Poco::File(currentexe).copyTo(drunnerPaths::getPath_Bin().toString());
         logdbg("Copied drunner to " + drunnerPaths::getPath_Bin().toString());
         drunner_assert(utils::fileexists(drunnerPaths::getPath_Exe_Target()), "Failed to install drunner.exe");
      }
      catch (const Poco::FileException & e)
      {
         logmsg(kLWARN, std::string("Couldn't copy exe to bin directory: ") + e.what());
      }
   }
Пример #28
0
void t2Fit_fillGlobalFitInfo(pulsar* psr, unsigned int npsr,FitInfo &OUT){
    OUT.nParams=0;
    OUT.nConstraints=0;
    for (int i=1;i<=psr->nJumps;i++) {
        if (psr->fitJump[i]==2)
        {
            logdbg("Global Jump");
            OUT.paramIndex[OUT.nParams]=param_JUMP;
            OUT.paramCounters[OUT.nParams]=i;
            OUT.paramDerivs[OUT.nParams]     =t2FitFunc_jump;
            OUT.updateFunctions[OUT.nParams] =t2UpdateFunc_jump;
            ++OUT.nParams;
        }
    }

    // Use pulsar zero to define the global parameters.
    t2Fit_fillFitInfo_INNER(psr,OUT,2);
}
Пример #29
0
int log_init(char *program_name, int size, int daemon, int debug)
{
	is_daemon = daemon;
	is_debug = debug;

	logdbg(stderr,"enter log_init\n");
	log_name = program_name;
	if (is_daemon) {
		struct sigaction sa_old;
		struct sigaction sa_new;
		pid_t pid;

		openlog(log_name, 0, LOG_DAEMON);
		setlogmask (LOG_UPTO (LOG_DEBUG));

		if (logarea_init(size))
			return 1;

		pid = fork();
		if (pid < 0) {
			syslog(LOG_ERR, "starting logger failed\n");
			exit(1);
		} else if (pid) {
			syslog(LOG_WARNING,
			       "Target daemon logger with pid=%d started!\n", pid);
			return 0;
		}

		/* flush on daemon's crash */
		sa_new.sa_handler = (void*)log_flush;
		sigemptyset(&sa_new.sa_mask);
		sa_new.sa_flags = 0;
		sigaction(SIGSEGV, &sa_new, &sa_old );

		while(1) {
			log_flush();
			sleep(1);
		}
		exit(0);
	}

	return 0;
}
Пример #30
0
int verify_buff_fill(struct verify_buff_st *mb, char *buff, int len, int idx, del_callback cb, void *param) {
	int total = 0, i, maxid;
	struct ap_user *user;
	char *pos, *end;
	
	if (!mb->count)
		return 0;
	
	pos = buff, end = buff + len;
	for (i = 0; i < mb->count; i++) {
		int left = end - pos;
		if (left < AP_USER_SIZE + sizeof(idx)) {
			logerr("buff too small %d %d\n", left, AP_USER_SIZE + sizeof(idx));
			break;
		}
		
		user = (struct ap_user*)mb->data[i];
		if (user->status == 'v') {
			memcpy(pos, &idx, sizeof(idx));			pos += sizeof(idx);
			ap_user_fill(user, pos, AP_USER_SIZE);	pos += AP_USER_SIZE;  
			total += AP_USER_SIZE + sizeof(idx); 
			
			cb(user, param);
			continue;
		}
		
		/* 微信登录时,会直接把待认证的user节点从'v'改成'w' */
		{
		unsigned char *mac = user->mac;
		logdbg("status %c %d %02x-%02x-%02x-%02x-%02x-%02x\n", user->status, idx, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
		}
	}
	
	maxid = 0;
	if (i < mb->count) {
		maxid = mb->count - i;
		logerr("buffer too small len %d, need %d %d %d\n", len, (AP_IP_SIZE + AP_MAC_SIZE) * mb->count, i, mb->count);
		memmove(&mb->data[0], &mb->data[i], maxid * sizeof(void *));
	}
	mb->count = maxid;

	return total;
}