ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/users_40.htm

216 lines
6.2 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>pthread_cleanup_peek_np()--Copy Cleanup Handler from Cancellation
Cleanup Stack</title>
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- Begin Header Records ========================================== -->
<!-- NETMG2 SCRIPT A converted by B2H R4.1 (346) (CMS) by HOLTJM at -->
<!-- RCHVMW2 on 29 Jan 1999 at 10:01:37 -->
<!--File Edited November 2001 -->
<!--End Header Records -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<!-- Java sync-link -->
<script language="Javascript" src="../rzahg/synch.js" type="text/javascript">
</script>
<a name="Top_Of_Page"></a>
<h2>pthread_cleanup_peek_np()--Copy Cleanup Handler from Cancellation Cleanup
Stack</h2>
<div class="box" style="width: 70%;">
<br>
&nbsp;&nbsp;Syntax:
<pre>
#include &lt;pthread.h&gt;
int pthread_cleanup_peek_np(pthread_cleanup_entry_np_t *entry);
</pre>
&nbsp;&nbsp;Service Program Name: QP0WPTHR<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: Yes<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Signal Safe: Yes<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The <strong>pthread_cleanup_peek_np</strong>() function returns a copy of
the cleanup handler entry that the next call to
<strong>pthread_cleanup_pop</strong>() would pop. The handler remains on the
cancellation cleanup stack after the call to
<strong>pthread_cleanup_peek_np</strong>().</p>
<p>During this thread cancellation cleanup, the thread calls cancellation
cleanup handlers with cancellation disabled until the last cancellation cleanup
handler returns. The handlers are called in Last In, First Out (LIFO) order.
Automatic storage for the invocation stack frame of the function that
registered the handler is still present when the cancellation cleanup handler
is executed.</p>
<p>The <strong>pthread_cleanup_push</strong>() and the matching
<strong>pthread_cleanup_pop</strong>() call should be in the same lexical scope
(that is, same level of brackets {}).</p>
<p>The <strong>pthread_cleanup_peek_np</strong>() function has no scoping
rules.</p>
<p><strong>Note:</strong> This function is not portable.</p>
<br>
<h3>Authorities and Locks</h3>
<p>None.</p>
<br>
<h3>Parameters</h3>
<p>None.</p>
<br>
<h3>Return Value</h3>
<dl>
<dt><strong>0</strong></dt>
<dd><strong>pthread_cleanup_peek_np</strong>() was successful.<br><br></dd>
<dt><strong>value</strong></dt>
<dd><strong>pthread_cleanup_peek_np</strong>() was not successful.
<em>value</em> is set to indicate the error condition.</dd>
</dl>
<br>
<h3>Error Conditions</h3>
<p>If <strong>pthread_cleanup_peek_np</strong>() was not successful, the error
condition returned usually indicates one of the following errors. Under some
conditions, the value returned could indicate an error other than those listed
here.</p>
<dl>
<dt><em>[EINVAL]</em></dt>
<dd><p>The value specified for the argument is not correct.</p></dd>
<dt><em>[ENOENT]</em></dt>
<dd><p>The cancellation cleanup stack is empty.</p></dd>
</dl>
<br>
<h3>Related Information</h3>
<ul>
<li>The &lt;<strong>pthread.h</strong>&gt; header file. See <a href=
"rzah4hed.htm">Header files for Pthread functions</a>.<br><br></li>
<li><a href="users_41.htm">pthread_cleanup_pop()</a>--Pop Cleanup Handler off of
Cancellation Cleanup Stack<br><br></li>
<li><a href="users_42.htm">pthread_cleanup_push()</a>--Push Cleanup Handler onto
Cancellation Cleanup Stack<br><br></li>
<li><a href="users_18.htm">pthread_exit()</a>--Terminate Calling Thread</li>
</ul>
<br>
<h3>Example</h3>
<p>See <a href="../apiref/aboutapis.htm#codedisclaimer">Code disclaimer information</a>
for information pertaining to code examples.</p>
<pre>
#define _MULTI_THREADED
#include &lt;pthread.h&gt;
#include &lt;stdio.h&gt;
#include "check.h"
void cleanupHandler1(void *arg) { printf("In Handler 1\n"); return; }
void cleanupHandler2(void *arg) { printf("In Handler 2\n"); return; }
void cleanupHandler3(void *arg) { printf("In Handler 3\n"); return; }
int args[3] = {0,0,0};
int main(int argc, char **argv)
{
int rc=0;
pthread_cleanup_entry_np_t entry;
printf("Enter Testcase - %s\n", argv[0]);
printf("Check for absence of cleanup handlers\n");
rc = pthread_cleanup_peek_np(&amp;entry);
if (rc != ENOENT) {
printf("pthread_cleanup_peek_np(), expected ENOENT\n");
exit(1);
}
printf("Push some cancellation cleanup handlers\n");
pthread_cleanup_push(cleanupHandler1, &amp;args[0]);
pthread_cleanup_push(cleanupHandler2, &amp;args[1]);
printf("Check for cleanupHandler2\n");
rc = pthread_cleanup_peek_np(&amp;entry);
checkResults("pthread_cleanup_peek_np(2)\n", rc);
if (entry.handler != cleanupHandler2 ||
entry.arg != &amp;args[1]) {
printf("Did not get expected handler(2) information!\n");
exit(1);
}
pthread_cleanup_push(cleanupHandler3, &amp;args[2]);
printf("Check for cleanupHandler3\n");
rc = pthread_cleanup_peek_np(&amp;entry);
checkResults("pthread_cleanup_peek_np(3)\n", rc);
if (entry.handler != cleanupHandler3 ||
entry.arg != &amp;args[2]) {
printf("Did not get expected handler(3) information!\n");
exit(1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
printf("Main completed\n");
return 0;
}
</pre>
<p><strong>Output:</strong></p>
<pre>
Enter Testcase - QP0WTEST/TPCLPP0
Check for absence of cleanup handlers
Push some cancellation cleanup handlers
Check for cleanupHandler2
Check for cleanupHandler3
Main completed
</pre>
<br>
<hr>API introduced: V4R3
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> | <a href=
"rzah4mst.htm">Pthread APIs</a> | <a href="aplist.htm">APIs by
category</a></td>
</tr>
</table>
</center>
</body>
</html>