void ionDetach() { #if defined (VXWORKS) || defined (RTEMS) return; #else Sdr ionsdr = _ionsdr(NULL); if (ionsdr) { sdr_stop_using(ionsdr); ionsdr = NULL; /* To reset to NULL. */ oK(_ionsdr(&ionsdr)); } #endif }
int ionClockIsSynchronized() { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); IonDB iondbBuf; sdr_read(ionsdr, (char *) &iondbBuf, iondbObject, sizeof(IonDB)); return iondbBuf.clockIsSynchronized; }
void ionDetach() { #if defined (VXWORKS) || defined (bionic) return; #elif defined (RTEMS) sm_TaskForget(sm_TaskIdSelf()); #else Sdr ionsdr = _ionsdr(NULL); if (ionsdr) { sdr_stop_using(ionsdr); ionsdr = NULL; /* To reset to NULL. */ oK(_ionsdr(&ionsdr)); } #ifdef mingw oK(_winsock(1)); #endif #endif }
void ionTerminate() { Sdr sdr = _ionsdr(NULL); Object obj = 0; sm_WmParms ionwmParms; char *ionvdbName = NULL; if (sdr) { sdr_destroy(sdr); sdr = NULL; oK(_ionsdr(&sdr)); /* To reset to NULL. */ } oK(_iondbObject(&obj)); ionwmParms.wmKey = 0; ionwmParms.wmSize = -1; ionwmParms.wmAddress = NULL; oK(_ionwm(&ionwmParms)); oK(_ionvdb(&ionvdbName)); }
static IonDB *_ionConstants() { static IonDB buf; static IonDB *db = NULL; if (db == NULL) { /* Load constants into a conveniently accessed * structure. Note that this CANNOT be treated * as a current database image in later * processing. */ sdr_read(_ionsdr(NULL), (char *) &buf, _iondbObject(NULL), sizeof(IonDB)); db = &buf; } return db; }
void ionOccupy(int size) { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); IonDB iondbBuf; CHKVOID(ionLocked()); CHKVOID(size >= 0); sdr_stage(ionsdr, (char *) &iondbBuf, iondbObject, sizeof(IonDB)); if (iondbBuf.currentOccupancy + size < 0)/* Overflow. */ { iondbBuf.currentOccupancy = iondbBuf.occupancyCeiling; } else { iondbBuf.currentOccupancy += size; } sdr_write(ionsdr, iondbObject, (char *) &iondbBuf, sizeof(IonDB)); }
int setDeltaFromUTC(int newDelta) { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); IonDB *ionConstants = _ionConstants(); IonVdb *ionvdb = _ionvdb(NULL); sdr_begin_xn(ionsdr); sdr_stage(ionsdr, (char *) ionConstants, iondbObject, sizeof(IonDB)); ionConstants->deltaFromUTC = newDelta; sdr_write(ionsdr, iondbObject, (char *) ionConstants, sizeof(IonDB)); if (sdr_end_xn(ionsdr) < 0) { putErrmsg("Can't change delta from UTC.", NULL); return -1; } ionvdb->deltaFromUTC = newDelta; return 0; }
void ionVacate(int size) { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); IonDB iondbBuf; CHKVOID(ionLocked()); CHKVOID(size >= 0); sdr_stage(ionsdr, (char *) &iondbBuf, iondbObject, sizeof(IonDB)); if (size > iondbBuf.currentOccupancy) /* Underflow. */ { iondbBuf.currentOccupancy = 0; } else { iondbBuf.currentOccupancy -= size; } sdr_write(ionsdr, iondbObject, (char *) &iondbBuf, sizeof(IonDB)); }
void ionProd(unsigned long fromNode, unsigned long toNode, unsigned long xmitRate, unsigned int owlt) { Sdr ionsdr = _ionsdr(NULL); time_t fromTime; time_t toTime; Object elt; char textbuf[RFX_NOTE_LEN]; if (ionsdr == NULL) { if (ionAttach() < 0) { writeMemo("[?] ionProd: node not initialized yet."); return; } } fromTime = getUTCTime(); /* The current time. */ toTime = fromTime + 14400; /* Four hours later. */ elt = rfx_insert_range(fromTime, toTime, fromNode, toNode, owlt); if (elt == 0) { writeMemoNote("[?] ionProd: range insertion failed.", utoa(owlt)); return; } writeMemo("ionProd: range inserted."); writeMemo(rfx_print_range(sdr_list_data(ionsdr, elt), textbuf)); elt = rfx_insert_contact(fromTime, toTime, fromNode, toNode, xmitRate); if (elt == 0) { writeMemoNote("[?] ionProd: contact insertion failed.", utoa(xmitRate)); return; } writeMemo("ionProd: contact inserted."); writeMemo(rfx_print_contact(sdr_list_data(ionsdr, elt), textbuf)); }
static IonDB *_ionConstants() { static IonDB buf; static IonDB *db = NULL; Sdr sdr; Object dbObject; if (db == NULL) { /* Load constants into a conveniently accessed * structure. Note that this CANNOT be treated * as a current database image in later * processing. */ sdr = _ionsdr(NULL); CHKNULL(sdr); dbObject = _iondbObject(NULL); if (dbObject) { if (sdr_heap_is_halted(sdr)) { sdr_read(sdr, (char *) &buf, dbObject, sizeof(IonDB)); } else { CHKNULL(sdr_begin_xn(sdr)); sdr_read(sdr, (char *) &buf, dbObject, sizeof(IonDB)); sdr_exit_xn(sdr); } db = &buf; } } return db; }
int ionInitialize(IonParms *parms, unsigned long ownNodeNbr) { char wdname[256]; Sdr ionsdr; Object iondbObject; IonDB iondbBuf; sm_WmParms ionwmParms; char *ionvdbName = _ionvdbName(); CHKERR(parms); CHKERR(ownNodeNbr); if (sdr_initialize(0, NULL, SM_NO_KEY, NULL) < 0) { putErrmsg("Can't initialize the SDR system.", NULL); return -1; } if (igetcwd(wdname, 256) == NULL) { putErrmsg("Can't get cwd name.", NULL); return -1; } if (checkNodeListParms(parms, wdname, ownNodeNbr) < 0) { putErrmsg("Failed checking node list parms.", NULL); return -1; } if (sdr_load_profile(parms->sdrName, parms->configFlags, parms->heapWords, parms->heapKey, parms->pathName) < 0) { putErrmsg("Unable to load SDR profile for ION.", NULL); return -1; } ionsdr = sdr_start_using(parms->sdrName); if (ionsdr == NULL) { putErrmsg("Can't start using SDR for ION.", NULL); return -1; } ionsdr = _ionsdr(&ionsdr); /* Recover the ION database, creating it if necessary. */ sdr_begin_xn(ionsdr); iondbObject = sdr_find(ionsdr, _iondbName(), NULL); switch (iondbObject) { case -1: /* SDR error. */ sdr_cancel_xn(ionsdr); putErrmsg("Can't seek ION database in SDR.", NULL); return -1; case 0: /* Not found; must create new DB. */ if (ownNodeNbr == 0) { sdr_cancel_xn(ionsdr); putErrmsg("Must supply non-zero node number.", NULL); return -1; } memset((char *) &iondbBuf, 0, sizeof(IonDB)); memcpy(iondbBuf.workingDirectoryName, wdname, 256); iondbBuf.ownNodeNbr = ownNodeNbr; iondbBuf.occupancyCeiling = ((sdr_heap_size(ionsdr) / 100) * (100 - ION_SEQUESTERED)); iondbBuf.receptionSpikeReserve = iondbBuf.occupancyCeiling / 16; if (iondbBuf.receptionSpikeReserve < MIN_SPIKE_RSRV) { iondbBuf.receptionSpikeReserve = MIN_SPIKE_RSRV; } iondbBuf.contacts = sdr_list_create(ionsdr); iondbBuf.ranges = sdr_list_create(ionsdr); iondbBuf.maxClockError = 0; iondbObject = sdr_malloc(ionsdr, sizeof(IonDB)); if (iondbObject == 0) { sdr_cancel_xn(ionsdr); putErrmsg("No space for database.", NULL); return -1; } sdr_write(ionsdr, iondbObject, (char *) &iondbBuf, sizeof(IonDB)); sdr_catlg(ionsdr, _iondbName(), 0, iondbObject); if (sdr_end_xn(ionsdr)) { putErrmsg("Can't create ION database.", NULL); return -1; } break; default: /* Found DB in the SDR. */ sdr_exit_xn(ionsdr); } oK(_iondbObject(&iondbObject)); oK(_ionConstants()); /* Open ION shared-memory partition. */ ionwmParms.wmKey = parms->wmKey; ionwmParms.wmSize = parms->wmSize; ionwmParms.wmAddress = parms->wmAddress; ionwmParms.wmName = ION_SM_NAME; if (_ionwm(&ionwmParms) == NULL) { putErrmsg("ION memory configuration failed.", NULL); return -1; } if (_ionvdb(&ionvdbName) == NULL) { putErrmsg("ION can't initialize vdb.", NULL); return -1; } ionRedirectMemos(); return 0; }
Sdr getIonsdr() { return _ionsdr(NULL); }
static IonVdb *_ionvdb(char **name) { static IonVdb *vdb = NULL; PsmAddress vdbAddress; PsmAddress elt; Sdr sdr; PsmPartition ionwm; IonDB iondb; if (name) { if (*name == NULL) /* Terminating. */ { vdb = NULL; return vdb; } /* Attaching to volatile database. */ ionwm = _ionwm(NULL); if (psm_locate(ionwm, *name, &vdbAddress, &elt) < 0) { putErrmsg("Failed searching for vdb.", *name); return NULL; } if (elt) { vdb = (IonVdb *) psp(ionwm, vdbAddress); return vdb; } /* ION volatile database doesn't exist yet. */ sdr = _ionsdr(NULL); CHKNULL(sdr_begin_xn(sdr)); /* To lock memory. */ vdbAddress = psm_zalloc(ionwm, sizeof(IonVdb)); if (vdbAddress == 0) { sdr_exit_xn(sdr); putErrmsg("No space for volatile database.", *name); return NULL; } vdb = (IonVdb *) psp(ionwm, vdbAddress); memset((char *) vdb, 0, sizeof(IonVdb)); vdb->zcoSemaphore = sm_SemCreate(SM_NO_KEY, SM_SEM_FIFO); if (vdb->zcoSemaphore == SM_SEM_NONE) { sdr_exit_xn(sdr); putErrmsg("Can't initialize volatile database.", *name); return NULL; } sm_SemTake(vdb->zcoSemaphore); /* Lock it. */ if ((vdb->nodes = sm_rbt_create(ionwm)) == 0 || (vdb->neighbors = sm_rbt_create(ionwm)) == 0 || (vdb->contactIndex = sm_rbt_create(ionwm)) == 0 || (vdb->rangeIndex = sm_rbt_create(ionwm)) == 0 || (vdb->timeline = sm_rbt_create(ionwm)) == 0 || (vdb->probes = sm_list_create(ionwm)) == 0 || psm_catlg(ionwm, *name, vdbAddress) < 0) { sdr_exit_xn(sdr); putErrmsg("Can't initialize volatile database.", *name); return NULL; } vdb->clockPid = ERROR; /* None yet. */ sdr_read(sdr, (char *) &iondb, _iondbObject(NULL), sizeof(IonDB)); vdb->deltaFromUTC = iondb.deltaFromUTC; sdr_exit_xn(sdr); /* Unlock memory. */ } return vdb; }
void ionEject() { sdr_eject_xn(_ionsdr(NULL)); }
int ionInitialize(IonParms *parms, uvast ownNodeNbr) { char wdname[256]; Sdr ionsdr; Object iondbObject; IonDB iondbBuf; vast limit; sm_WmParms ionwmParms; char *ionvdbName = _ionvdbName(); ZcoCallback notify = ionOfferZcoSpace; CHKERR(parms); CHKERR(ownNodeNbr); #ifdef mingw if (_winsock(0) < 0) { return -1; } #endif if (sdr_initialize(0, NULL, SM_NO_KEY, NULL) < 0) { putErrmsg("Can't initialize the SDR system.", NULL); return -1; } if (igetcwd(wdname, 256) == NULL) { putErrmsg("Can't get cwd name.", NULL); return -1; } if (checkNodeListParms(parms, wdname, ownNodeNbr) < 0) { putErrmsg("Failed checking node list parms.", NULL); return -1; } if (sdr_load_profile(parms->sdrName, parms->configFlags, parms->heapWords, parms->heapKey, parms->pathName, "ionrestart") < 0) { putErrmsg("Unable to load SDR profile for ION.", NULL); return -1; } ionsdr = sdr_start_using(parms->sdrName); if (ionsdr == NULL) { putErrmsg("Can't start using SDR for ION.", NULL); return -1; } ionsdr = _ionsdr(&ionsdr); /* Recover the ION database, creating it if necessary. */ CHKERR(sdr_begin_xn(ionsdr)); iondbObject = sdr_find(ionsdr, _iondbName(), NULL); switch (iondbObject) { case -1: /* SDR error. */ sdr_cancel_xn(ionsdr); putErrmsg("Can't seek ION database in SDR.", NULL); return -1; case 0: /* Not found; must create new DB. */ if (ownNodeNbr == 0) { sdr_cancel_xn(ionsdr); putErrmsg("Must supply non-zero node number.", NULL); return -1; } memset((char *) &iondbBuf, 0, sizeof(IonDB)); memcpy(iondbBuf.workingDirectoryName, wdname, 256); iondbBuf.ownNodeNbr = ownNodeNbr; iondbBuf.productionRate = -1; /* Unknown. */ iondbBuf.consumptionRate = -1; /* Unknown. */ limit = (sdr_heap_size(ionsdr) / 100) * (100 - ION_SEQUESTERED); zco_set_max_heap_occupancy(ionsdr, limit); iondbBuf.occupancyCeiling = zco_get_max_file_occupancy(ionsdr); iondbBuf.occupancyCeiling += limit; iondbBuf.contacts = sdr_list_create(ionsdr); iondbBuf.ranges = sdr_list_create(ionsdr); iondbBuf.maxClockError = 0; iondbBuf.clockIsSynchronized = 1; memcpy(&iondbBuf.parmcopy, parms, sizeof(IonParms)); iondbObject = sdr_malloc(ionsdr, sizeof(IonDB)); if (iondbObject == 0) { sdr_cancel_xn(ionsdr); putErrmsg("No space for database.", NULL); return -1; } sdr_write(ionsdr, iondbObject, (char *) &iondbBuf, sizeof(IonDB)); sdr_catlg(ionsdr, _iondbName(), 0, iondbObject); if (sdr_end_xn(ionsdr)) { putErrmsg("Can't create ION database.", NULL); return -1; } break; default: /* Found DB in the SDR. */ sdr_exit_xn(ionsdr); } oK(_iondbObject(&iondbObject)); oK(_ionConstants()); /* Open ION shared-memory partition. */ ionwmParms.wmKey = parms->wmKey; ionwmParms.wmSize = parms->wmSize; ionwmParms.wmAddress = parms->wmAddress; ionwmParms.wmName = ION_SM_NAME; if (_ionwm(&ionwmParms) == NULL) { putErrmsg("ION memory configuration failed.", NULL); return -1; } if (_ionvdb(&ionvdbName) == NULL) { putErrmsg("ION can't initialize vdb.", NULL); return -1; } zco_register_callback(notify); ionRedirectMemos(); #ifdef mingw DWORD threadId; HANDLE thread = CreateThread(NULL, 0, waitForSigterm, NULL, 0, &threadId); if (thread == NULL) { putErrmsg("Can't create sigterm thread.", utoa(GetLastError())); } else { CloseHandle(thread); } #endif return 0; }
int ionLocked() { return sdr_in_xn(_ionsdr(NULL)); /* Boolean. */ }
static IonVdb *_ionvdb(char **name) { static IonVdb *vdb = NULL; PsmAddress vdbAddress; PsmAddress elt; Sdr sdr; PsmPartition ionwm; if (name) { if (*name == NULL) /* Terminating. */ { vdb = NULL; return vdb; } /* Attaching to volatile database. */ ionwm = _ionwm(NULL); if (psm_locate(ionwm, *name, &vdbAddress, &elt) < 0) { putErrmsg("Failed searching for vdb.", NULL); return vdb; } if (elt) { vdb = (IonVdb *) psp(ionwm, vdbAddress); return vdb; } /* ION volatile database doesn't exist yet. */ sdr = _ionsdr(NULL); sdr_begin_xn(sdr); /* Just to lock memory. */ vdbAddress = psm_zalloc(ionwm, sizeof(IonVdb)); if (vdbAddress == 0) { sdr_exit_xn(sdr); putErrmsg("No space for volatile database.", NULL); return NULL; } vdb = (IonVdb *) psp(ionwm, vdbAddress); memset((char *) vdb, 0, sizeof(IonVdb)); if ((vdb->nodes = sm_list_create(ionwm)) == 0 || (vdb->neighbors = sm_list_create(ionwm)) == 0 || (vdb->probes = sm_list_create(ionwm)) == 0 || psm_catlg(ionwm, *name, vdbAddress) < 0) { sdr_exit_xn(sdr); putErrmsg("Can't initialize volatile database.", NULL); return NULL; } vdb->deltaFromUTC = (_ionConstants())->deltaFromUTC; sdr_exit_xn(sdr); /* Unlock memory. */ } return vdb; }
int ionAttach() { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); PsmPartition ionwm = _ionwm(NULL); IonVdb *ionvdb = _ionvdb(NULL); char *wdname; char wdnamebuf[256]; IonParms parms; sm_WmParms ionwmParms; char *ionvdbName = _ionvdbName(); if (ionsdr && iondbObject && ionwm && ionvdb) { return 0; /* Already attached. */ } if (sdr_initialize(0, NULL, SM_NO_KEY, NULL) < 0) { putErrmsg("Can't initialize the SDR system.", NULL); return -1; } wdname = getenv("ION_NODE_WDNAME"); if (wdname == NULL) { if (igetcwd(wdnamebuf, 256) == NULL) { putErrmsg("Can't get cwd name.", NULL); return -1; } wdname = wdnamebuf; } memset((char *) &parms, 0, sizeof parms); if (checkNodeListParms(&parms, wdname, 0) < 0) { putErrmsg("Failed checking node list parms.", NULL); return -1; } if (ionsdr == NULL) { ionsdr = sdr_start_using(parms.sdrName); if (ionsdr == NULL) { putErrmsg("Can't start using SDR for ION.", NULL); return -1; } oK(_ionsdr(&ionsdr)); } if (iondbObject == 0) { sdr_begin_xn(ionsdr); /* Lock database. */ iondbObject = sdr_find(ionsdr, _iondbName(), NULL); sdr_exit_xn(ionsdr); /* Unlock database. */ if (iondbObject == 0) { putErrmsg("ION database not found.", NULL); return -1; } oK(_iondbObject(&iondbObject)); } oK(_ionConstants()); /* Open ION shared-memory partition. */ if (ionwm == NULL) { ionwmParms.wmKey = parms.wmKey; ionwmParms.wmSize = 0; ionwmParms.wmAddress = NULL; ionwmParms.wmName = ION_SM_NAME; ionwm = _ionwm(&ionwmParms); if (ionwm == NULL) { putErrmsg("Can't open access to ION memory.", NULL); return -1; } } if (ionvdb == NULL) { if (_ionvdb(&ionvdbName) == NULL) { putErrmsg("ION volatile database not found.", NULL); return -1; } } ionRedirectMemos(); return 0; }
int ionAttach() { Sdr ionsdr = _ionsdr(NULL); Object iondbObject = _iondbObject(NULL); PsmPartition ionwm = _ionwm(NULL); IonVdb *ionvdb = _ionvdb(NULL); char *wdname; char wdnamebuf[256]; IonParms parms; sm_WmParms ionwmParms; char *ionvdbName = _ionvdbName(); ZcoCallback notify = ionOfferZcoSpace; if (ionsdr && iondbObject && ionwm && ionvdb) { return 0; /* Already attached. */ } #ifdef mingw if (_winsock(0) < 0) { return -1; } signal(SIGINT, SIG_IGN); #endif if (sdr_initialize(0, NULL, SM_NO_KEY, NULL) < 0) { putErrmsg("Can't initialize the SDR system.", NULL); return -1; } wdname = getenv("ION_NODE_WDNAME"); if (wdname == NULL) { if (igetcwd(wdnamebuf, 256) == NULL) { putErrmsg("Can't get cwd name.", NULL); return -1; } wdname = wdnamebuf; } memset((char *) &parms, 0, sizeof parms); if (checkNodeListParms(&parms, wdname, 0) < 0) { putErrmsg("Failed checking node list parms.", NULL); return -1; } if (ionsdr == NULL) { ionsdr = sdr_start_using(parms.sdrName); if (ionsdr == NULL) { putErrmsg("Can't start using SDR for ION.", NULL); return -1; } oK(_ionsdr(&ionsdr)); } if (iondbObject == 0) { if (sdr_heap_is_halted(ionsdr)) { iondbObject = sdr_find(ionsdr, _iondbName(), NULL); } else { CHKERR(sdr_begin_xn(ionsdr)); iondbObject = sdr_find(ionsdr, _iondbName(), NULL); sdr_exit_xn(ionsdr); } if (iondbObject == 0) { putErrmsg("ION database not found.", NULL); return -1; } oK(_iondbObject(&iondbObject)); } oK(_ionConstants()); /* Open ION shared-memory partition. */ if (ionwm == NULL) { ionwmParms.wmKey = parms.wmKey; ionwmParms.wmSize = 0; ionwmParms.wmAddress = NULL; ionwmParms.wmName = ION_SM_NAME; ionwm = _ionwm(&ionwmParms); if (ionwm == NULL) { putErrmsg("Can't open access to ION memory.", NULL); return -1; } } if (ionvdb == NULL) { if (_ionvdb(&ionvdbName) == NULL) { putErrmsg("ION volatile database not found.", NULL); return -1; } } zco_register_callback(notify); ionRedirectMemos(); #ifdef mingw DWORD threadId; HANDLE thread = CreateThread(NULL, 0, waitForSigterm, NULL, 0, &threadId); if (thread == NULL) { putErrmsg("Can't create sigterm thread.", utoa(GetLastError())); } else { CloseHandle(thread); } #endif return 0; }