* [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
@ 2011-07-14 9:56 Daniel Carrera
2011-07-14 10:06 ` Tobias Burnus
0 siblings, 1 reply; 10+ messages in thread
From: Daniel Carrera @ 2011-07-14 9:56 UTC (permalink / raw)
To: gfortran, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 542 bytes --]
This patch adds a caf_runtime_error function to the non-MPI
implementation of Coarray Fortran. It is based on the MPI function of
the same name in mpi.c.
Ok to commit?
ChangeLog:
2011-07-14 Daniel Carrera <dcarrera@gmail.com>
* caf/single.c: Include stdarg.h header.
(caf_runtime_error): New function based on the function in
mpi.c with the same name.
(_gfortran_caf_init): Use caf_runtime_error.
* caf/mpi.c (caf_runtime_error): Add a note to keep in sync
with the function in single.c.
--
I'm not overweight, I'm undertall.
[-- Attachment #2: caf-runtime-error.diff --]
[-- Type: text/x-patch, Size: 2373 bytes --]
Index: libgfortran/caf/single.c
===================================================================
--- libgfortran/caf/single.c (revision 176230)
+++ libgfortran/caf/single.c (working copy)
@@ -28,6 +28,7 @@ see the files COPYING3 and COPYING.RUNTI
#include <stdio.h> /* For fputs and fprintf. */
#include <stdlib.h> /* For exit and malloc. */
#include <string.h> /* For memcpy and memset. */
+#include <stdarg.h> /* For variadic arguments. */
/* Define GFC_CAF_CHECK to enable run-time checking. */
/* #define GFC_CAF_CHECK 1 */
@@ -40,6 +41,21 @@ see the files COPYING3 and COPYING.RUNTI
caf_static_t *caf_static_list = NULL;
+/* Keep in sync with mpi.c. */
+static void
+caf_runtime_error (int error, const char *message, ...)
+{
+ va_list ap;
+ fprintf (stderr, "Fortran runtime error.");
+ va_start (ap, message);
+ fprintf (stderr, message, ap);
+ va_end (ap);
+ fprintf (stderr, "\n");
+
+ /* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
+ exit (error);
+}
+
void
_gfortran_caf_init (int *argc __attribute__ ((unused)),
char ***argv __attribute__ ((unused)),
@@ -73,12 +89,12 @@ _gfortran_caf_register (ptrdiff_t size,
if (unlikely (local == NULL || token == NULL))
{
+ const char msg[] = "Failed to allocate coarray";
if (stat)
{
*stat = 1;
if (errmsg_len > 0)
{
- const char msg[] = "Failed to allocate coarray";
int len = ((int) sizeof (msg) > errmsg_len) ? errmsg_len
: (int) sizeof (msg);
memcpy (errmsg, msg, len);
@@ -88,10 +104,7 @@ _gfortran_caf_register (ptrdiff_t size,
return NULL;
}
else
- {
- fprintf (stderr, "ERROR: Failed to allocate coarray");
- exit (1);
- }
+ caf_runtime_error (1, msg);
}
if (stat)
Index: libgfortran/caf/mpi.c
===================================================================
--- libgfortran/caf/mpi.c (revision 176230)
+++ libgfortran/caf/mpi.c (working copy)
@@ -47,6 +47,7 @@ static int caf_is_finalized;
caf_static_t *caf_static_list = NULL;
+/* Keep in sync with single.c. */
static void
caf_runtime_error (int error, const char *message, ...)
{
@@ -62,7 +63,7 @@ caf_runtime_error (int error, const char
MPI_Abort (MPI_COMM_WORLD, error);
/* Should be unreachable, but to make sure also call exit. */
- exit (2);
+ exit (error);
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 9:56 [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c Daniel Carrera
@ 2011-07-14 10:06 ` Tobias Burnus
2011-07-14 10:31 ` Daniel Carrera
0 siblings, 1 reply; 10+ messages in thread
From: Tobias Burnus @ 2011-07-14 10:06 UTC (permalink / raw)
To: Daniel Carrera; +Cc: gfortran, gcc-patches
On 07/14/2011 11:48 AM, Daniel Carrera wrote:
> This patch adds a caf_runtime_error function to the non-MPI
> implementation of Coarray Fortran. It is based on the MPI function of
> the same name in mpi.c.
>
> Ok to commit?
I was wondering - based on the discussion - whether one should remove
the "int error" argument from caf_runtime_error and simply use "exit
(EXIT_FAILURE)" for all exit() calls in mpi.c/single.c, cf.
http://gcc.gnu.org/ml/fortran/2011-07/msg00140.html
But one can also do so as follow up patch.
Thus, OK for the patch as is - or with replacing all exit(...) by
"exit(EXIT_FAILURE)", which uses stdlib.h's EXIT_FAILURE. One then can
also drop the "int error" argument to the caf_runtime_error function.
Thanks for the patch!
Tobias
> ChangeLog:
>
> 2011-07-14 Daniel Carrera <dcarrera@gmail.com>
>
> * caf/single.c: Include stdarg.h header.
> (caf_runtime_error): New function based on the function in
> mpi.c with the same name.
> (_gfortran_caf_init): Use caf_runtime_error.
> * caf/mpi.c (caf_runtime_error): Add a note to keep in sync
> with the function in single.c.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 10:06 ` Tobias Burnus
@ 2011-07-14 10:31 ` Daniel Carrera
2011-07-14 11:20 ` Tobias Burnus
0 siblings, 1 reply; 10+ messages in thread
From: Daniel Carrera @ 2011-07-14 10:31 UTC (permalink / raw)
To: Tobias Burnus; +Cc: gfortran, gcc-patches
On 07/14/2011 12:04 PM, Tobias Burnus wrote:
> I was wondering - based on the discussion - whether one should remove
> the "int error" argument from caf_runtime_error and simply use "exit
> (EXIT_FAILURE)" for all exit() calls in mpi.c/single.c, cf.
> http://gcc.gnu.org/ml/fortran/2011-07/msg00140.html
> But one can also do so as follow up patch.
You are the boss. The message I got from Nick's post is that it doesn't
matter much and that you could even get surprising behaviour because
EXIT_SUCCESS is not required to be zero and EXIT_FAILURE is not required
to be non-zero. But maybe I missed the point. So it's up to you.
Cheers,
Daniel.
--
I'm not overweight, I'm undertall.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 10:31 ` Daniel Carrera
@ 2011-07-14 11:20 ` Tobias Burnus
[not found] ` <4E1ED584.50303@gmail.com>
0 siblings, 1 reply; 10+ messages in thread
From: Tobias Burnus @ 2011-07-14 11:20 UTC (permalink / raw)
To: Daniel Carrera; +Cc: gfortran, gcc-patches
On 07/14/2011 12:14 PM, Daniel Carrera wrote:
> On 07/14/2011 12:04 PM, Tobias Burnus wrote:
>> I was wondering - based on the discussion - whether one should remove
>> the "int error" argument from caf_runtime_error and simply use "exit
>> (EXIT_FAILURE)" for all exit() calls in mpi.c/single.c, cf.
>> http://gcc.gnu.org/ml/fortran/2011-07/msg00140.html
>> But one can also do so as follow up patch.
>
> You are the boss. The message I got from Nick's post is that it
> doesn't matter much and that you could even get surprising behaviour
> because EXIT_SUCCESS is not required to be zero and EXIT_FAILURE is
> not required to be non-zero. But maybe I missed the point. So it's up
> to you.
Well, for "exit(3)" one knows that one will get a surprising in Windows:
An abort. While EXIT_FAILURE [but also exit(1)] have a very high change
to be working (nearly) everywhere. At the end, as long as the operating
system does not react in a completely odd way, the exit status does not
matter - it's the problem of the caller (e.g. some script) to make use
of the result. If EXIT_FAILURE is 0 and the script assumes that it is a
success, it's either a fault of the script writer, or of the one putting
0 for EXIT_FAILURE into the header, or a fault of the OS designer.
Thus, I think the chance that one avoids surprises is higher with
exit(EXIT_FAILURE) and one avoids having some random number (for the
exit status) in the code. Users usually do not check the exact exit
status value but only its 0- vs non-0-ness.
Hence, I think exit(EXIT_FAILURE) is better than the current version.
Tobias
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
[not found] ` <4E1F0BC4.6030604@net-b.de>
@ 2011-07-14 15:46 ` Daniel Carrera
2011-07-14 16:04 ` Daniel Carrera
0 siblings, 1 reply; 10+ messages in thread
From: Daniel Carrera @ 2011-07-14 15:46 UTC (permalink / raw)
To: Tobias Burnus, gfortran, gcc patches
Hi Tobias,
As per your suggestion, I'm copying to gfotran and gcc-patches. I've
made the change your asked and I'm going to commit the patch.
Cheers,
Daniel.
On 07/14/2011 05:31 PM, Tobias Burnus wrote:
> On 07/14/2011 05:05 PM, Daniel Carrera wrote:
>> +caf_runtime_error (const char *message, ...)
>> +{
>> + va_list ap;
>> + fprintf (stderr, "Fortran runtime error.");
>
> Could you replace "." by ": " (colon, space), I think "Fortran runtime
> error: Could not ..." looks better than "Fortran runtime error.Could not
> ...".
>
> Otherwise, the patch is OK. Could you then send the patch as to fortran@
> and gcc-patches@?
>
> Tobias
>
> PS: You could directly commit the modified patch, simply reply to this
> email, add a CC to fortran@/gcc-patches@ and attach the patch and
> changelog. There is no need that I approve the patch again.
--
I'm not overweight, I'm undertall.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 15:46 ` Daniel Carrera
@ 2011-07-14 16:04 ` Daniel Carrera
2011-07-14 20:11 ` Janne Blomqvist
0 siblings, 1 reply; 10+ messages in thread
From: Daniel Carrera @ 2011-07-14 16:04 UTC (permalink / raw)
To: Tobias Burnus, gfortran, gcc patches
[-- Attachment #1: Type: text/plain, Size: 1622 bytes --]
And of course, here is the patch and ChangeLog.
2011-07-14 Daniel Carrera <dcarrera@gmail.com>
* caf/single.c: Include stdarg.h header.
(caf_runtime_error): New function. Use "exit(EXIT_FAILURE)".
(_gfortran_caf_register): Use caf_runtime_error.
(_gfortran_caf_sync_images): Use "exit(EXIT_FAILURE)".
* caf/mpi.c (caf_runtime_error): Remove "error" parameter.
Return EXIT_FAILURE instead.
(_gfortran_caf_register): Update call to caf_runtime_error.
(_gfortran_caf_sync_all): Ditto.
(_gfortran_caf_sync_images): Ditto.
(_gfortran_caf_error_stop_str): Use "exit(EXIT_FAILURE)".
Now I'm just waiting for SVN update before I commit...
On 07/14/2011 05:34 PM, Daniel Carrera wrote:
> Hi Tobias,
>
> As per your suggestion, I'm copying to gfotran and gcc-patches. I've
> made the change your asked and I'm going to commit the patch.
>
> Cheers,
> Daniel.
>
>
> On 07/14/2011 05:31 PM, Tobias Burnus wrote:
>> On 07/14/2011 05:05 PM, Daniel Carrera wrote:
>>> +caf_runtime_error (const char *message, ...)
>>> +{
>>> + va_list ap;
>>> + fprintf (stderr, "Fortran runtime error.");
>>
>> Could you replace "." by ": " (colon, space), I think "Fortran runtime
>> error: Could not ..." looks better than "Fortran runtime error.Could not
>> ...".
>>
>> Otherwise, the patch is OK. Could you then send the patch as to fortran@
>> and gcc-patches@?
>>
>> Tobias
>>
>> PS: You could directly commit the modified patch, simply reply to this
>> email, add a CC to fortran@/gcc-patches@ and attach the patch and
>> changelog. There is no need that I approve the patch again.
>
>
--
I'm not overweight, I'm undertall.
[-- Attachment #2: caf-runtime-error.diff --]
[-- Type: text/x-patch, Size: 3570 bytes --]
Index: libgfortran/caf/single.c
===================================================================
--- libgfortran/caf/single.c (revision 176230)
+++ libgfortran/caf/single.c (working copy)
@@ -28,6 +28,7 @@ see the files COPYING3 and COPYING.RUNTI
#include <stdio.h> /* For fputs and fprintf. */
#include <stdlib.h> /* For exit and malloc. */
#include <string.h> /* For memcpy and memset. */
+#include <stdarg.h> /* For variadic arguments. */
/* Define GFC_CAF_CHECK to enable run-time checking. */
/* #define GFC_CAF_CHECK 1 */
@@ -40,6 +41,21 @@ see the files COPYING3 and COPYING.RUNTI
caf_static_t *caf_static_list = NULL;
+/* Keep in sync with mpi.c. */
+static void
+caf_runtime_error (const char *message, ...)
+{
+ va_list ap;
+ fprintf (stderr, "Fortran runtime error: ");
+ va_start (ap, message);
+ fprintf (stderr, message, ap);
+ va_end (ap);
+ fprintf (stderr, "\n");
+
+ /* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
+ exit (EXIT_FAILURE);
+}
+
void
_gfortran_caf_init (int *argc __attribute__ ((unused)),
char ***argv __attribute__ ((unused)),
@@ -73,12 +89,12 @@ _gfortran_caf_register (ptrdiff_t size,
if (unlikely (local == NULL || token == NULL))
{
+ const char msg[] = "Failed to allocate coarray";
if (stat)
{
*stat = 1;
if (errmsg_len > 0)
{
- const char msg[] = "Failed to allocate coarray";
int len = ((int) sizeof (msg) > errmsg_len) ? errmsg_len
: (int) sizeof (msg);
memcpy (errmsg, msg, len);
@@ -88,10 +104,7 @@ _gfortran_caf_register (ptrdiff_t size,
return NULL;
}
else
- {
- fprintf (stderr, "ERROR: Failed to allocate coarray");
- exit (1);
- }
+ caf_runtime_error (msg);
}
if (stat)
@@ -140,7 +153,7 @@ _gfortran_caf_sync_images (int count __a
{
fprintf (stderr, "COARRAY ERROR: Invalid image index %d to SYNC "
"IMAGES", images[i]);
- exit (1);
+ exit (EXIT_FAILURE);
}
#endif
Index: libgfortran/caf/mpi.c
===================================================================
--- libgfortran/caf/mpi.c (revision 176230)
+++ libgfortran/caf/mpi.c (working copy)
@@ -47,8 +47,9 @@ static int caf_is_finalized;
caf_static_t *caf_static_list = NULL;
+/* Keep in sync with single.c. */
static void
-caf_runtime_error (int error, const char *message, ...)
+caf_runtime_error (const char *message, ...)
{
va_list ap;
fprintf (stderr, "Fortran runtime error on image %d: ", caf_this_image);
@@ -59,10 +60,10 @@ caf_runtime_error (int error, const char
/* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
/* FIXME: Do some more effort than just MPI_ABORT. */
- MPI_Abort (MPI_COMM_WORLD, error);
+ MPI_Abort (MPI_COMM_WORLD, EXIT_FAILURE);
/* Should be unreachable, but to make sure also call exit. */
- exit (2);
+ exit (EXIT_FAILURE);
}
@@ -179,7 +180,7 @@ error:
}
}
else
- caf_runtime_error (caf_is_finalized ? STAT_STOPPED_IMAGE : 1, msg);
+ caf_runtime_error (msg);
}
return NULL;
@@ -223,7 +224,7 @@ _gfortran_caf_sync_all (int *stat, char
memset (&errmsg[len], ' ', errmsg_len-len);
}
else
- caf_runtime_error (caf_is_finalized ? STAT_STOPPED_IMAGE : ierr, msg);
+ caf_runtime_error (msg);
}
}
@@ -291,7 +292,7 @@ _gfortran_caf_sync_images (int count, in
memset (&errmsg[len], ' ', errmsg_len-len);
}
else
- caf_runtime_error (caf_is_finalized ? STAT_STOPPED_IMAGE : ierr, msg);
+ caf_runtime_error (msg);
}
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 16:04 ` Daniel Carrera
@ 2011-07-14 20:11 ` Janne Blomqvist
2011-07-14 21:14 ` Daniel Carrera
2011-07-14 21:28 ` Tobias Burnus
0 siblings, 2 replies; 10+ messages in thread
From: Janne Blomqvist @ 2011-07-14 20:11 UTC (permalink / raw)
To: Daniel Carrera; +Cc: Tobias Burnus, gfortran, gcc patches
On Thu, Jul 14, 2011 at 18:40, Daniel Carrera <dcarrera@gmail.com> wrote:
> And of course, here is the patch and ChangeLog.
>
> 2011-07-14 Daniel Carrera <dcarrera@gmail.com>
> * caf/mpi.c (caf_runtime_error): Remove "error" parameter.
> Return EXIT_FAILURE instead.
Well, this changelog entry is incorrect; you're calling
exit(EXIT_FAILURE) and not returning a value.
From the patch:
/* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
This is unnecessary, as the call to exit() will call the libgfortran
destructor which will close all units, as explained in comment #3 in
the PR.
--
Janne Blomqvist
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 20:11 ` Janne Blomqvist
@ 2011-07-14 21:14 ` Daniel Carrera
2011-07-14 21:28 ` Tobias Burnus
1 sibling, 0 replies; 10+ messages in thread
From: Daniel Carrera @ 2011-07-14 21:14 UTC (permalink / raw)
To: Janne Blomqvist; +Cc: Tobias Burnus, gfortran, gcc patches
On 07/14/2011 09:48 PM, Janne Blomqvist wrote:
>> 2011-07-14 Daniel Carrera<dcarrera@gmail.com>
>
>> * caf/mpi.c (caf_runtime_error): Remove "error" parameter.
>> Return EXIT_FAILURE instead.
>
> Well, this changelog entry is incorrect; you're calling
> exit(EXIT_FAILURE) and not returning a value.
Ok. What term should I have used? I was thinking that the program itself
returns a value, but I can see that what I wrote was not optimal.
> From the patch:
>
> /* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
>
> This is unnecessary, as the call to exit() will call the libgfortran
> destructor which will close all units, as explained in comment #3 in
> the PR.
Ok. I didn't want to mess with comments that I didn't fully understand.
--
I'm not overweight, I'm undertall.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 20:11 ` Janne Blomqvist
2011-07-14 21:14 ` Daniel Carrera
@ 2011-07-14 21:28 ` Tobias Burnus
2011-07-14 21:44 ` Janne Blomqvist
1 sibling, 1 reply; 10+ messages in thread
From: Tobias Burnus @ 2011-07-14 21:28 UTC (permalink / raw)
To: Janne Blomqvist; +Cc: Daniel Carrera, gfortran, gcc patches
Janne Blomqvist wrote:
> * caf/mpi.c (caf_runtime_error): Remove "error" parameter.
> Return EXIT_FAILURE instead.
> > From the patch:
>
> /* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
>
> This is unnecessary, as the call to exit() will call the libgfortran
> destructor which will close all units, as explained in comment #3 in
> the PR.
While I think it should be sufficient for single-processor usage, I am
not sure that that way all I/O buffers gets written before one calls
MPI_Finalize - nor am I sure how one would handle ERROR STOP with
regards to I/O.
In terms of I/O, there are three kinds of I/O, which might need to be
treated differently:
* I/O to stdout (OUTPUT_UNIT): Here, all output should be collected by
MPI - I am not sure whether it will come to later in a destructor
* I/O to (local) files
* I/O via the communication library: Here, I see the greatest problems,
but that's not in F2008's coarrays, but might well be added with the
Technical Report.
I somehow would feel better if I could ensure that the buffers are
flushed and the files closed before I pull the MPI plug (MPI_Finalize,
MPI_Abort).
For reference, the comment Janne is referring to is the one at the
bottom (comment 3) of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43849
Tobias
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c
2011-07-14 21:28 ` Tobias Burnus
@ 2011-07-14 21:44 ` Janne Blomqvist
0 siblings, 0 replies; 10+ messages in thread
From: Janne Blomqvist @ 2011-07-14 21:44 UTC (permalink / raw)
To: Tobias Burnus; +Cc: Daniel Carrera, gfortran, gcc patches
On Thu, Jul 14, 2011 at 23:34, Tobias Burnus <burnus@net-b.de> wrote:
> Janne Blomqvist wrote:
>>
>> * caf/mpi.c (caf_runtime_error): Remove "error" parameter.
>> Return EXIT_FAILURE instead.
>> > From the patch:
>>
>> /* FIXME: Shutdown the Fortran RTL to flush the buffer. PR 43849. */
>>
>> This is unnecessary, as the call to exit() will call the libgfortran
>> destructor which will close all units, as explained in comment #3 in
>> the PR.
>
> While I think it should be sufficient for single-processor usage, I am not
> sure that that way all I/O buffers gets written before one calls
> MPI_Finalize - nor am I sure how one would handle ERROR STOP with regards to
> I/O.
Ah, I read that comment from caf/single.c, but now I see it in the
caf/mpi.c part of the patch as well. Yeah, in that case it might
matter, depending on how the MPI library implements MPI_Abort(). That
is, does it call exit() (in which case the destructor will be called)
or will it call abort() or raise some other fatal signal.
At least Open MPI seems to implement it by sending SIGTERM
http://www.open-mpi.org/doc/v1.4/man3/MPI_Abort.3.php
Come to think of it, in this case, if you want to use MPI_Abort()
rather than MPI_Finalize() + exit(), you should probably reset the
fatal signal handlers to the default one unless you want the backtrace
to be printed.
--
Janne Blomqvist
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-07-14 21:35 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-14 9:56 [Patch, Fortran] Add caf_runtime_error to libgfortran/caf/single.c Daniel Carrera
2011-07-14 10:06 ` Tobias Burnus
2011-07-14 10:31 ` Daniel Carrera
2011-07-14 11:20 ` Tobias Burnus
[not found] ` <4E1ED584.50303@gmail.com>
[not found] ` <4E1EF7B8.8070303@net-b.de>
[not found] ` <4E1F05A7.7060501@gmail.com>
[not found] ` <4E1F0BC4.6030604@net-b.de>
2011-07-14 15:46 ` Daniel Carrera
2011-07-14 16:04 ` Daniel Carrera
2011-07-14 20:11 ` Janne Blomqvist
2011-07-14 21:14 ` Daniel Carrera
2011-07-14 21:28 ` Tobias Burnus
2011-07-14 21:44 ` Janne Blomqvist
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).