예제 #1
0
파일: vss.c 프로젝트: tuxmux/bareos
static bool VSSPathConvertW(const wchar_t *szFilePath, wchar_t *szShadowPath, int nBuflen)
{
   JCR *jcr = get_jcr_from_tsd();

   if (jcr && jcr->pVSSClient) {
      return jcr->pVSSClient->GetShadowPathW(szFilePath, szShadowPath, nBuflen);
   }

   return false;
}
예제 #2
0
파일: jcr.c 프로젝트: janstadler/bareos
/*
 * Find which JobId corresponds to the current thread
 */
uint32_t get_jobid_from_tsd()
{
    JCR *jcr;
    uint32_t JobId = 0;
    jcr = get_jcr_from_tsd();

    if (jcr) {
        JobId = (uint32_t)jcr->JobId;
    }
    return JobId;
}
예제 #3
0
파일: jcr.c 프로젝트: rkorzeniewski/bacula
/*
 * Find which JobId corresponds to the current thread
 */
uint32_t get_jobid_from_tsd()
{
   JCR *jcr;
   uint32_t JobId = 0;
   jcr = get_jcr_from_tsd();
// printf("get_jobid_from_tsr: jcr=%p\n", jcr);
   if (jcr) {
      JobId = (uint32_t)jcr->JobId;
   }
   return JobId;
}
예제 #4
0
파일: jcr.c 프로젝트: janstadler/bareos
void b_free_jcr(const char *file, int line, JCR *jcr)
{
    struct s_last_job *je;

    Dmsg3(dbglvl, "Enter free_jcr jid=%u from %s:%d\n", jcr->JobId, file, line);

#else

void free_jcr(JCR *jcr)
{
    struct s_last_job *je;

    Dmsg3(dbglvl, "Enter free_jcr jid=%u use_count=%d Job=%s\n",
          jcr->JobId, jcr->use_count(), jcr->Job);

#endif

    lock_jcr_chain();
    jcr->dec_use_count();              /* decrement use count */
    if (jcr->use_count() < 0) {
        Jmsg2(jcr, M_ERROR, 0, _("JCR use_count=%d JobId=%d\n"),
              jcr->use_count(), jcr->JobId);
    }
    if (jcr->JobId > 0) {
        Dmsg3(dbglvl, "Dec free_jcr jid=%u use_count=%d Job=%s\n",
              jcr->JobId, jcr->use_count(), jcr->Job);
    }
    if (jcr->use_count() > 0) {          /* if in use */
        unlock_jcr_chain();
        return;
    }
    if (jcr->JobId > 0) {
        Dmsg3(dbglvl, "remove jcr jid=%u use_count=%d Job=%s\n",
              jcr->JobId, jcr->use_count(), jcr->Job);
    }
    remove_jcr(jcr);                   /* remove Jcr from chain */
    unlock_jcr_chain();

    dequeue_messages(jcr);
    job_end_pop(jcr);                  /* pop and call hooked routines */

    Dmsg1(dbglvl, "End job=%d\n", jcr->JobId);

    /*
     * Keep some statistics
     */
    switch (jcr->getJobType()) {
    case JT_BACKUP:
    case JT_VERIFY:
    case JT_RESTORE:
    case JT_MIGRATE:
    case JT_COPY:
    case JT_ADMIN:
        /*
         * Keep list of last jobs, but not Console where JobId==0
         */
        if (jcr->JobId > 0) {
            lock_last_jobs_list();
            num_jobs_run++;
            je = (struct s_last_job *)malloc(sizeof(struct s_last_job));
            memset(je, 0, sizeof(struct s_last_job));  /* zero in case unset fields */
            je->Errors = jcr->JobErrors;
            je->JobType = jcr->getJobType();
            je->JobId = jcr->JobId;
            je->VolSessionId = jcr->VolSessionId;
            je->VolSessionTime = jcr->VolSessionTime;
            bstrncpy(je->Job, jcr->Job, sizeof(je->Job));
            je->JobFiles = jcr->JobFiles;
            je->JobBytes = jcr->JobBytes;
            je->JobStatus = jcr->JobStatus;
            je->JobLevel = jcr->getJobLevel();
            je->start_time = jcr->start_time;
            je->end_time = time(NULL);

            if (!last_jobs) {
                init_last_jobs_list();
            }
            last_jobs->append(je);
            if (last_jobs->size() > max_last_jobs) {
                je = (struct s_last_job *)last_jobs->first();
                last_jobs->remove(je);
                free(je);
            }
            unlock_last_jobs_list();
        }
        break;
    default:
        break;
    }

    close_msg(jcr);                    /* close messages for this job */

    if (jcr->daemon_free_jcr) {
        jcr->daemon_free_jcr(jcr);      /* call daemon free routine */
    }

    free_common_jcr(jcr);
    close_msg(NULL);                   /* flush any daemon messages */
    Dmsg0(dbglvl, "Exit free_jcr\n");
}

/*
 * Remove jcr from thread specific data, but
 * but make sure it is us who are attached.
 */
void remove_jcr_from_tsd(JCR *jcr)
{
    JCR *tjcr = get_jcr_from_tsd();
    if (tjcr == jcr) {
        set_jcr_in_tsd(INVALID_JCR);
    }
}