Beispiel #1
0
static void twdTask(void *arg)
{
    struct tNode *pt;
    struct mNode *pm;

    while (twdCtl != twdctlExit) {
        if (twdCtl == twdctlRun) {
            epicsMutexMustLock(tLock);
            pt = (struct tNode *)ellFirst(&tList);
            while (pt) {
                int susp = epicsThreadIsSuspended(pt->tid);
                if (susp != pt->suspended) {
                    epicsMutexMustLock(mLock);
                    pm = (struct mNode *)ellFirst(&mList);
                    while (pm) {
                        if (pm->funcs->notify) {
                            pm->funcs->notify(pm->usr, pt->tid, susp);
                        }
                        pm = (struct mNode *)ellNext(&pm->node);
                    }
                    epicsMutexUnlock(mLock);

                    if (susp) {
                        char tName[40];
                        epicsThreadGetName(pt->tid, tName, sizeof(tName));
                        errlogPrintf("Thread %s (%p) suspended\n",
                                    tName, (void *)pt->tid);
                        if (pt->callback) {
                            pt->callback(pt->usr);
                        }
                    }
                    pt->suspended = susp;
                }
                pt = (struct tNode *)ellNext(&pt->node);
            }
            epicsMutexUnlock(tLock);
        }
        epicsEventWaitWithTimeout(loopEvent, TASKWD_DELAY);
    }
    epicsEventSignal(exitEvent);
}
Beispiel #2
0
/* Public, also driver's report routine */
long drvEtherIP_report(int level)
{
    PLC *plc;
    EIPIdentityInfo *ident;
    ScanList *list;
    epicsTimeStamp now;
    char tsString[50];

    if (level <= 0)
    {
        printf("drvEtherIP V%d.%d - ControlLogix 5000 PLC via EtherNet/IP\n",
               ETHERIP_MAYOR, ETHERIP_MINOR);
        return 0;
    }
    printf("drvEtherIP V%d.%d report, -*- outline -*-\n",
           ETHERIP_MAYOR, ETHERIP_MINOR);
    if (drvEtherIP_private.lock == 0)
    {
        printf(" drvEtherIP lock is 0, did you call drvEtherIP_init?\n");
        return 0;
    }
    if (level > 1)
        printf("  Mutex lock: 0x%lX\n",
               (unsigned long) drvEtherIP_private.lock);
    for (plc = DLL_first(PLC,&drvEtherIP_private.PLCs);
         plc;  plc = DLL_next(PLC,plc))
    {
        printf ("* PLC '%s', IP '%s'\n", plc->name, plc->ip_addr);
        if (level > 1)
        {
            ident = &plc->connection->info;
            printf("  Interface name        : %s\n", ident->name);
            printf("  Interface vendor      : 0x%X\n", ident->vendor);
            printf("  Interface type        : 0x%X\n", ident->device_type);
            printf("  Interface revision    : 0x%X\n", ident->revision);
            printf("  Interface serial      : 0x%X\n",
                   (unsigned)ident->serial_number);

            printf("  scan thread slow count: %u\n", (unsigned)plc->slow_scans);
            printf("  connection errors     : %u\n", (unsigned)plc->plc_errors);
        }
        if (level > 2)
        {
            printf("  Mutex lock            : 0x%lX\n",
                   (unsigned long)plc->lock);
            printf("  scan task ID          : 0x%lX (%s)\n",
                   (unsigned long) plc->scan_task_id,
                   (plc->scan_task_id==0 ? "-dead-" :
                    epicsThreadIsSuspended(plc->scan_task_id)!=0 ? "suspended":
                    "running"));
            epicsTimeGetCurrent(&now);
            epicsTimeToStrftime(tsString, sizeof(tsString),
                                "%Y/%m/%d %H:%M:%S.%04f", &now);
            printf("  Now                   : %s\n", tsString);
            if (level > 3)
            {
                printf("** ");
                EIP_dump_connection(plc->connection);
            }
            if (level > 4)
            {
                for (list=DLL_first(ScanList, &plc->scanlists); list;
                     list=DLL_next(ScanList, list))
                {
                    printf("** ");
                    dump_ScanList(list, level);
                }
            }
        }
    }
    printf("\n");
    return 0;
}