static void TEST_CORE_Lock(void) { /* MT_LOCK API */ MT_LOCK x_lock; /* dummy */ TEST_CORE_LockUserData = 111; x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData, 0, TEST_CORE_LockCleanup); assert(x_lock); verify(MT_LOCK_AddRef(x_lock) == x_lock); verify(MT_LOCK_AddRef(x_lock) == x_lock); verify(MT_LOCK_Delete(x_lock) == x_lock); assert(TEST_CORE_LockUserData == 111); verify(MT_LOCK_Do(x_lock, eMT_LockRead)); verify(MT_LOCK_Do(x_lock, eMT_Lock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Delete(x_lock) == x_lock); assert(TEST_CORE_LockUserData == 111); verify(MT_LOCK_Delete(x_lock) == 0); assert(TEST_CORE_LockUserData == 222); /* real */ x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData, TEST_CORE_LockHandler, TEST_CORE_LockCleanup); assert(x_lock); /* NB: Write after read is not usually an allowed lock nesting */ verify(MT_LOCK_Do(x_lock, eMT_LockRead)); verify(MT_LOCK_Do(x_lock, eMT_Lock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); /* Read after write is usually okay */ verify(MT_LOCK_Do(x_lock, eMT_Lock)); verify(MT_LOCK_Do(x_lock, eMT_LockRead)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); /* Try-locking sequence */ verify(MT_LOCK_Do(x_lock, eMT_TryLock)); verify(MT_LOCK_Do(x_lock, eMT_TryLockRead)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Do(x_lock, eMT_Unlock)); verify(MT_LOCK_Delete(x_lock) == 0); }
/// Initializes the C++ style locking mechanism for BLAST. MT_LOCK Blast_CMT_LOCKInit() { CFastMutex* mutex = new CFastMutex(); MT_LOCK lock = MT_LOCK_Create((void*)mutex, BlastLockHandler, BlastLockCleanup); return lock; }
MT_LOCK Blast_MT_LOCKInit() { MT_LOCK lock; TNlmMutex results_mutex = NULL; results_mutex = NlmMutexInit(&results_mutex); lock = MT_LOCK_Create((void*)results_mutex, CollectorLockHandler, CollectorLockCleanup); return lock; }
/* Main function * Parse command-line options, initialize and cleanup API internals; * run client or server test */ extern int main(int argc, const char* argv[]) { /* Setup log stream */ CORE_SetLOGFormatFlags(fLOG_None | fLOG_Level | fLOG_OmitNoteLevel | fLOG_DateTime); CORE_SetLOGFILE(stderr, 0/*false*/); /* Parse cmd.-line args and decide whether it's a client or a server */ switch ( argc ) { case 1: /*** Try to set various fake MT safety locks ***/ CORE_SetLOCK( MT_LOCK_Create(0, TEST_LockHandler, TEST_LockCleanup) ); CORE_SetLOCK(0); CORE_SetLOCK(0); CORE_SetLOCK( MT_LOCK_Create(&TEST_LockUserData, TEST_LockHandler, TEST_LockCleanup) ); SOCK_SetDataLoggingAPI(eOn); assert(SOCK_InitializeAPI() == eIO_Success); SOCK_SetDataLoggingAPI(eOff); {{ char local_host[64]; assert(SOCK_gethostname(local_host, sizeof(local_host)) == 0); CORE_LOGF(eLOG_Note, ("Running NCBISOCK test on host \"%s\"", local_host)); }} TEST_gethostby(); TEST_SOCK_isip(); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOCK(0); break; case 2: { /*** SERVER ***/ TEST__server(argv[1]); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOG(0); return 0; } case 3: case 4: { /*** CLIENT ***/ const char* host; unsigned short port; STimeout* tmo; STimeout x_tmo; /* host */ host = argv[1]; /* port */ if (sscanf(argv[2], "%hu", &port) != 1) break; /* timeout */ if (argc == 4) { double v; char* e = (char*) argv[3]; if (!*e || (v = NCBI_simple_atof(e, &e)) < 0.0 || errno || *e) break; x_tmo.sec = (unsigned int) v; x_tmo.usec = (unsigned int)((v - x_tmo.sec) * 1000000.0); tmo = &x_tmo; } else tmo = 0/*infinite*/; TEST__client(host, port, tmo); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOG(0); return 0; } } /* switch */ /* USAGE */ fprintf(stderr, "\nClient/Server USAGE:\n" "Client: %s <host> <port> [timeout]\n" "Server: %s <port>\n\n", argv[0], argv[0]); CORE_SetLOG(0); return argc == 1 ? 0 : 1; }
/* Main function * Parse command-line options, initialize and cleanup API internals; * run client or server test */ extern int main(int argc, char** argv) { /* Setup log stream */ CORE_SetLOGFormatFlags(fLOG_None | fLOG_Level | fLOG_OmitNoteLevel | fLOG_DateTime); CORE_SetLOGFILE(stderr, 0/*false*/); /* Test client or server using hard-coded parameters */ #if defined(DO_SERVER) argc = 2; #elif defined(DO_CLIENT) argc = 3; #endif /* Parse cmd.-line args and decide whether it's a client or a server */ switch ( argc ) { case 1: /*** Try to set various fake MT safety locks ***/ CORE_SetLOCK( MT_LOCK_Create(0, TEST_LockHandler, TEST_LockCleanup) ); CORE_SetLOCK(0); CORE_SetLOCK(0); CORE_SetLOCK( MT_LOCK_Create(&TEST_LockUserData, TEST_LockHandler, TEST_LockCleanup) ); SOCK_SetDataLoggingAPI(eOn); assert(SOCK_InitializeAPI() == eIO_Success); SOCK_SetDataLoggingAPI(eOff); {{ char local_host[64]; assert(SOCK_gethostname(local_host, sizeof(local_host)) == 0); CORE_LOGF(eLOG_Note, ("Running NCBISOCK test on host \"%s\"", local_host)); }} TEST_gethostby(); TEST_SOCK_isip(); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOCK(0); break; case 2: { /*** SERVER ***/ int port; #if defined(DO_SERVER) port = DEF_PORT; #else if (sscanf(argv[1], "%d", &port) != 1 || port < MIN_PORT) break; #endif /* DO_SERVER */ TEST__server((unsigned short) port); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOG(0); return 0; } case 3: case 4: { /*** CLIENT ***/ const char* host; int port; STimeout* tmo; #if defined(DO_CLIENT) host = DEF_HOST; port = DEF_PORT; tmo = 0/*infinite*/; #else STimeout x_tmo; /* host */ host = argv[1]; /* port */ if (sscanf(argv[2], "%d", &port) != 1 || port < MIN_PORT) break; /* timeout */ if (argc == 4) { double val = atof(argv[3]); if (val < 0) break; x_tmo.sec = (unsigned int) val; x_tmo.usec = (unsigned int)((val - x_tmo.sec) * 1000000); tmo = &x_tmo; } else tmo = 0/*infinite*/; #endif /* DO_CLIENT */ TEST__client(host, (unsigned short) port, tmo); assert(SOCK_ShutdownAPI() == eIO_Success); CORE_SetLOG(0); return 0; } } /* switch */ /* USAGE */ fprintf(stderr, "\nClient/Server USAGE:\n" "Client: %s <host> <port> [timeout]\n" "Server: %s <port>\n" "where <port> is greater than %d, and [timeout] is a double\n\n", argv[0], argv[0], MIN_PORT); CORE_SetLOG(0); return argc == 1 ? 0 : 1; }
static void TEST_CORE_Log(void) { /* LOG */ LOG x_log; /* protective MT-lock */ MT_LOCK x_lock; /* ELOG_Level, LOG_LevelStr() */ int x_level; for (x_level = 0; x_level <= (int) eLOG_Fatal; x_level++) { switch ( (ELOG_Level) x_level ) { case eLOG_Trace: case eLOG_Note: case eLOG_Warning: case eLOG_Error: case eLOG_Critical: case eLOG_Fatal: assert(LOG_LevelStr((ELOG_Level) x_level)); printf("LOG_LevelStr(level = %d): \"%s\"\n", x_level, LOG_LevelStr((ELOG_Level) x_level)); break; default: assert(0); } } /* LOG API */ /* MT-lock */ x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData, TEST_CORE_LockHandler, TEST_CORE_LockCleanup); /* dummy */ TEST_CORE_LogUserData = 1; x_log = LOG_Create(&TEST_CORE_LogUserData, TEST_CORE_LogHandler, TEST_CORE_LogCleanup, x_lock); assert(x_log); verify(LOG_AddRef(x_log) == x_log); verify(LOG_AddRef(x_log) == x_log); verify(LOG_Delete(x_log) == x_log); assert(TEST_CORE_LogUserData == 1); LOG_WRITE(0, 0, 0, eLOG_Trace, 0); LOG_Write(0, 0, 0, eLOG_Trace, 0, 0, 0, 0, 0, 0); LOG_WRITE(x_log, 0, 0, eLOG_Trace, 0); LOG_Write(x_log, 0, 0, eLOG_Trace, 0, 0, 0, 0, 0, 0); verify(LOG_Delete(x_log) == x_log); assert(TEST_CORE_LogUserData == 1); /* reset to "real" logging */ LOG_Reset(x_log, &TEST_CORE_LogUserData, TEST_CORE_LogHandler, TEST_CORE_LogCleanup); assert(TEST_CORE_LogUserData == 444); TEST_CORE_LogUserData = 2; /* do the test logging */ LOG_WRITE(x_log, 0, 0, eLOG_Trace, 0); LOG_Write(x_log, 0, 0, eLOG_Trace, 0, 0, 0, 0, 0, 0); LOG_WRITE(x_log, 0, 0, eLOG_Warning, ""); /* LOG_WRITE(x_log, eLOG_Fatal, "Something fatal"); */ #undef THIS_MODULE #define THIS_MODULE "FooModuleName" LOG_WRITE(x_log, 0, 0, eLOG_Error, "With changed module name"); #undef THIS_FILE #define THIS_FILE "BarFileName" LOG_WRITE(x_log, 0, 0, eLOG_Critical, "With changed module and file name"); #undef THIS_FILE #define THIS_FILE __FILE__ #undef THIS_MODULE #define THIS_MODULE 0 /* delete */ verify(LOG_Delete(x_log) == 0); assert(TEST_CORE_LogUserData == 444); }