本文整理汇总了C++中pthread_self函数的典型用法代码示例。如果您正苦于以下问题:C++ pthread_self函数的具体用法?C++ pthread_self怎么用?C++ pthread_self使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pthread_self函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: main
int
main()
{
int failed = 0;
int i;
pthread_t t[NUMTHREADS + 1];
assert((t[0] = pthread_self()).p != NULL);
for (i = 1; i <= NUMTHREADS; i++)
{
threadbag[i].started = 0;
threadbag[i].threadnum = i;
assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
}
/*
* Code to control or munipulate child threads should probably go here.
*/
Sleep(1000);
/*
* Standard check that all threads started.
*/
for (i = 1; i <= NUMTHREADS; i++)
{
if (!threadbag[i].started)
{
failed |= !threadbag[i].started;
fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
}
}
assert(!failed);
/*
* Check any results here. Set "failed" and only print output on failure.
*/
failed = 0;
for (i = 1; i <= NUMTHREADS; i++)
{
int fail = 0;
int result = 0;
assert(pthread_join(t[i], (void **) &result) == 0);
fail = (result != 0);
if (fail)
{
fprintf(stderr, "Thread %d: started %d: result: %d\n",
i,
threadbag[i].started,
result);
}
failed = (failed || fail);
}
assert(!failed);
assert(pop_count == NUMTHREADS);
/*
* Success.
*/
return 0;
}
开发者ID:iocroblab,项目名称:fril,代码行数:67,代码来源:cleanup2.c
示例2: thr_demarshal
// Set of threads which talk to client over the connection for doing the needful
// processing. Note that once fd is assigned to a thread all the work on that fd
// is done by that thread. Fair fd usage is expected of the client. First thread
// is special - also does accept [listens for new connections]. It is the only
// thread which does it.
void *
thr_demarshal(void *arg)
{
cf_socket_cfg *s, *ls, *xs;
// Create my epoll fd, register in the global list.
struct epoll_event ev;
int nevents, i, n, epoll_fd;
cf_clock last_fd_print = 0;
#if defined(USE_SYSTEMTAP)
uint64_t nodeid = g_config.self_node;
#endif
// Early stage aborts; these will cause faults in process scope.
cf_assert(arg, AS_DEMARSHAL, CF_CRITICAL, "invalid argument");
s = &g_config.socket;
ls = &g_config.localhost_socket;
xs = &g_config.xdr_socket;
#ifdef USE_JEM
int orig_arena;
if (0 > (orig_arena = jem_get_arena())) {
cf_crash(AS_DEMARSHAL, "Failed to get original arena for thr_demarshal()!");
} else {
cf_info(AS_DEMARSHAL, "Saved original JEMalloc arena #%d for thr_demarshal()", orig_arena);
}
#endif
// Figure out my thread index.
pthread_t self = pthread_self();
int thr_id;
for (thr_id = 0; thr_id < MAX_DEMARSHAL_THREADS; thr_id++) {
if (0 != pthread_equal(g_demarshal_args->dm_th[thr_id], self))
break;
}
if (thr_id == MAX_DEMARSHAL_THREADS) {
cf_debug(AS_FABRIC, "Demarshal thread could not figure own ID, bogus, exit, fu!");
return(0);
}
// First thread accepts new connection at interface socket.
if (thr_id == 0) {
demarshal_file_handle_init();
epoll_fd = epoll_create(EPOLL_SZ);
if (epoll_fd == -1) {
cf_crash(AS_DEMARSHAL, "epoll_create(): %s", cf_strerror(errno));
}
memset(&ev, 0, sizeof (ev));
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;
ev.data.fd = s->sock;
if (0 > epoll_ctl(epoll_fd, EPOLL_CTL_ADD, s->sock, &ev)) {
cf_crash(AS_DEMARSHAL, "epoll_ctl(): %s", cf_strerror(errno));
}
cf_info(AS_DEMARSHAL, "Service started: socket %s:%d", s->addr, s->port);
if (ls->sock) {
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;
ev.data.fd = ls->sock;
if (0 > epoll_ctl(epoll_fd, EPOLL_CTL_ADD, ls->sock, &ev)) {
cf_crash(AS_DEMARSHAL, "epoll_ctl(): %s", cf_strerror(errno));
}
cf_info(AS_DEMARSHAL, "Service also listening on localhost socket %s:%d", ls->addr, ls->port);
}
if (xs->sock) {
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;
ev.data.fd = xs->sock;
if (0 > epoll_ctl(epoll_fd, EPOLL_CTL_ADD, xs->sock, &ev)) {
cf_crash(AS_DEMARSHAL, "epoll_ctl(): %s", cf_strerror(errno));
}
cf_info(AS_DEMARSHAL, "Service also listening on XDR info socket %s:%d", xs->addr, xs->port);
}
}
else {
epoll_fd = epoll_create(EPOLL_SZ);
if (epoll_fd == -1) {
cf_crash(AS_DEMARSHAL, "epoll_create(): %s", cf_strerror(errno));
}
}
g_demarshal_args->epoll_fd[thr_id] = epoll_fd;
cf_detail(AS_DEMARSHAL, "demarshal thread started: id %d", thr_id);
int id_cntr = 0;
//.........这里部分代码省略.........
开发者ID:XeCycle,项目名称:aerospike-server,代码行数:101,代码来源:thr_demarshal.c
示例3: CRYPTO_THREAD_get_current_id
CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void)
{
return pthread_self();
}
开发者ID:PeterMosmans,项目名称:openssl,代码行数:4,代码来源:threads_pthread.c
示例4: pthread_self
////////////////////////////////////////////////////////////
// static
XThreadID_pthread_t XLockPthreadMutex::sGetThreadID( void ) {
pthread_t pthid = pthread_self();
XThreadID_pthread_t idThread( pthid );
// DWORD idThread = (DWORD) pthid.p;
return idThread;
}
开发者ID:xahgo,项目名称:tama,代码行数:8,代码来源:XLockPThreadMutex.cpp
示例5: main
//Execute par le thread principal (controleur)
int main (int argc, char **argv)
{
if (argc != 6)
return EXIT_FAILIURE;
signal(SIGALRM, sigHandler);
std::string pathGrilleVide = argv[1];
std::string pathGrilleSolution = argv[2];
std::string pathArrivee = argv[3];
int tempsMax = atoi(argv[4]);
pathResultat = argv[5];
int grille[9][9];
int solution[9][9];
mainThread = pthread_self();
loadGrid(pathGrilleVide, grille);
// printGrid(grille);
loadGrid(pathGrilleSolution, solution);
// printGrid(solution);
for (int i = 0; i < 5; i++)
{
joueurs[i] == 0;
}
//creaation des thread joueur par defaut
joueurs[0] = new Joueur();
joueurs[1] = new Joueur();
joueurs[2] = new Joueur();
joueurs[0]->thread = new pthread_t();
joueurs[1]->thread = new pthread_t();
joueurs[2]->thread = new pthread_t();
int un=1;
int deux=2;
int trois=3;
pthread_create(joueurs[0]->thread, NULL, jouer, &un);
pthread_create(joueurs[1]->thread, NULL, jouer, &deux);
pthread_create(joueurs[2]->thread, NULL, jouer, &trois);
joueurs[0]->tid = 1;
joueurs[1]->tid = 2;
joueurs[2]->tid = 3;
joueurs[0]->etat = "Inconnu";
joueurs[1]->etat = "Inconnu";
joueurs[2]->etat = "Inconnu";
listeJoueurs.insert(std::pair<int, Joueur*>(joueurs[0]->tid, joueurs[0]));
listeJoueurs.insert(std::pair<int, Joueur*>(joueurs[1]->tid, joueurs[1]));
listeJoueurs.insert(std::pair<int, Joueur*>(joueurs[2]->tid, joueurs[2]));
// Creation des deux autres thread
pthread_t accueil_t;
pthread_t alarm_t;
pthread_create(&accueil_t, NULL, accueil, (void*)pathArrivee.c_str());
pthread_create(&alarm_t, NULL, minuterie, (void*)&tempsMax);
sem_init(&file1_sem, 0, 0);
int* empty = findEmpty(grille);
int col = 0, ln = 0;
do
{
//============================================================
// BOUCLE POUR TROUVER LES ZERO ET LES ENVOYER DANS LA FILE 1
if (empty == 0)
break;
if (pthread_mutex_trylock(&file1_lock) == 0)
{
// std::cout<<"je prend le mutex pour le broadcast"<<std::endl;
if (file1.size() < 4)
{
MessageCJ* msg = new MessageCJ();
msg->colonne = empty[0];
msg->ligne = empty[1];
bool duplicate = false;
std::queue<MessageCJ*> temp;
while(!file1.empty())
{
temp.push(new MessageCJ((*file1.front())));
file1.pop();
}
while(!temp.empty())
{
MessageCJ* tmpMsg = new MessageCJ((*temp.front()));
//.........这里部分代码省略.........
开发者ID:Alex-Rose,项目名称:TP-2610,代码行数:101,代码来源:sudoku.cpp
示例6: findLockInfo
/*
** Given a file descriptor, locate lockInfo and openCnt structures that
** describes that file descriptor. Create a new ones if necessary. The
** return values might be unset if an error occurs.
**
** Return the number of errors.
*/
static int findLockInfo(
int fd, /* The file descriptor used in the key */
struct lockInfo **ppLock, /* Return the lockInfo structure here */
struct openCnt **ppOpen /* Return the openCnt structure here */
){
int rc;
struct lockKey key1;
struct openKey key2;
struct stat statbuf;
struct lockInfo *pLock;
struct openCnt *pOpen;
rc = fstat(fd, &statbuf);
if( rc!=0 ) return 1;
memset(&key1, 0, sizeof(key1));
key1.dev = statbuf.st_dev;
key1.ino = statbuf.st_ino;
#ifdef SQLITE_UNIX_THREADS
if( threadsOverrideEachOthersLocks<0 ){
testThreadLockingBehavior(fd);
}
key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
#endif
memset(&key2, 0, sizeof(key2));
key2.dev = statbuf.st_dev;
key2.ino = statbuf.st_ino;
pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1));
if( pLock==0 ){
struct lockInfo *pOld;
pLock = (lockInfo*)sqliteMallocRaw( sizeof(*pLock) );
if( pLock==0 ) return 1;
pLock->key = key1;
pLock->nRef = 1;
pLock->cnt = 0;
pLock->locktype = 0;
pOld = (lockInfo*)sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock);
if( pOld!=0 ){
assert( pOld==pLock );
sqliteFree(pLock);
return 1;
}
}else{
pLock->nRef++;
}
*ppLock = pLock;
pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2));
if( pOpen==0 ){
struct openCnt *pOld;
pOpen = (openCnt*)sqliteMallocRaw( sizeof(*pOpen) );
if( pOpen==0 ){
releaseLockInfo(pLock);
return 1;
}
pOpen->key = key2;
pOpen->nRef = 1;
pOpen->nLock = 0;
pOpen->nPending = 0;
pOpen->aPending = 0;
pOld = (openCnt*)sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen);
if( pOld!=0 ){
assert( pOld==pOpen );
sqliteFree(pOpen);
releaseLockInfo(pLock);
return 1;
}
}else{
pOpen->nRef++;
}
*ppOpen = pOpen;
return 0;
}
开发者ID:huangyt,项目名称:foundations.github.com,代码行数:77,代码来源:os_unix.c
示例7: ldap_pvt_thread_self
ldap_pvt_thread_t ldap_pvt_thread_self( void )
{
return pthread_self();
}
开发者ID:jaredmcneill,项目名称:netbsd-src,代码行数:4,代码来源:thr_posix.c
示例8: main
int
main()
{
int failed = 0;
int i;
int first, last;
pthread_t t[NUMTHREADS + 1];
#if (defined(__MINGW64__) || defined(__MINGW32__)) && __MSVCRT_VERSION__ >= 0x0601
struct __timeb64 currSysTime;
#else
struct _timeb currSysTime;
#endif
const DWORD NANOSEC_PER_MILLISEC = 1000000;
assert((t[0] = pthread_self()).p != NULL);
assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
PTW32_FTIME(&currSysTime);
abstime.tv_sec = (long)currSysTime.time;
abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
abstime.tv_sec += 10;
assert((t[0] = pthread_self()).p != NULL);
awoken = 0;
for (first = 1, last = NUMTHREADS / 2;
first < NUMTHREADS;
first = last + 1, last = NUMTHREADS)
{
assert(pthread_mutex_lock(&start_flag) == 0);
for (i = first; i <= last; i++)
{
threadbag[i].started = 0;
threadbag[i].threadnum = i;
assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
}
/*
* Code to control or munipulate child threads should probably go here.
*/
cvthing.shared = 0;
assert(pthread_mutex_unlock(&start_flag) == 0);
/*
* Give threads time to start.
*/
Sleep(100);
assert(pthread_mutex_lock(&cvthing.lock) == 0);
cvthing.shared++;
assert(pthread_mutex_unlock(&cvthing.lock) == 0);
assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
/*
* Give threads time to complete.
*/
for (i = first; i <= last; i++)
{
assert(pthread_join(t[i], NULL) == 0);
}
assert(awoken == (i - 1));
}
/*
* Standard check that all threads started.
*/
for (i = 1; i <= NUMTHREADS; i++)
{
failed = !threadbag[i].started;
if (failed)
{
fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
}
}
/*
* Cleanup the CV.
*/
assert(pthread_mutex_destroy(&cvthing.lock) == 0);
assert(cvthing.lock == NULL);
assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
assert(cvthing.notbusy == NULL);
//.........这里部分代码省略.........
开发者ID:VFR-maniac,项目名称:pthreads-win32,代码行数:101,代码来源:condvar8.c
示例9: Pthread_self
pthread_t Pthread_self(void) {
return pthread_self();
}
开发者ID:PoojaManglaCMU,项目名称:ProxyServerwithMultithreading,代码行数:3,代码来源:csapp.c
示例10: osThreadId
OSThreadId
osThreadId()
{
return pthread_self();
}
开发者ID:ygmpkk,项目名称:house,代码行数:5,代码来源:OSThreads.c
示例11: bs_errors
static void bs_errors (const char * msg) {
// we normally do not care to print all messages from blobstore as many are errors that we can handle
logprintfl (EUCADEBUG2, "{%u} blobstore: %s", (unsigned int)pthread_self(), msg);
}
开发者ID:EucalyptusSystems,项目名称:eucalyptus,代码行数:4,代码来源:backing.c
示例12: pthread_self
void *DemodulatorPreThread::threadMain() {
#else
void DemodulatorPreThread::threadMain() {
#endif
#ifdef __APPLE__
pthread_t tID = pthread_self(); // ID of this thread
int priority = sched_get_priority_max( SCHED_FIFO) - 1;
sched_param prio = {priority}; // scheduling priority of thread
pthread_setschedparam(tID, SCHED_FIFO, &prio);
#endif
if (!initialized) {
initialize();
}
std::cout << "Demodulator preprocessor thread started.." << std::endl;
std::deque<DemodulatorThreadPostIQData *> buffers;
std::deque<DemodulatorThreadPostIQData *>::iterator buffers_i;
std::vector<liquid_float_complex> in_buf_data;
std::vector<liquid_float_complex> out_buf_data;
// liquid_float_complex carrySample; // Keep the stream count even to simplify some demod operations
// bool carrySampleFlag = false;
terminated = false;
while (!terminated) {
DemodulatorThreadIQData *inp;
iqInputQueue->pop(inp);
bool bandwidthChanged = false;
bool rateChanged = false;
DemodulatorThreadParameters tempParams = params;
if (!commandQueue->empty()) {
while (!commandQueue->empty()) {
DemodulatorThreadCommand command;
commandQueue->pop(command);
switch (command.cmd) {
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_SET_BANDWIDTH:
if (command.llong_value < 1500) {
command.llong_value = 1500;
}
if (command.llong_value > params.sampleRate) {
tempParams.bandwidth = params.sampleRate;
} else {
tempParams.bandwidth = command.llong_value;
}
bandwidthChanged = true;
break;
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_SET_FREQUENCY:
params.frequency = tempParams.frequency = command.llong_value;
break;
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_SET_AUDIO_RATE:
tempParams.audioSampleRate = (int)command.llong_value;
rateChanged = true;
break;
default:
break;
}
}
}
if (inp->sampleRate != tempParams.sampleRate && inp->sampleRate) {
tempParams.sampleRate = inp->sampleRate;
rateChanged = true;
}
if (bandwidthChanged || rateChanged) {
DemodulatorWorkerThreadCommand command(DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_BUILD_FILTERS);
command.sampleRate = tempParams.sampleRate;
command.audioSampleRate = tempParams.audioSampleRate;
command.bandwidth = tempParams.bandwidth;
command.frequency = tempParams.frequency;
workerQueue->push(command);
}
if (!initialized) {
continue;
}
// Requested frequency is not center, shift it into the center!
if ((params.frequency - inp->frequency) != shiftFrequency || rateChanged) {
shiftFrequency = params.frequency - inp->frequency;
if (abs(shiftFrequency) <= (int) ((double) (wxGetApp().getSampleRate() / 2) * 1.5)) {
nco_crcf_set_frequency(freqShifter, (2.0 * M_PI) * (((double) abs(shiftFrequency)) / ((double) wxGetApp().getSampleRate())));
}
}
if (abs(shiftFrequency) > (int) ((double) (wxGetApp().getSampleRate() / 2) * 1.5)) {
continue;
}
// std::lock_guard < std::mutex > lock(inp->m_mutex);
std::vector<liquid_float_complex> *data = &inp->data;
if (data->size() && (inp->sampleRate == params.sampleRate)) {
int bufSize = data->size();
//.........这里部分代码省略.........
开发者ID:95rangerxlt,项目名称:CubicSDR,代码行数:101,代码来源:DemodulatorPreThread.cpp
示例13: return
unsigned long SSLSupport::getThreadID(void)
{
return ((unsigned long) pthread_self());
}
开发者ID:dkirker,项目名称:BrowserServer,代码行数:4,代码来源:SSLSupport.cpp
示例14: fvl_srio_recver
static void fvl_srio_recver(void *arg)
{
fvl_tcp_socket_t tcp;
fvl_thread_arg_t *priv=arg;
fvl_srio_portpool_t *ppool;
fvl_srio_ctrlblk_t *pscb;
in_addr_t tcp_ip;
int tcp_port;
int rvl;
volatile fvl_srio_ctl_info_t *pcnt;
volatile fvl_srio_ctl_info_t *pclt;
fvl_srio_ctl_info_t packet_info;
fvl_srio_ctl_info_t test_info;
uint8_t *buf_virt;
uint32_t port;
uint32_t bfnum;
uint64_t *head_virt;
uint64_t head_phys;
uint64_t head_dest;
uint8_t ctl_count=1;
uint16_t send_size = sizeof(fvl_srio_ctl_info_t);
uint8_t i;
struct timeval tm_start,tm_end;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(priv->cpu,&cpuset);
rvl = pthread_setaffinity_np(pthread_self(),sizeof(cpu_set_t),&cpuset);
if(rvl) {
printf("(%d)fail:pthread_setaffinity_np()\n",priv->cpu);
return;
}
tcp_ip = inet_addr("192.168.10.20");
tcp_port = 5000;
/* rvl = fvl_tcp_init(&tcp, tcp_ip, tcp_port);
if(rvl < 0) {
FVL_LOG("fvl_tcp_init failed, return %d\n", rvl);
return;
}*/
port = priv->port;
if(port >= FVL_SRIO_PORTNUM) {
FVL_LOG("Invalid port num: %u\n", port);
return;
}
bfnum = priv->bfnum;
ppool = &priv->psrio->portpool[port];
pscb = fvl_srio_getcb(port,bfnum);
if(pscb == NULL) {
FVL_LOG("Srio getcb failed\n");
return;
}
head_virt = (uint64_t*)ppool->pwrite_ctl_data[bfnum];
head_phys = ppool->write_ctl_data[bfnum];
head_dest = ppool->port_info.range_start+FVL_SRIO_DMA_WINSIZE+bfnum*FVL_SRIO_CTL_BUFSIZE;//important
pcnt = (fvl_srio_ctl_info_t *)ppool->pwrite_ctl_result[bfnum];
buf_virt = ppool->pwrite_result[bfnum];
pclt = pcnt;
bzero(&test_info,send_size);
test_info.FLA=0;
test_info.SET=0;
test_info.BIS=0;
#ifndef OLD_VERSION
test_info.RST=1;
test_info.CEN=0;
#endif
test_info.PK_ID=0;
test_info.SUB_BUF=0;
test_info.FCNT=0;
test_info.CH_ID=bfnum;
test_info.BUF_ADDR = 0;
test_info.BUF_SIZE = 1;
test_info.INFO_ADDR = 1;
memcpy(head_virt,&test_info,send_size);
fvl_srio_send(pscb, head_phys, head_dest, send_size);
usleep(5000);
bzero(&packet_info,send_size);
packet_info.FLA=0;
packet_info.SET=1;
packet_info.BIS=0;
#ifndef OLD_VERSION
packet_info.RST=0;
packet_info.CEN=0;
#endif
packet_info.PK_ID=1;
packet_info.SUB_BUF=0;
packet_info.FCNT = 0;
packet_info.CH_ID = bfnum;
packet_info.BUF_ADDR = FVL_SRIO_SYS_ADDR+bfnum*FVL_SRIO_DMA_BUFSIZE;
packet_info.BUF_SIZE = FVL_SRIO_DMA_BUFSIZE;
packet_info.INFO_ADDR = FVL_SRIO_CTL_ADDR +bfnum*FVL_SRIO_CTL_BUFSIZE;
memcpy(head_virt,&packet_info,send_size);
fvl_srio_send(pscb, head_phys, head_dest, send_size);
bzero(&test_info,send_size);
test_info.FLA=0;
test_info.SET=0;
test_info.BIS=0;
#ifndef OLD_VERSION
test_info.RST=0;
test_info.CEN=1;
#endif
//.........这里部分代码省略.........
开发者ID:Cai900205,项目名称:test,代码行数:101,代码来源:fvl_main.c
示例15: TRI_IsSelfThread
bool TRI_IsSelfThread (TRI_thread_t* thread) {
return pthread_self() == *thread;
}
开发者ID:gabe-alex,项目名称:arangodb,代码行数:3,代码来源:threads-posix.cpp
示例16: timing_initialize
void timing_initialize(void) {
#if !TESTING
assert(cpu_isPaused() || (pthread_self() == cpu_thread_id));
#endif
_timing_initialize(alt_speed_enabled ? cpu_altscale_factor : cpu_scale_factor);
}
开发者ID:jvernet,项目名称:apple2,代码行数:6,代码来源:timing.c
示例17: pthread_cancel
int
pthread_cancel (pthread_t thread)
/*
* ------------------------------------------------------
* DOCPUBLIC
* This function requests cancellation of 'thread'.
*
* PARAMETERS
* thread
* reference to an instance of pthread_t
*
*
* DESCRIPTION
* This function requests cancellation of 'thread'.
* NOTE: cancellation is asynchronous; use pthread_join to
* wait for termination of 'thread' if necessary.
*
* RESULTS
* 0 successfully requested cancellation,
* ESRCH no thread found corresponding to 'thread',
* ENOMEM implicit self thread create failed.
* ------------------------------------------------------
*/
{
int result;
int cancel_self;
pthread_t self;
ptw32_thread_t * tp;
result = pthread_kill (thread, 0);
if (0 != result)
{
return result;
}
if ((self = pthread_self ()).p == NULL)
{
return ENOMEM;
};
/*
* FIXME!!
*
* Can a thread cancel itself?
*
* The standard doesn't
* specify an error to be returned if the target
* thread is itself.
*
* If it may, then we need to ensure that a thread can't
* deadlock itself trying to cancel itself asyncronously
* (pthread_cancel is required to be an async-cancel
* safe function).
*/
cancel_self = pthread_equal (thread, self);
tp = (ptw32_thread_t *) thread.p;
/*
* Lock for async-cancel safety.
*/
(void) pthread_mutex_lock (&tp->cancelLock);
if (tp->cancelType == PTHREAD_CANCEL_ASYNCHRONOUS
&& tp->cancelState == PTHREAD_CANCEL_ENABLE
&& tp->state < PThreadStateCanceling)
{
if (cancel_self)
{
tp->state = PThreadStateCanceling;
tp->cancelState = PTHREAD_CANCEL_DISABLE;
(void) pthread_mutex_unlock (&tp->cancelLock);
ptw32_throw (PTW32_EPS_CANCEL);
/* Never reached */
}
else
{
HANDLE threadH = tp->threadH;
SuspendThread (threadH);
if (WaitForSingleObject (threadH, 0) == WAIT_TIMEOUT)
{
tp->state = PThreadStateCanceling;
tp->cancelState = PTHREAD_CANCEL_DISABLE;
/*
* If alertdrv and QueueUserAPCEx is available then the following
* will result in a call to QueueUserAPCEx with the args given, otherwise
* this will result in a call to ptw32_RegisterCancelation and only
* the threadH arg will be used.
*/
ptw32_register_cancelation (ptw32_cancel_callback, threadH, 0);
(void) pthread_mutex_unlock (&tp->cancelLock);
ResumeThread (threadH);
}
}
}
//.........这里部分代码省略.........
开发者ID:dangermanGls,项目名称:Lwdp,代码行数:101,代码来源:pthread_cancel.c
示例18: timing_toggleCPUSpeed
void timing_toggleCPUSpeed(void) {
assert(cpu_isPaused() || (pthread_self() == cpu_thread_id));
alt_speed_enabled = !alt_speed_enabled;
timing_initialize();
}
开发者ID:jvernet,项目名称:apple2,代码行数:5,代码来源:timing.c
示例19: w_start_listener
bool w_start_listener(const char *path)
{
pthread_mutexattr_t mattr;
#ifndef _WIN32
struct sigaction sa;
sigset_t sigset;
#endif
void *ignored;
#ifdef HAVE_LIBGIMLI_H
volatile struct gimli_heartbeat *hb = NULL;
#endif
struct timeval tv;
listener_thread = pthread_self();
pthread_mutexattr_init(&mattr);
pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&w_client_lock, &mattr);
pthread_mutexattr_destroy(&mattr);
#ifdef HAVE_LIBGIMLI_H
hb = gimli_heartbeat_attach();
#endif
#if defined(HAVE_KQUEUE) || defined(HAVE_FSEVENTS)
{
struct rlimit limit;
# ifndef __OpenBSD__
int mib[2] = { CTL_KERN,
# ifdef KERN_MAXFILESPERPROC
KERN_MAXFILESPERPROC
# else
KERN_MAXFILES
# endif
};
# endif
int maxperproc;
getrlimit(RLIMIT_NOFILE, &limit);
# ifndef __OpenBSD__
{
size_t len;
len = sizeof(maxperproc);
sysctl(mib, 2, &maxperproc, &len, NULL, 0);
w_log(W_LOG_ERR, "file limit is %" PRIu64
" kern.maxfilesperproc=%i\n",
limit.rlim_cur, maxperproc);
}
# else
maxperproc = limit.rlim_max;
w_log(W_LOG_ERR, "openfiles-cur is %" PRIu64
" openfiles-max=%i\n",
limit.rlim_cur, maxperproc);
# endif
if (limit.rlim_cur != RLIM_INFINITY &&
maxperproc > 0 &&
limit.rlim_cur < (rlim_t)maxperproc) {
limit.rlim_cur = maxperproc;
if (setrlimit(RLIMIT_NOFILE, &limit)) {
w_log(W_LOG_ERR,
"failed to raise limit to %" PRIu64 " (%s).\n",
limit.rlim_cur,
strerror(errno));
} else {
w_log(W_LOG_ERR,
"raised file limit to %" PRIu64 "\n",
limit.rlim_cur);
}
}
getrlimit(RLIMIT_NOFILE, &limit);
#ifndef HAVE_FSEVENTS
if (limit.rlim_cur < 10240) {
w_log(W_LOG_ERR,
"Your file descriptor limit is very low (%" PRIu64 "), "
"please consult the watchman docs on raising the limits\n",
limit.rlim_cur);
}
#endif
}
#endif
proc_pid = (int)getpid();
if (gettimeofday(&tv, NULL) == -1) {
w_log(W_LOG_ERR, "gettimeofday failed: %s\n", strerror(errno));
return false;
}
proc_start_time = (uint64_t)tv.tv_sec;
#ifndef _WIN32
signal(SIGPIPE, SIG_IGN);
/* allow SIGUSR1 and SIGCHLD to wake up a blocked thread, without restarting
* syscalls */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = wakeme;
//.........这里部分代码省略.........
开发者ID:hardiku,项目名称:watchman,代码行数:101,代码来源:listener.c
示例20: assert
static void *cpu_thread(void *dummyptr) {
assert(pthread_self() == cpu_thread_id);
LOG("cpu_thread : initialized...");
struct timespec deltat;
#if !MOBILE_DEVICE
struct timespec disk_motor_time;
#endif
struct timespec t0; // the target timer
struct timespec ti, tj; // actual time samples
bool negative = false;
long drift_adj_nsecs = 0; // generic drift adjustment between target and actual
int debugging_cycles0 = 0;
int debugging_cycles = 0;
#if DEBUG_TIMING
unsigned long dbg_ticks = 0;
int speaker_neg_feedback = 0;
int speaker_pos_feedback = 0;
unsigned int dbg_cycles_executed = 0;
#endif
do
{
#ifdef AUDIO_ENABLED
LOG("CPUTHREAD %lu LOCKING FOR MAYBE INITIALIZING AUDIO ...", cpu_thread_id);
pthread_mutex_lock(&interface_mutex);
if (emul_reinitialize_audio) {
emul_reinitialize_audio = false;
speaker_destroy();
MB_Destroy();
audio_shutdown();
audio_init();
speaker_init();
MB_Initialize();
}
pthread_mutex_unlock(&interface_mutex);
LOG("UNLOCKING FOR MAYBE INITIALIZING AUDIO ...");
#endif
if (emul_reinitialize) {
reinitialize();
}
LOG("cpu_thread : begin main loop ...");
clock_gettime(CLOCK_MONOTONIC, &t0);
do {
SCOPE_TRACE_CPU("CPU mainloop");
// -LOCK----------------------------------------------------------------------------------------- SAMPLE ti
#ifdef AUDIO_ENABLED
if (UNLIKELY(emul_pause_audio)) {
emul_pause_audio = false;
audio_pause();
}
#endif
pthread_mutex_lock(&interface_mutex);
#ifdef AUDIO_ENABLED
if (UNLIKELY(emul_resume_audio)) {
emul_resume_audio = false;
audio_resume();
}
#endif
clock_gettime(CLOCK_MONOTONIC, &ti);
deltat = timespec_diff(t0, ti, &negative);
if (deltat.tv_sec)
{
if (!is_fullspeed) {
TIMING_LOG("NOTE : serious divergence from target time ...");
}
t0 = ti;
deltat = timespec_diff(t0, ti, &negative);
}
t0 = timespec_add(t0, EXECUTION_PERIOD_NSECS); // expected interval
drift_adj_nsecs = negative ? ~deltat.tv_nsec : deltat.tv_nsec;
// set up increment & decrement counters
cpu65_cycles_to_execute = (cycles_persec_target / 1000); // cycles_persec_target * EXECUTION_PERIOD_NSECS / NANOSECONDS_PER_SECOND
if (!is_fullspeed) {
cpu65_cycles_to_execute += cycles_speaker_feedback;
}
if (cpu65_cycles_to_execute < 0)
{
cpu65_cycles_to_execute = 0;
}
#ifdef AUDIO_ENABLED
MB_StartOfCpuExecute();
#endif
if (is_debugging) {
debugging_cycles0 = cpu65_cycles_to_execute;
debugging_cycles = cpu65_cycles_to_execute;
}
//.........这里部分代码省略.........
开发者ID:jvernet,项目名称:apple2,代码行数:101,代码来源:timing.c
注:本文中的pthread_self函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论